HY-457 - uoc.gr

20
HY-457 Tutorial 1

Transcript of HY-457 - uoc.gr

HY-457Tutorial 1

Assignment 1● In this assignment you will have to implement four simple ciphers● You have to use C and implement them from scratch

● The main purpose of this assignment is to get you familiar with the internals and the process of implementing a cipher

● Also, this assignment will help you get familiar with some implementation tricks and development choices that appear when developing algorithms that seem trivial at first

The ASCII character set

One-Time Pad (OTP)● One-Time Pad (OTP) is a theoretically unbreakable cipher● It requires a pre-shared key of at least the same length as the message● The algorithm XORs each byte of the message with its respective key byte

Message: HelloWorldRand key: randombyteOutput: (H⊕r)(e⊕a)(l⊕n)(l⊕d)(o⊕o)(W⊕m)(o⊕b)(r⊕y)(l⊕t)(d⊕e) =

0x 3A 04 02 08 00 3A 0D 0B 18 01

One-Time Pad (OTP)● The key will be generated using /dev/urandom● You should store the encryption key in order to decrypt the message

● uint8_t * otp_encrypt(uint8_t *plaintext, uint8_t *key);● uint8_t * otp_decrypt(uint8_t *ciphertext, uint8_t *key);

● The messages can only contain digits (0-9) and printable letters (A-Za-z)

● Be careful with non printable ASCII characters!

Caesar’s cipher● One of the simplest and most known encryption techniques● Each character of the input is replaced by the character found N-positions

down the alphabet● In order to decrypt the message, one has to know N

Message: helloN: 4Output: lipps

Caesar’s cipher● uint8_t * caesar_encrypt(uint8_t *plaintext, ushort N);● uint8_t * caesar_decrypt(uint8_t *ciphertext, ushort N);

● The messages can only contain digits (0-9) and printable letters (A-Za-z)

● Be careful with non printable ASCII characters!● Be careful when you reach the end of the character set!

Spartan’s cipher / Scytale● Scytale was a tool used by ancient Spartans in order to encrypt a message● A band is wrapped around a rod of a selected diameter● Then, the message is written on the wrapped band● When the band is unrolled a ciphertext appears● In order to read the message, one has to wrap the band around a rod of the

same diameter

Spartan’s cipher / Scytale● The circumference of the cylinder (number of lines that fit) defines the key● The message has to completely fill the band● If not, the message is padded with extra text to completely fill the band

Message: IamhurtverybadlyhelpOutput: Iryyatbhmvaehedlurlp

● uint8_t * spartan_encrypt(uint8_t *plaintext, ushort circ, ushort len);● uint8_t * spartan_decrypt(uint8_t *ciphertext, ushort circ, ushort len);

● The messages can only contain digits (0-9), printable letters (A-Za-z) and “#” for padding

Vigenère’s cipher● Encrypts a plaintext using a series of interwoven Caesar’s ciphers● Uses a table of alphabets which has the alphabet written out 26 times in

different rows● Each alphabet is shifted cyclically to the left compared to the previous

alphabet

Vigenère’s cipher

Vigenère’s cipher● The alphabet used at each point depends on a keyword, repeated in order to

make a key that matches the size of the plain-text● The first letter of the plaintext is used as a column indicator ● The first letter of the key is used as a row indicator● The first letter of the ciphertext will be the letter at the point where the

selected column meets the selected row

Message: ATTACKATDAWNKey: LEMONLEMONLEOutput: LXFOPVEFRNHR

Vigenère’s cipher● Message: ATTACKATDAWN

Key: LEMONLEMONLEOutput: LXFOPVEFRNHR

Vigenère’s cipher● Message: ATTACKATDAWN

Key: LEMONLEMONLEOutput: LXFOPVEFRNHR

Vigenère’s cipher● Message: ATTACKATDAWN

Key: LEMONLEMONLEOutput: LXFOPVEFRNHR

Vigenère’s cipher● Message: ATTACKATDAWN

Key: LEMONLEMONLEOutput: LXFOPVEFRNHR

Vigenère’s cipher● Message: ATTACKATDAWN

Key: LEMONLEMONLEOutput: LXFOPVEFRNHR

Vigenère’s cipher● Message: ATTACKATDAWN

Key: LEMONLEMONLEOutput: LXFOPVEFRNHR

Vigenère’s cipher● Message: ATTACKATDAWN

Key: LEMONLEMONLEOutput: LXFOPVEFRNHR

Vigenère’s cipher● uint8_t * vigenere_encrypt(uint8_t *plaintext, uint8_t *key);● uint8_t * vigenere_decrypt(uint8_t *ciphertext, uint8_t *key);

● The character set contains only uppercase ASCII characters (A-Z)● They keyphrase will be expanded to match the plaintext or ciphertext