Stream Cipher
A stream cipher is a symmetric key cipher where plaintext digits are combined with a pseudorandom cipher digit stream. In a stream cipher, each plaintext digit is encrypted one at a time with the corresponding digit of the key stream, to give a digit of the cipher text stream.
One time pad
In Cryptography, one time pad is an encryption technique that cannot be cracked, but requires the use of onetime preshared key the same size as the message being sent. For OTP, encryption and decryption is defined as:


The one time pad is the only example of perfect secrecy, in this technique, brute force is pointless. Here is an example of how to solve a one time pad encryption:


At first, we know that the message “attack at dawn” convert to “09e1c5f70a65ac519458e7e53f36”, so we assign “attack at dawn” to m1, and “09e1c5f70a65ac519458e7e53f36” to c1. Because c1 is the encrypted result of m1, so


In this problem, m2 = “attack at dawn”, and we know:


So we can get the the OPT key of message “attack at dusk”. To implement it with the python code is:


However, it lacks in portabilitythe key is the same size as the message and convenience you must never reuse the key. Modern stream ciphers attempt to approximate the onetime pad with a pseudorandom key stream, in OTP with a pseudorandom key, which is smaller than M.
Block cipher
Block ciphers use a key to encrypt a fixedsize block of plaintext into a fixedsize block of ciphertext. They are usually more computationally expensive than stream ciphers, but have numerous benefits.
Claude Shannon suggested that all that was required for a strong cipher was repeated substation and permutation. SPNetworks combine a substitution process with a permutation into a single round.
 Substitution Boxes: Add confusion by replacing value with other values using a lookup table.
 Permutation Boxes: Add diffusion by moving values around from input to output.