Proj 8: ECB v. CBC Modes with Python (15 pts.)

What you need:

Purpose

To use AES in Electronic Code Book (ECB) mode, see it fail to remove patterns from an image, and demonstrate that Cipher Block Chaining (CBC) is better.

Download Image

Right-click the penguin image on the right side of this page and save it somewhere you can find it, such as in your Downloads folder.

The image is named "tux.bmp" and I got it from Wikipedia.

Opening Python

Open a Terminal or Command Prompt window and execute these commands:
cd Downloads
python
Python should open in Immediate Mode, as shown below. If it does not, you need to install or repair Python--see the instructions at the top of this page.

Encrypting the Image in ECB Mode

Execute these commands to import the AES functions and create a new "cipher" object. The encryption mode is not specified, so it defaults to ECB.
from Crypto.Cipher import AES
key = "aaaabbbbccccdddd"
cipher = AES.new(key)

Execute these commands to read the "tux.png" binary file into a variable named "clear". After the second line, press Enter twice.

with open("tux.bmp", "rb") as f:
  clear = f.read()
  

Execute this command to encrypt the data in "clear".

ciphertext = cipher.encrypt(clear)
An error message appears, saying the input data must be a multiple of 16 bytes, as shown below.

Execute these commands to see the length of the "clear" data, and the length modulus 16.

len(clear)
len(clear)%16
As shown below, the length mod 16 is 2.

Execute this command to trim a section of "clear" out, skipping the first 64 bytes (the image file header), and the last 2 bytes, saving the result in a variable named "clear_trimmed".

clear_trimmed = clear[64:-2]

Execute these commands to see the length of the "clear_trimmed" data, and the length modulus 16.

len(clear_trimmed)
len(clear_trimmed)%16
As shown below, the length mod 16 is 0. It's now a multiple of 16 bytes long.

Execute this command to encrypt the data in "clear_trimmed", and put it in a variable named "ciphertext".

ciphertext = cipher.encrypt(clear_trimmed)

Execute these commands to add the first 64 bytes and the last 2 bytes to "ciphertext", and write it to a file named "tux_ecb.bmp".

After the third line, press Enter twice.

ciphertext = clear[0:64] + ciphertext + clear[-2:]
with open("tux_ecb.bmp", "w") as f:
  f.write(ciphertext)
  

Viewing the Encrypted File

In a file browser, navigate to your Downloads folder and double-click the "tux_ecb.bmp" file, as shown below.

The encrypted file still shows a lot of information about the image, as shown below.

Saving a Screen Image

Save a whole-desktop image showing the encrypted Tux file, as shown above.

YOU MUST SUBMIT A FULL-SCREEN IMAGE FOR FULL CREDIT!

Save the document with the filename "YOUR NAME Proj 8a", replacing "YOUR NAME" with your real name.

Encrypting the Image in CBC Mode

Execute these commands to create a new "cipher" object in CBC mode.

CBC mode requires an additional "iv" parameter, as shown below.

iv = "0000111122223333"
cipher = AES.new(key, AES.MODE_CBC, iv)

Execute this command to encrypt the data in "clear_trimmed", and put it in a variable named "ciphertext".

ciphertext = cipher.encrypt(clear_trimmed)

Execute these commands to add the first 64 bytes and the last 2 bytes to "ciphertext", and write it to a file named "tux_cbc.bmp".

After the third line, press Enter twice.

ciphertext = clear[0:64] + ciphertext + clear[-2:]
with open("tux_cbc.bmp", "w") as f:
  f.write(ciphertext)
  

Viewing the Encrypted File

In a file browser, navigate to your Downloads folder and double-click the "tux_cbc.bmp" file, as shown below.

The encrypted file is now random pixels, as shown below.

Saving a Screen Image

Save a whole-desktop image showing the encrypted Tux file, as shown above.

YOU MUST SUBMIT A FULL-SCREEN IMAGE FOR FULL CREDIT!

Save the document with the filename "YOUR NAME Proj 8b", replacing "YOUR NAME" with your real name.


Turning in your Project

Email the images to cnit.141@gmail.com with the subject line: Proj 8 from YOUR NAME.
Posted 9-17-17 by Sam Bowne
Revised 10-16-17