EE8084: Cyber Security
Group No : T55
Deadline : Fri Apr 9, 16:30
Topic : AES Encryption
Group leader Matric Contact Section
number number
Reinardus Surya U0920088C 83612737 - Demo
Pradhitya - Conclusion
Group members
William Kho U0920176B 98942848 - Intro
- Theory
- Conclusion
Ryan William U0920207D 93902571 - Abstract
- Theory
- Conclusion
Ezra Andhika U0920827A 85088927 - Source
Code
- Conclusion
Julianto Johannes U0920114J 92956791 - Theory
- Conclusion
Word Count: 2637 (max 3000 words,
excluding Title Page and References)
Abstract
This report is about the AES Encryption which we mainly use password to encrypt
texts, images, or other types of data which can be decrypted back by using the original
encryption key.
In this report, there will be a brief definition about what is an AES Encryption and
the process of making it, they are all summarized in the ‘Literature Review’ section.
In addition, on the ‘Result and Discussion’ section, we will thoroughly explain about
the AES encryption process step by step through a demo program to encrypt data using C++
language. We will provide printed screens of the process and explanations of each step.
1. Introduction
Encryption is a process where information is manipulated using cipher algorithm so that
the encrypted message can only be understood by those with the encryption key.
Advanced Encryption Standard (AES) is 128-bit block size encryption standard with 128,
192 and 256 bits key sizes respectively. These large key lengths make forced attempts to
crack the encrypted message infeasible.
2. Literature Review
1. Definition of Advanced Encryption Standard
Advanced Encryption Standard/AES is a type of encryption that is already standardized that
is mainly used for encrypting texts which can be decrypted with the original encryption key.
Advanced Encryption Standard (AES) was invented and declared for the first time by
National Institute of Standards Technology (NIST).
This invention was based on the Rijndael algorithm and was evaluated and selected after a 5
year standardization process from a design competition. The Rijndael cipher which is the
process of making the encrypted text, was first developed by the Belgians cryptographer.
The algorithm specified in this topic which follows the standard will be pointed as “AES
algorithm”. There are three different key lengths of cipher algorithm that can be used, they
are the AES-256, AES-192 and AES-128.
1.1. Input and Output of AES Encryption Algorithm
In the AES algorithm, the file that is input to the program will be encrypted into several
lengths/sequences (128,192,256 bits). These bits of data refer to the length of the output after
the encryption process. Output other than those three values are not permitted as they do not
follow the standard.
Starting at 0, the bits of the sequences will be attached and it is going to end one step before
the sequence length. Based on the block length and key length, number i will be marked to a
bit which is known as its index, it ranges from 0 ≤ i < 128, 0 ≤ i < 192 or 0 ≤ i < 256.
1.2. Bytes
There is also a term called Bytes which is an order of eight bits medicated as a single entity.
AES algorithm uses bytes as its basic processing unit. By dividing the input, output, and key
sequences into group of eight bits, they can be processed as array of bytes.
At the input and output or cipher key marked by a, the bytes in the array resulted will be
referenced by using an or a[n] where n is one of these ranges:
For key length of 128 bits, 0 ≤ n < 16;
For key length of 192 bits, 0 ≤ n < 24;
For key length of 256 bits, 0 ≤ n < 32.
2. Cipher process
There are several steps used in the encryption algorithm. It is divided into four main steps
which are: key expansion, initial round, rounds, and final round.
AES implements on a 4x4 array of bytes which is known as the state. The overall process of
encrypting in Advanced Encryption Standard is divided into steps below:
2.1. Key Expansion:
This step is as preparation for the main cipher steps. In this step, key schedule is made from
expanding the key or password using a series of word substitution with a constant
Substitution Box (SBOX), rotation of cells, and xor-ing. The example is as following
Step 1: Initialize with password
Step 2: Rotation
Step 3: Substitution
Step 3: xor-ing
*The grey box is from Rijndael’s constant field RCON
Step 4: For any part which is not multiple of four, just xor it
2.2. Chipering
It consists of three parts. Initial Round, Rounds,
and Final Round. The sequence of this step is
as following:
Definition of each part and functions:
Initial
AddRoundKey: Using bitwise xor to integrate every byte of the state with the round key.
The state will be integrated with the sub key in this step. In every round, Rijndael’s key
schedule is used to show a sub key from the main key, with every sub key within the same
size acting as the state. By integrating every byte of the state with the corresponding byte of
the sub key by applying bitwise XOR, the sub key is added.
Rounds
The number of rounds is 10/12/14 for (128/192/256) bit encryption
SubBytes:
Every byte in the state will be substituted with its entry in a fixed 8-bit lookup table in this
step. By applying an 8-bit substitution box, the Rijndael S-box, every byte in the array will be
updated.The S-box is used to make the cipher non linear.
ShiftRows:
Each byte in every row of the state will be shifted to the left in different offsets for every row
in this step. In AES, the first row will be left unchanged while every byte in the second row
will be shifted one to the left.Then, the third and fourth rows will be shifted by offsets of two
and three respectively.
MixColumns:
In this step, invertible linear transformation will be used to integrate each of the four bytes in
every column of the state. The function will input and output in four bytes where every input
byte will affect all for output bytes. Every column will also be multiplied by a known matrix
in this operation. For example:
The multiplication operation is defined as: multiplication by 1 means leaving unchanged,
multiplication by 2 means shifting byte to the left and multiplication by 3 means shifting to
the left and then performing xor with the initial unshifted value.
Together with ShiftRows step, MixColumns provides diffusion in the cipher.
Final Round
In this round, the SubBytes, ShiftRows, and AddRoundKey process is repeated without
undergoing the MixColumns
3. Cipher modes of operation
There are actually couples of methods that can be used to code the encryption program, they
are :
Electronic Code Book (ECB)
In this method, the original message (the plaintext) is divided into several blocks. The blocks
are then encrypted separately. Each identical plaintext block will be encrypted into an
identical cipher block which makes this method is not secure enough to be used.
Cipher Block Chaining
In this method, every plaintext block will be XOR-ed with an initialization vector for the first
step which then in the next step will be XOR-ed with the previous cipher text block before
being encrypted. This method is secure enough because each cipher text block depends on all
previous plaintext blocks processed.
Propagating Cipher Block Chaining
This method is created to cause minor changes in the cipher text to spread indefinitely when
decrypting or encrypting. In this method, every plaintext block will be XOR-ed with its
cipher text after encryption. The resultant is then used to XOR the next plaintext block before
being encrypted.
Cipher Feedback
The first step of this method is an initialization vector will be encrypted which then will be
XOR-ed by the first plaintext block to result to a cipher text block. Each of the cipher text
will then be encrypted and XOR-ed by the plaintext block.
Output Feedback
From this method, a synchronous stream cipher will be created from a block cipher. This
method produces key stream blocks, which will then be XOR-ed by the plaintext blocks to
result to the cipher text. If a bit is flipped in the cipher text, it will lead to a flipped bit in the
plaintext at the same place. Thus, a lot of error correcting codes will function normally even
when applied before encryption.
Counter
This method will create a stream cipher from a block cipher. This method will encrypt
successive values of a “counter” to produce the next key stream block. “Counter” means any
function which generates a sequence which will not repeat for a long time, although the
simplest and the most renowned one is an actual counter.
*The ‘Counter’ method is the method implemented in the making of the encryption program
in this report.
3. Result and Discussion Demo
1. The software and environment
For demo on the topic: “Advanced Encryption Standard”, we create a program that operates
AES. This program is “text-file AES encrypter/decrypter”. Actually this program also works
on any other file (although we didn’t do many further research on that)
The source code:
- C++ program aes_final.cpp
- 321 lines (including last blank line, some comments, and blank lines between
functions) with size of 10706 bytes
- Coding environment is Notepad++ v5.6.4, open source
The compiler:
- .cpp compiler: G++ v3.4.2
- using command line: g++ -o aes aes_final.cpp
- producing binary file aes.exe with size of 557313 bytes
2. Readme
To use the program:
1. Double click aes.exe. A terminal window will show up
2. If you want to encrypt, type 1 and press enter
3. Place the file you want to encrypt on the same directory as aes.exe. For example,
the name is file.txt
4. Back to the terminal, type the name of the file, and then press enter
5. Input the password you want to use to encrypt this file (the password will be
necessary to decrypt the file), and then press enter. For example, the password is:
a_BIG_53cr37
6. The program will write the encrypted text in binary mode into a new text file with
the same name but with additional prefix: enc_. So in this example, the file is
enc_file.txt. Try opening it to see what happen
7. Back to the menu, to decrypt, type 2 and press enter
8. Place the file you want to decrypt on the same directory as aes.exe. So in this
example, it is the enc_file.txt. Type the name of the file and press enter
9. Input the password that has been used to encrypt this file. In this example, it is:
a_BIG_53cr37
10. The program will write the encrypted text in binary mode into a new text file with
the same name but with additional prefix: dec_. So in this example the file is
dec_file.txt. Try opening it to see what happen
3. Methodology and Design
The methodology of this software is procedural / modular programming. This program has
functions, each of which is responsible for a specific job. The design of functions are as
follow:
1. First group of functions is responsible for creating a key schedule. There are
KeyExpansion(), RotWord(), SubWord(), SubBytes(), ShiftRows(),
MixColumns(), AddRoundKey(), Cipher() in this group.
2. Second group of functions is responsible for accepting plaintext and converting it
into ciphertext (encrypting) or vice versa (decrypting). There are function
encrypt() and decrypt() in this group
3. Third group of functions is the main program, which interacts with user’s input.
There are menu() and main() in this group
4. Algorithm
We will divide the explanation on algorithm in pseudocode into three important parts,
KeyExpansion(), Cipher(), and Encrypt/Decrypt
A. KeyExpansion()
---PSEUDOCODE---
Let SBOX[] be (5)
{0x63,0x7c,0x77,0x7b,0xf2,0x6b,0x6f,0xc5,0x30,0x01,0x67,0x2b,0xfe,0xd7,0xab,0x76,
0xca,0x82,0xc9,0x7d,0xfa,0x59,0x47,0xf0,0xad,0xd4,0xa2,0xaf,0x9c,0xa4,0x72,0xc0,
0xb7,0xfd,0x93,0x26,0x36,0x3f,0xf7,0xcc,0x34,0xa5,0xe5,0xf1,0x71,0xd8,0x31,0x15,
0x04,0xc7,0x23,0xc3,0x18,0x96,0x05,0x9a,0x07,0x12,0x80,0xe2,0xeb,0x27,0xb2,0x75,
0x09,0x83,0x2c,0x1a,0x1b,0x6e,0x5a,0xa0,0x52,0x3b,0xd6,0xb3,0x29,0xe3,0x2f,0x84,
0x53,0xd1,0x00,0xed,0x20,0xfc,0xb1,0x5b,0x6a,0xcb,0xbe,0x39,0x4a,0x4c,0x58,0xcf,
0xd0,0xef,0xaa,0xfb,0x43,0x4d,0x33,0x85,0x45,0xf9,0x02,0x7f,0x50,0x3c,0x9f,0xa8,
0x51,0xa3,0x40,0x8f,0x92,0x9d,0x38,0xf5,0xbc,0xb6,0xda,0x21,0x10,0xff,0xf3,0xd2,
0xcd,0x0c,0x13,0xec,0x5f,0x97,0x44,0x17,0xc4,0xa7,0x7e,0x3d,0x64,0x5d,0x19,0x73,
0x60,0x81,0x4f,0xdc,0x22,0x2a,0x90,0x88,0x46,0xee,0xb8,0x14,0xde,0x5e,0x0b,0xdb,
0xe0,0x32,0x3a,0x0a,0x49,0x06,0x24,0x5c,0xc2,0xd3,0xac,0x62,0x91,0x95,0xe4,0x79,
0xe7,0xc8,0x37,0x6d,0x8d,0xd5,0x4e,0xa9,0x6c,0x56,0xf4,0xea,0x65,0x7a,0xae,0x08,
0xba,0x78,0x25,0x2e,0x1c,0xa6,0xb4,0xc6,0xe8,0xdd,0x74,0x1f,0x4b,0xbd,0x8b,0x8a,
0x70,0x3e,0xb5,0x66,0x48,0x03,0xf6,0x0e,0x61,0x35,0x57,0xb9,0x86,0xc1,0x1d,0x9e,
0xe1,0xf8,0x98,0x11,0x69,0xd9,0x8e,0x94,0x9b,0x1e,0x87,0xe9,0xce,0x55,0x28,0xdf,
0x8c,0xa1,0x89,0x0d,0xbf,0xe6,0x42,0x68,0x41,0x99,0x2d,0x0f,0xb0,0x54,0xbb,0x16};
Let RCON[][] be (6)
{{0x00, 0x00, 0x00, 0x00},
{0x01, 0x00, 0x00, 0x00},
{0x02, 0x00, 0x00, 0x00},
{0x04, 0x00, 0x00, 0x00},
{0x08, 0x00, 0x00, 0x00},
{0x10, 0x00, 0x00, 0x00},
{0x20, 0x00, 0x00, 0x00},
{0x40, 0x00, 0x00, 0x00},
{0x80, 0x00, 0x00, 0x00},
{0x1b, 0x00, 0x00, 0x00},
{0x36, 0x00, 0x00, 0x00} };
function KeyExpansion(KEY) {
Let W be an array with size [60][4]
Fill the first 32 bit (8 rows, 0~7) of W with KEY (1)
To fill the other rows, iterate FOR 8<=I<60 (2)
Let TEMP = w[i-1]
IF I is multiple of 8
do SubWord after RotWord to TEMP
TEMP = TEMP xor W[i/8]
END IF
ELSE IF I is multiple of 4 but not multiple of 8
do SubWord to TEMP
END IF
W[i]=w[i-8] xor TEMP
END FOR
return W
}
function SubWord(W) {
Substitute every element of W with value in corresponding index of SBOX (3)
return W
}
function RotWord(W) {
Circular-shift W to the left once (4)
return W
}
B. Cipher()
---PSEUDOCODE---
function Cipher(INPUT, W) {
Let STATE be an array with size [4][4]
FOR 0<ROUND<14 because it is 256-bit cipher (1)
do SubBytes to STATE
do ShiftRows to STATE
do MixColumns to STATE
STATE=AddRoundKey(STATE,W,ROUND,4)
END FOR
do SubBytes to state
do ShiftRows to state
STATE=AddRoundKey(STATE,W,14,4)
return STATE in form of one dimensional array (2)
}
function SubBytes(S, NB) {
Substitute every element of S with value in corresponding index of SBOX (3)
}
function ShiftRows(S, int NB) {
//S is two-dimensional
FOR each row 0<=R<4 (4)
Circular-shift S to the left (R % 4) times
END FOR
return S
}
function MixColumns(S, Nb) {
Modify columns using Rijndael finite field gf(2^8) (5)
return S
}
function AddRoundKey(STATE, W, RND, NB) {
xor STATE with W (6)
return STATE
}
C. Encrypt() / Decrypt()
---PSEUDOCODE---
function encrypt(PLAINTEXT, PASSWORD, NBITS) {
Let BLOCKSIZE be 16
Let NBYTES be 32
Let KEY be password
Let COUNTERBLOCK be an array with size [16]
Set the first 8 bytes of COUNTERBLOCK with random number (1)
Set the last 8 bytes of COUNTERBLOCK with 0, as a counter
Let CTRTXT be the first 8 bytes of COUNTERBLOCK
Create KEYSCHEDULE with KeyExpansion(KEY) (2)
Divide PLAINTEXT into BLOCKCOUNT parts of size BLOCKSIZE
Concatenate the random number CTRTXT to the front of CIPHERTEXT (3)
Process all parts B, FOR 0<=B<BLOCKCOUNT (4)
Increase the last 8 bit of COUNTERBLOCK. Starting is 00000000
Create CIPHERCNTR=Cipher(COUNTERBLOCK,KEYSCHEDULE)
CIPHERTEXT += CIPHERCNTR xor PLAINTEXT[B*BLOCKSIZE]
END FOR
return CIPHERTEXT in form of one dimensional array (5)
}
function decrypt(CIPHERTEXT, PASSWORD, NBITS) {
Let BLOCKSIZE be 16
Let NBYTES be 32
Let KEY be PASSWORD
Let COUNTERBLOCK be an array with size [16]
Set the first 8 bytes of COUNTERBLOCK with the first 8 bytes of CIPHERTEXT (6)
Set the last 8 bytes of COUNTERBLOCK with 0, as a counter
Let CTRTXT be the first 8 bytes of CIPHERTEXT
Create KEYSCHEDULE with KeyExpansion(KEY) (7)
Divide PLAINTEXT less the first 8 bytes into BLOCKCOUNT parts of size BLOCKSIZE
Let CT be an array containing all parts of divided PLAINTEXT (8)
Process all parts B, FOR 0<=B<BLOCKCOUNT (9)
Increase the last 8 bit of COUNTERBLOCK. Starting is 00000000
Create CIPHERCNTR=Cipher(COUNTERBLOCK,KEYSCHEDULE)
PLAINTEXT += CIPHERCNTR xor CT[B]
END FOR
return PLAINTEXT in form of one dimensional array (10)
}
*Points to note:
- This program can encrypt/decrypt any files
- This program uses 256-bit cipher
- This program uses counter-method
- The time complexity of this program is linear to the number of characters in the
input file
- This program includes error handling in bad input file, and bad user’s input
4. CONCLUSIONS AND RECOMMENDATIONS
Advanced Encryption Standard is widely used as a encryption standard in ciphering. The
ciphering is useful to modify information into a form that can only be understood using a key
to decipher it.
The Advanced Encryption Standard is the most recent standard of encryption to date. It is
being used in a large variety of sectors including national security, education, and banking. In
the future, it may be used in a broader area, such as encrypting personal information or
confidential information exchange such as emails, bank account information, and passwords.
This demo has succesfully shown the process of encypting and decrypting using the
Advanced Encryption Standard. It has shown how an information is transformed into
encrypted data and how to decrypt it back to a coherent information.
Reference
F.S. Tsai and C.K. Chan (Eds), Cyber Security, Pearson Education, 2006
http://en.wikipedia.org/wiki/Advanced_Encryption_Standard
http://csrc.nist.gov/publications/fips/fips197/fips-197.pdf
Veness, Chris, http://www.movable-type.co.uk/scripts/aes.html, October 2009
Styer, Eugene, http://people.eku.edu/styere/index.html, 27 October 2006
Carvalho, Jaqueline Lima Soares, and Vanessa Ferreira Tornich de Freitas
http://blog.ultrassecreto.com/wp-content/uploads/2009/06/projetofinal.html