CS 241 Data Organization Ciphers March 22, 2018
Cipher • In cryptography, a cipher (or cypher) is an algorithm for performing encryption or decryption. • When using a cipher, the original information is known as plaintext , and the encrypted form as ciphertext . • The encrypting procedure of the cipher usually depends on a piece of auxiliary information, called a key . • A key must be selected before using a cipher to encrypt a message. • Without knowledge of the key, it should be difficult, if not nearly impossible, to decrypt the resulting ciphertext into readable plaintext.
Substitution Cipher • In cryptography, a substitution cipher is a method of encryption by which units of plaintext are replaced with ciphertext according to a regular system. • Example: case insensitive substitution cipher using a shifted alphabet with keyword ”zebras”: • Plaintext alphabet: ABCDEFGHIJKLMNOPQRSTUVWXYZ • Ciphertext alphabet: ZEBRASCDFGHIJKLMNOPQTUVWXY flee at once. we are discovered! Enciphers to SIAA ZQ LKBA. VA ZOA RFPBLUAOAR!
Other substitution ciphers Caesar cipher Shift alphabet by fixed amount. (Caesar apparently used 3.) ROT13 Replace letters with those 13 away. Used to hide spoilers on newsgroups. pigpen cipher Replace letters with symbols.
Substitution Cipher: Encipher Example OENp(ENTE#X@EN#zNp(ENCL]pEnN7p-pE;8N]LN} dnEdNp#Nz#duN-Nu#dENXEdzE9pNCL]#L8NE;p-b @];(N0G;p]9E8N]L;GdENn#uE;p]9Nld-L/G]@]p _8NXd#|]nENz#dNp(EN9#uu#LNnEzEL;E8NXd#u# pENp(ENQELEd-@NOE@z-dE8N-LnN;E9GdENp(EN^ @E;;]LQ;N#zN<]bEdp_Np#N#Gd;E@|E;N-LnN#Gd NT#;pEd]p_8Nn#N#dn-]LN-LnNE;p-b@];(Np(]; N5#L;p]pGp]#LNz#dNp(ENCL]pEnN7p-pE;N#zN) uEd]9-D
Breaking a Substitution Cipher In English, • The most common character is the space : “ ”. • Letters in order of frequency are: ETAONRISHDLFCMUGYPWBVKXJQZ • Letter pairs in order of frequency are: TH HE AN RE ER IN ON AT ND ST ES EN OF TE ED OR TI HI AS TO • Doubled letters in order of frequency are: LL EE SS OO TT FF RR NN PP CC MM
Substitution Cipher: plaintext & Map We the People of the United States, in Order to form a =51 more perfect Union, establish Justice, insure domestic e=39 Tranquility, provide for the common defense, promote t=28 the general Welfare, and secure the Blessings of Liberty o=24 to ourselves and our Posterity, do ordain and establish this Constitution for the United States of America. [ N] [!%] ["Z] [#1] [$f] [%=] [&r] [’I] [( ] [)U] [*,] [+a] [,8] [-m] [.D] [/y] [0P] [1’] [2\] [33] [4h] [5?] [6t] [7K] [8"] [9W] [:.] [;c] [<:] [=o] [>F] [?{] [@R] [A)] [B^] [C5] [Dj] [EA] [Fv] [GM] [H$] [IY] [J0] [Ke] [L<] [Mq] [NH] [O}] [PT] [Q+] [R‘] [S7] [Tl] [UC] [Vx] [WO] [X&] [Y[] [Z2] [[g] [\>] []s] [^J] [_!] [‘V] [a-] [bb] [c9] [dn] [eE] [fz] [gQ] [h(] [i]] [j4] [ki] [l@] [mu] [nL] [o#] [pX] [q/] [rd] [s;] [tp] [uG] [v|] [wS] [x*] [y_] [z6] [{k] [|B] [}w]
Substitution Map Generator: Globals #include <stdio.h> #define ASCII_START 32 #define ASCII_END 126 #define MAP_SIZE 94 char map[MAP_SIZE ]; • Program that creates a substitution map based on the first letter of the plaintext message. • The program creates a one-to-one map of all printable ASCII characters.
Substitution Map Generator: buildMap void buildMap(char seed) • seed: first number in the { int i; pseudo-random sequence. int m=94; int a=189; • m, a, c: constants chosen to int c=53; give pseudo-random int n=seed; behaviour. for (i=0; i<MAP_SIZE; i++) • for loop body: generates a { pseudo-random number n = (a*n + c) % m; between 0 and m, maps map[i] = n+ASCII_START; } character i+ASCII_START to } n+ASCII_START
Substitution Map Generator: printMap void printMap(void) { int i; for (i=0; i<MAP_SIZE; i++) { printf("[%c%c] ", i+ASCII_START , map[i]); if ((i % 16) == 15) printf("\n"); } printf("\n"); }
Substitution Map Generator: main void main(void) { char c=getchar (); buildMap(c); printMap (); int i = 0; while (c!= EOF) { if (c < ASCII_START) break; if (c > ASCII_END) break; if (i % 40 == 0) printf("\n"); printf("%c", map[c-ASCII_START ]); c=getchar (); i++; } printf("\n"); }
Book Cipher A book cipher is a cipher in which the key is some aspect of a book or other piece of text. A message is typically encoded by three numbers for each letter: • Page • Line • Word Where the encoded letter is the first letter of the specified word. It is typically essential that both correspondents not only have the same book, but the same edition.
One-time pad • Random key (or “pad”) is at least as long as the text. • Add plaintext to key (modulo 26) to encrypt. • Subtract key from ciphertext to decrypt. • Destroy the key after use. • Problems: • Truly random key is hard to produce • How to exchange the key securely? • Never ever use the key again. • Modern stream ciphers mimic the one-time pad.
Modern Cipher Categories Stream Ciphers Applied to a continuous stream of symbols. Algorithms applied to small blocks (1 to 16 bytes) are often still called stream ciphers. Block Ciphers Applied to blocks of symbols. Symmetric Key Algorithms The same key is used for both encryption and decryption. For example: RC4 (used in Secure Sockets Layer (SSL) ). Asymmetric Key Algorithms A different key is used for both encryption and decryption. For example: RSA which uses public / private key pairs.
RSA: Key Generation 1. Choose two distinct prime numbers p and q . The primes should be chosen uniformly at random and should be of similar bit-length. 2. Compute the divisor, n = pq , to be used in the modulus operation. 3. Compute φ ( pq ) = ( p − 1)( q − 1). The totient, φ , of a positive integer n is defined to be the number of positive integers less than or equal to n that are coprime to n . 4. Choose an integer e such that 1 < e < φ ( pq ), and e and φ ( pq ) are coprime. 5. Find d : ( ed − 1) can be evenly divided by φ ( p − 1)( q − 1). 6. The public key consists of the modulus n and e . 7. The private key consists of the modulus n and d .
Linear Congruential Generator (LCG) A Linear Congruential Generator is one of the oldest and best known pseudorandom number generator algorithms: X n +1 = ( aX n + c ) mod m where X n is the sequence of pseudorandom values, and • Modulus: m , 0 < m • Multiplier: a , 0 < a < m • Increment: c , 0 ≤ c < m • Seed: X 0 , 0 ≤ X 0 < m
LCG example Example: X n +1 = (7 X n + 11) mod 18 , X 0 = 0 . X 1 = (7(0) + 11) mod 18 = 11 X 2 = (7(11) + 11) mod 18 = 16 X 3 = (7(16) + 11) mod 18 = 15 X 4 = (7(15) + 11) mod 18 = 8
LCG with Pseudorandom Behavior X n +1 = ( aX n + c ) mod m • All of the values, a , c , m , and X n used in an LCG are integers. • The sequence of integers in an LCG can never have a period greater than m . Why? • Some values of the modulus, multiplier and increment yield a sequence with maximum period and with good pseudorandom behavior.
LCG with Pseudorandom Behavior An LCG will have a full period if and only if: • c and m are coprime (have no common factor > 1) • a − 1 is divisible by all prime factors of m , • a − 1 is a multiple of 4 if m is a multiple of 4.
LCGs in Common Use Source m a c 2 32 Numerical Recipes 1664525 1013904223 2 32 Borland C/C++ 22695477 1 2 31 glibc (used by GCC) 1103515245 12345 2 31 ANSI C: Watcom, Digital 1103515245 12345 Mars, CodeWarrior, IBM Visu- alAge C/C++ 2 32 Borland Delphi, Virtual Pascal 134775813 1 2 32 Microsoft Visual/Quick 214013 (343 FD 16 ) 2531011 (269 EC 3 16 ) C/C++ 2 24 Microsoft Visual Basic (6 and 1140671485 12820163 earlier) (43 FD 43 FD 16 ) ( C 39 EC 3 16 ) 2 31 − 1 RtlUniform from Native API 2147483629 2147483587 (7 FFFFFED 16 ) (7 FFFFFC 3 16 ) 2 31 − 1 Apple CarbonLib 16807 0 2 64 MMIX by Donald Knuth 6364136223846793005 1442695040888963407 2 64 Newlib 6364136223846793005 1 2 32 VAX’s MTH$RANDOM, old 69069 1 versions of glibc 2 48 Java’s java.util.Random 25214903917 11 2 32 − 5 2 32 − 333333333 LC53 in Forth 0 Note: LCG’s do not always return all of the bits in the values they produce. Example: Java produces 48 bits, but only returns the 32 most significant. table from http://en.wikipedia.org/wiki/Linear_congruential_generator
Linear Congruential Generator in C #include <stdio.h> void main (void) 136235578099065 { unsigned long m = 1 << 31; 15519887047211639486 unsigned long a = 1103515245; 13838650204930187039 3346717808905085548 unsigned long c = 12345; 3049859088482533429 unsigned long x = 123456; 7398829542172257482 15952872801263783483 int i; 9897407542008592728 12436645181455133361 for (i=1; i <=100; i++) 8967167257519066006 { 15551416184959193879 x = (a*x + c) % m; 14392011937321128708 printf("%20lu\n", x); 7012146815830884589 837494824685357858 } 9089108537697995187 } 4486637365379619696 10706175307392302825 3333036225721595758 15798734497693109775 1184521088365346460 762097951296315557
Toy Linear Congruential Generator 0 1 #include <stdio.h> 8 void main (void) 3 { int m = 18; 4 int a = 7; 11 int c = 1; 6 int x = 0; 7 14 int i; 9 for (i=1; i <=28; i++) 10 { 17 printf("%4d\n", x); 12 x = (a*x + c) % m; 13 } 2 } 15 16 5 0
Recommend
More recommend