The Rijndael Block Cipher

Similar documents
Cristina Nita-Rotaru. CS355: Cryptography. Lecture 9: Encryption modes. AES

The Advanced Encryption Standard

Secret Key Systems (block encoding) Encrypting a small block of text (say 64 bits) General considerations for cipher design:

Applications of Finite Sets Jeremy Knight Final Oral Exam Texas A&M University March 29 th 2012

CHAPTER 5 A BLOCK CIPHER INVOLVING A KEY APPLIED ON BOTH THE SIDES OF THE PLAINTEXT

Outline. 1 Arithmetic on Bytes and 4-Byte Vectors. 2 The Rijndael Algorithm. 3 AES Key Schedule and Decryption. 4 Strengths and Weaknesses of Rijndael

Introduction. CSC/ECE 574 Computer and Network Security. Outline. Introductory Remarks Feistel Cipher DES AES

Design of Low Power Optimized MixColumn/Inverse MixColumn Architecture for AES

Affine equivalence in the AES round function

AURORA: A Cryptographic Hash Algorithm Family

Accelerating AES Using Instruction Set Extensions for Elliptic Curve Cryptography. Stefan Tillich, Johann Großschädl

MASKED INVERSION IN GF(2 N ) USING MIXED FIELD REPRESENTATIONS AND ITS EFFICIENT IMPLEMENTATION FOR AES

Introduction to Modern Cryptography. (1) Finite Groups, Rings and Fields. (2) AES - Advanced Encryption Standard

Table Of Contents. ! 1. Introduction to AES

Improved S-Box Construction from Binomial Power Functions

A Very Efficient Pseudo-Random Number Generator Based On Chaotic Maps and S-Box Tables M. Hamdi, R. Rhouma, S. Belghith

A Five-Round Algebraic Property of the Advanced Encryption Standard

A Polynomial Description of the Rijndael Advanced Encryption Standard

ON THE SECURITY OF THE ADVANCED ENCRYPTION STANDARD

The XL and XSL attacks on Baby Rijndael. Elizabeth Kleiman. A thesis submitted to the graduate faculty

Module 2 Advanced Symmetric Ciphers

Symmetric Crypto Systems

arxiv: v1 [cs.cr] 13 Sep 2016

Secret Key: stream ciphers & block ciphers

Symmetric Crypto Systems

Efficient Hardware Calculation of Inverses in GF (2 8 )

(Solution to Odd-Numbered Problems) Number of rounds. rounds

THE UNIVERSITY OF CALGARY FACULTY OF SCIENCE DEPARTMENT OF COMPUTER SCIENCE DEPARTMENT OF MATHEMATICS & STATISTICS MIDTERM EXAMINATION 1 FALL 2018

Extended Criterion for Absence of Fixed Points

Invariant Subspace Attack Against Full Midori64

Differential Fault Analysis on A.E.S.

Parts Manual. EPIC II Critical Care Bed REF 2031

Methods and Tools for Analysis of Symmetric Cryptographic Primitives

Unit 3. Digital encoding

Chapter 4 Finite Fields

4.3 Analog Value Representation

Specification on a Block Cipher : Hierocrypt L1

Hardware Design and Analysis of Block Cipher Components

Mathematical Foundations of Cryptography

A B CDE F B FD D A C AF DC A F

LOOKING INSIDE AES AND BES

Introduction. Outline. CSC/ECE 574 Computer and Network Security. Secret Keys or Secret Algorithms? Secrets? (Cont d) Secret Key Cryptography

The Hash Function Fugue

The Hash Function JH 1

A New Approach for Designing Key-Dependent S-Box Defined over GF (2 4 ) in AES

A SIMPLIFIED RIJNDAEL ALGORITHM AND ITS LINEAR AND DIFFERENTIAL CRYPTANALYSES

Public-key Cryptography: Theory and Practice

Low Complexity Differential Cryptanalysis and Fault Analysis of AES

Fields in Cryptography. Çetin Kaya Koç Winter / 30

Chapter 4 Mathematics of Cryptography

A New Algorithm to Construct. Secure Keys for AES

Elliptic Curves I. The first three sections introduce and explain the properties of elliptic curves.

Perfect Diffusion Primitives for Block Ciphers

Developing a Distributed Java-based Speech Recognition Engine

New Block Cipher: ARIA

Introduction on Block cipher Yoyo Game Application on AES Conclusion. Yoyo Game with AES. Navid Ghaedi Bardeh. University of Bergen.

High Performance Computing techniques for attacking reduced version of AES using XL and XSL methods

Review of Vectors and Matrices

Improved Impossible Differential Cryptanalysis of Rijndael and Crypton

Architecture and development methodology for Location Based Services

ACCRS/QUALITY CORE CORRELATION DOCUMENT: ALGEBRA I

Matrix Algebra. Matrix Algebra. Chapter 8 - S&B

Selma City Schools Curriculum Pacing Guide Grades Subject: Algebra II Effective Year:

AES side channel attacks protection using random isomorphisms

Symmetric Cryptography

Security of the AES with a Secret S-box

Inside Keccak. Guido Bertoni 1 Joan Daemen 1 Michaël Peeters 2 Gilles Van Assche 1. Keccak & SHA-3 Day Université Libre de Bruxelles March 27, 2013

A field F is a set of numbers that includes the two numbers 0 and 1 and satisfies the properties:

1. Basics of Information

Essential Algebraic Structure Within the AES

William Stallings Copyright 2010

MetroCount Traffic Executive Individual Vehicles

Differential Fault Analysis of AES using a Single Multiple-Byte Fault

Elliptic Curve Cryptography and Security of Embedded Devices

Simulation study of using shift registers based on 16 th Degree Primitive Polynomials

MATH3302 Cryptography Problem Set 2

Profiling the International New Venture -A literature review of the empirical evidence

Hans Delfs & Helmut Knebl: Kryptographie und Informationssicherheit WS 2008/2009. References. References

17.1 Binary Codes Normal numbers we use are in base 10, which are called decimal numbers. Each digit can be 10 possible numbers: 0, 1, 2, 9.

New Coding System of Grid Squares in the Republic of Indonesia

Australian Journal of Basic and Applied Sciences

Matrices A matrix is a rectangular array of numbers. For example, the following rectangular arrays of numbers are matrices: 2 1 2

Alternative Approaches: Bounded Storage Model

Combinatorial Electrosynthesis in Microtiter Plate Wells with Ionic Liquid Electrolytes

ORYX. ORYX not an acronym, but upper case Designed for use with cell phones. Standard developed by. Cipher design process not open

Cryptography and Network Security Prof. D. Mukhopadhyay Department of Computer Science and Engineering Indian Institute of Technology, Kharagpur

Chapter 2 Symmetric Encryption Algorithms

Image Encryption and Decryption Algorithm Using Two Dimensional Cellular Automata Rules In Cryptography

The Block Cipher Hierocrypt

Functions on Finite Fields, Boolean Functions, and S-Boxes

NACC Uniform Data Set (UDS) FTLD Module

ELEMENTARY LINEAR ALGEBRA

Finite Fields. Mike Reiter

CHAPTER 12 CRYPTOGRAPHY OF A GRAY LEVEL IMAGE USING A MODIFIED HILL CIPHER

Finite Fields. SOLUTIONS Network Coding - Prof. Frank H.P. Fitzek

Math 4377/6308 Advanced Linear Algebra

NAVAL POSTGRADUATE SCHOOL

18733: Applied Cryptography Anupam Datta (CMU) Block ciphers. Dan Boneh

A New Algebraic Method to Search Irreducible Polynomials Using Decimal Equivalents of Polynomials over Galois Field GF(p q )

Basic Concepts in Number Theory and Finite Fields

Transcription:

The Rijndael Block Cipher Vincent Leith MATH 27.2 May 3, 2 A brief look at the mathematics behind the Rijndael Block Chiper. Introduction The Rijndael Block Chiper was brought about by Joan Daemen and Vincent Rijmen when they attempted to compete in the competition set up by the American National Institute of Standards of Technology back in 997. The competition was set up to hopefully find a new Advanced Encryption Standard to be used for the protection of sensitive data. Fifteen entered the competition and the group of Rijndael, Joan and Vincent, were chosen as the best choice for the new AES standard with their encryption algorithm. 2 Piliminary Mathematics The Rijndael Block Chiper uses finite field arithmetic in the field of GF( 28 ) or the Galois Field. For Rijndael we show this field as a polynomial where each b is a bit in a byte that can contain the binary value of either or. b 7 x 7 + b 6 x 6 + b 5 x 5 + b 4 x 4 + b 3 x 3 + b 2 x 2 + b x + b The values used in Rijndael are displayed in hexadecimal value form and each hexadecimal value correspond to a polynomial representation. Table of hexadecimal values = 4 = 8 = C = = 5 = 9 = D = 2 = 6 = A = E = 3 = 7 = B = F = Example: Here is a byte containing the hexadecimal value of 57 and it corresponding binary and polynomial representations Binary = Polynomial = x 6 + x 4 + x 2 + x + Addition When using the polynomial representation for addition the sum of two elements in the polynomial is the coefficents of the two terms being given by the sum modulo 2. This is done by using simple bitwise EXOR at a byte level ( shown by ).

Example: 57 + 83 = D4, shown below in both polynomial notation along with the binary notation: (x 6 + x 4 + x 2 + x + ) + (x 7 + x + ) = x 7 + x 6 + x 4 + x 2 = This method also works the same for subtraction. Multiplication In polynomial representation for multiplication in the Galois field the polynomials need to be multiplied by an irreducible binary polynomial modulo of degree 8. The polynomial used in Rijndael is called m(x) and shown by Example: 53 CA =, m(x) = (x 8 + x 4 + x 3 + x + ) (x 6 + x 4 + x + x + )(x 7 + x 6 + x 3 + x) = x 3 + x 2 + x 9 + x 7 + x + x + x 7 + x 5 + x 8 + x 7 + x 4 + x 2 + x 7 + x 6 + x 3 + x = x 3 + x 2 + x + x + x 9 + x 8 + x 6 + x 5 + x 4 + x 3 + x 2 + x Next step is to multiply by the modulo m(x), x 3 + x 2 + x + x + x 9 + x 8 + x 6 + x 5 + x 4 + x 3 + x 2 + x mod(x 8 + x 4 + x 3 + x + ) = To work the modulo we are going to go through the binary steps, mod = 2

Using EXOR arithmetic we can use the modulo to reduce the binary value down to a 8 byte hexadecimal value once again thus making the answer If we multiply b(x) by the polynomial x, we have: b 7 x 8 + b 6 6x 7 + b 5 x 6 + b 4 x 5 + b 3 x 4 + b 2 x 3 + b x 2 + b x The reduced result is achieved by using modulo m(x). By multiplying by x at the byte level we can shift left and then use a conditional bitwise EXOR. This is done by b = xtime(a) to complete in xtime. Example: 57 3 = FE, Multiplication by x (using the hexadecimal notation), 57 2 = xtime(57) = AE 57 4 = xtime(ae) = 47 57 8 = xtime(47) = 8E 57 = xtime(8e) = 7 The following multiplication explained through binary arithmetic, 57 2 57 4 57 8 57 Finally using EXOR with the hexadecimal xtime value equivalent to the hexadecimal value 3, 57 3 = 57 ( 2 ) = 57 AE 7 = FE 3 Polynomials with coefficients in GF(2 8 ) Polynomials can be defined with coefficents in the Galois field and in this we can display a 4 byte vector using a polynomial degree 4 or below. Addition As before we use EXOR arithmetic for adding the polynomials by adding two of the vectors with a bitwise EXOR. Multiplication More complicated then addition due to it easily exceeding a 4 byte vector space. By using the modulo M(x) the result can be reduced to a polynomial with degree below 4. The modulo is as follows, M(x) = x 4 + 3

Now assume that there are two polynomials in the Galois field, a(x) = a 3 x 3 + a 2 x 2 + a 4 x + a and b(x) = b 3 x 3 + b 2 x 2 + b 4 x + b The product of c(x) = a(x)b(x) is as follows, c(x) = c 6 x 6 + c 5 x 5 + c 4 x 4 + c 3 x 3 + c 2 x 2 + c x + c c = a b c 4 = a 3 b a 2 b 2 a b 3 c = a b a b c 5 = a 3 b 2 a 2 b 3 c 2 = a 2 b a b a b 2 c 6 = a 3 b 3 c 3 = a 3 b a 2 b a b 2 a b 3 But c(x) can no longer be represented by a 4 byte vector so now we will implement the modulo M(x) of a(x) and b(x), where d(x) = a(x) b(x) d(x) = d 3 x 3 + d 2 x 2 + d x + d d = a b a 3 b a 2 b 2 a b 3 d = a b a b a 3 b 2 a 2 b 3 d 2 = a 2 b a b a b 2 a 3 b 3 d 3 = a 3 b a 2 b a b 2 a b 3 To simplify this operation we can write a(x) as a matrix due to it being a fixed polynomial. The matrix would simply be multiplied by the b(x) matrix, 4 Rijndael s S-box d d d 2 d 3 = a a 3 a 2 a a a a 3 a 2 a 2 a a a 3 a 3 a 2 a a The s-box is used in the BtyeSub step of the encryption and is generated by determining the multiplicative inverse for a given number in the Galois filed, zero would be set to zero. The multiplicative inverse is transformed using the following affine transformation: x x x 2 x 3 x 4 x 5 x 6 x 7 + b b b 2 b 3 () (2) 4

where the x vector is the multiplicative inverse and being added to by the hexadecimal value 63. For the affine transformation where we use the previous mentioned matrix multiplied by the element a, to calculate the following: a = x 7 + x 6 + x 3 + x a = a a 4 a 5 a 6 a 7 = = a = a a a 5 a 6 a 7 = = a 2 = a a a 2 a 6 a 7 = = a 3 = a a a 2 a 3 a 7 = = a 4 = a a a 2 a 3 a 4 = = a 5 = a a 2 a 3 a 4 a 5 = = a 6 = a 2 a 3 a 4 a 5 a 6 = = a 7 = a 3 a 4 a 5 a 6 a 7 = = Thus a = x 7 + x 6 + x 5 + x 3 + x 2 + = = ED The matrix multiplication for the S-box can now be calculated by the following algorithm:. Store the multiplicative inverse of the input number in two 8-bit unsigned temporary variables: s and x. 2. Rotate the value s one bit to the left; if the value of s had a high bit (eighth bit from the right) of one, make the low bit of s one; otherwise the low bit of s is zero. 3. Exclusive or the value of x with the value of s, storing the value in x 4. For three more iterations, repeat steps two and three; steps two and three are done a total of four times. 5. The value of x will now have the result of the multiplication. Following this algorithm we generate the following S-box using the hexadeciaml value 63. 5

2 3 4 5 6 7 8 9 A B C D E F 63 7C 77 7B F2 6B 6F C5 3 67 2B FE D7 AB 76 CA 82 C9 7D FA 59 47 F AD D4 A2 AF 9C A4 72 C 2 B7 FD 93 26 36 3F F7 CC 34 A5 E5 F 7 D8 3 5 3 4 C7 23 C3 8 96 5 9A 7 2 8 E2 EB 27 B2 75 4 9 83 2C A B 6E 5A A 52 3B D6 B3 29 E3 2F 84 5 53 D ED 2 FC B 5B 6A CB BE 39 4A 4C 58 CF 6 D EF AA FB 43 4D 33 85 45 F9 2 7F 5 3C 9F A8 7 5 A3 4 8F 92 9D 38 F5 BC B6 DA 2 FF F3 D2 8 CD C 3 EC 5F 97 44 7 C4 A7 7E 3D 64 5D 9 73 9 6 8 4F DC 22 2A 9 88 46 EE B8 4 DE 5E B DB A E 32 3A A 49 6 24 5C C2 D3 AC 62 9 95 E4 79 B E7 C8 37 6D 8D D5 4E A9 6C 56 F4 EA 65 7A AE 8 C BA 78 25 2E C A6 B4 C6 E8 DD 74 F 4B BD 8B 8A D 7 3E B5 66 48 3 F6 E 6 35 57 B9 86 C D 9E E E F8 98 69 D9 8E 94 9B E 87 E9 CE 55 28 DF F 8C A 89 D BF E6 42 68 4 99 2D F B 54 BB 6 And now the table can be easily read for replacing any hexadecimal value with its S-box inverse. Example: 9A is now read as B8 after the S-box inverse is applied. 5 ByteSub Step The ByteSub step is used on each value in the matrix by updating its value using an 8-bit substitution box, Rijndael s S-box. The point of this operation to the matrix is provide a non-linear encryption to the chiper which keeps the chiper from being broken easily in a linear fashion as is done nowadays with block chipers. Using the Galois field gives the chiper a strong non-linear property keeping simple algebraic attacks a bay. The ByteSub step is assisted by the S-box which as seen before is built using affine transformations. y y y 2 y 3 y 4 y 5 y 6 y 7 = x x x 2 x 3 x 4 x 5 x 6 x 7 + This is arbitrary based upon whatever the matrix is being added by. This step is denoted by the statement ByteSub(State). 6 ShiftRow Step The ShiftRow operation acts directly on the rows of the current state of the matrix. The rows are cyclically shifted over different offsets depending on the block length of the array. (3) 6

Nb C C2 C3 4 2 3 6 2 3 8 3 4 The table show the different offsets for the matrix based off of its block length where a matrix would be shifted to the left by C for Row, C2 for Row 2, C3 for Row 3, and Row is not shifted. Nb is equal to the block length of the matrix and each value corresponds to the number of bits used in the block divided by 32. i.e. 28 32 = 4. Example: A Nb = 4 (28 bit) matrix before and after the ShiftRow Step: Before ShiftRow After ShiftRow 4 8 2 4 8 2 5 9 3 5 9 3 2 6 4 4 2 6 3 7 5 5 3 7 As we can see this is a simple row shift of the contents of each row by just a value of C, C2, C3 all of which vary depending on whether the matrix is representative of a 28, 92, or 256 bit block of values. To get the inverse of this step simply apply the cyclic shift on the bottom three rows using Row - C, Row 2 - C2, and Row 3 - C3 respectively. 7 MixColumn Step This step is usually performed along with the ShiftRow step and is the main source of diffusion in the Jijndael chiper. The columns of the matrix are though of a polynomials in the Galois filed and are multiplie modulo with a fixed polynomial c(x), x 4 + c(x) = 3x 3 + x 2 + + x + 2 Now the MixColumn step can be performed by multiplying a coordinate vector in the Galois field by the following matrix: b b b 2 b 3 = a 2 a 3 a a a a 2 a 3 a a a a 2 a 3 a 3 a a a 2 Which can be written as the following for easeir computaion: b = 2a 3a a 2 a 3 b = 2a 3a 2 a 3 a b 2 = 2a 2 3a 3 a a b 3 = 2a 3 3a a a 2 a a a 2 a 3 (4) 7

Example: The multiplication between a binary sting and 3 in the Galois field and applying module m(x) to reduce the new value to a 8 byte hexadecimal value: The new value, after applying the MixColumn step, is 45. Using this step, denoted as MixColumn(State), along with the RowShift(State) we can achive a reliable diffusion for our chiper text. 8 AddRoundKey Step A very simple step but can be seen as the final nail in the coffin. By adding the RoundKey to the transformed matrix we further distort the matrix causing it to be undechiperable without the formentioned key. This step is done by applying bitwise EXOR arithmetic to the current matrix with the supplied RoundKey to generate a newly encrypted matrix that can only be unlocked by using the key. 9 The Round Transformation Now all of the steps come together, to save space we will only give a general explanation of how the steps work. To get the desired output of e for the round input of a. a i,j denotes the ith row and the jth column. The first step is adding the RoundKey then the MixCoulmn Step, e,j e,j e 2,j e 3,j = d,j d,j d 2,j d 3,j k,j k,j k 2,j k 3,j and d,j d,j d 2,j d 3,j = 2 3 2 3 2 2 3 3 2 This is followed by the ShiftRow step and then the ByteSub transformation, c,j c,j c 2,j c 3,j = c,j c,j C c 2,j C2 c 3,j C3 [ andb i,j = S a i,j ] In this step the column indices need to be substituted with modulo Nb (either 4, 6, or 8). c,j c,j c 2,j c 3,j (5) (6) 8

e,j e,j e 2,j e 3,j = 2 3 2 3 2 3 3 2 S S S [ ] S a,j [ ] a [,j C ] a [ 2,j C2 ] a 3,j C3 k,j k,j k 2,j k 3,j (7) Nest step is simple martix multiplication expressed here as a linear combination of vectors: e,j e,j e 2,j e 3,j = S 2 3 S 3 2 S 3 2 S 3 2 The S values being used are vectors obtained by performing a table lookup on the input bytes in the S-box table. The rest is simple martix multiplication based upon the values generated by the data set to be encrypted and the steps that went into encrypting it. A look at the whole process in order is shown by: AddRoundKey(State) ByteSub(State) ShiftRows(State) MixColumn(State) AddRoundKey(State) ByteSub(State) ShiftRows(State) AddRoundKey(State) To state to show all the steps and math incoorperated in this execution would in itself take up as many pages as it has taken to explain how it works. So for space sake the practical execution of the Round Transformation is left up to the reader to calculate. Though that is the reason that it was designed to be written in code to avoid tedious calculations. By using the steps multiple times the encryption can be considered in the terms of the AES one of the most secure chipers that is in use today. Conclusion The Rijndael Block Chiper is incerible thoughout in terms of runtime, protection, resistance to attack and many other such necessairy issues that need to be addressed when designing a chiper. The Rijndael is still in use to this day, used in encrypting e-mails, important legal documents, etc. The math behind the Rijndael is simple once fiugured out but the combination of how the different steps act upon each other allows of the strength it has. The reader is encouraged to run and implement a coded version of Rijndael to see it in action as that is the best way to appreciate its purpose. C Sharp Implementation using System; using System.Security.Cryptography; k,j k,j k 2,j k 3,j (8) 9

using System.Text; using System.IO; class RijndaelSample static void Main() try // Create a new Rijndael object to generate a key // and initialization vector (IV). Rijndael RijndaelAlg = Rijndael.Create(); // Create a string to encrypt. string sdata = Here is some data to encrypt. ; string FileName = CText.txt ; // Encrypt text to a file using the file name, key, and IV. EncryptTextToFile(sData, FileName, RijndaelAlg.Key, RijndaelAlg.IV); // Decrypt the text from a file using the file name, key, and IV. string Final = DecryptTextFromFile(FileName, RijndaelAlg.Key, RijndaelAlg.IV); // Display the decrypted string to the console. Console.WriteLine(Final); catch (Exception e) Console.WriteLine(e.Message); Console.ReadLine(); public static void EncryptTextToFile(String Data, String FileName, byte[] Key, byte[] IV) try // Create or open the specified file. FileStream fstream = File.Open(FileName, FileMode.OpenOrCreate); // Create a new Rijndael object. Rijndael RijndaelAlg = Rijndael.Create(); // Create a CryptoStream using the FileStream // and the passed key and initialization vector (IV). CryptoStream cstream = new CryptoStream(fStream, RijndaelAlg.CreateEncryptor(Key, IV), CryptoStreamMode.Write); // Create a StreamWriter using the CryptoStream. StreamWriter swriter = new StreamWriter(cStream);

try // Write the data to the stream // to encrypt it. swriter.writeline(data); catch (Exception e) Console.WriteLine( An error occurred:, e.message); finally // Close the streams and // close the file. swriter.close(); cstream.close(); fstream.close(); catch (CryptographicException e) Console.WriteLine( A Cryptographic error occurred:, e.message); catch (UnauthorizedAccessException e) Console.WriteLine( A file error occurred:, e.message); public static string DecryptTextFromFile(String FileName, byte[] Key, byte[] IV) try // Create or open the specified file. FileStream fstream = File.Open(FileName, FileMode.OpenOrCreate); // Create a new Rijndael object. Rijndael RijndaelAlg = Rijndael.Create(); // Create a CryptoStream using the FileStream // and the passed key and initialization vector (IV). CryptoStream cstream = new CryptoStream(fStream, RijndaelAlg.CreateDecryptor(Key, IV), CryptoStreamMode.Read); // Create a StreamReader using the CryptoStream. StreamReader sreader = new StreamReader(cStream); string val = null; try // Read the data from the stream // to decrypt it. val = sreader.readline(); catch (Exception e)

Console.WriteLine( An error occurred:, e.message); finally // Close the streams and // close the file. sreader.close(); cstream.close(); fstream.close(); // Return the string. return val; catch (CryptographicException e) Console.WriteLine( A Cryptographic error occurred:, e.message); return null; catch (UnauthorizedAccessException e) Console.WriteLine( A file error occurred:, e.message); return null; 2 References. Daemen, John, Rijmen, Vincent. AES Proposal: Rijndael. http://www.cryptosoft.de/docs/rijndael.pdf, 999. 2. Savard, John J. G.. The Advanced Encryption Standard (Rijndael). http://www.quadibloc.com/crypto/co44.htm, 999. 3. Welschenbach, Michael. Cryptography in C and C++. Apress, 25. 4. http://en.wikipedia.org/wiki/advanced Encryption Standard 5. http://msdn.microsoft.com/en-us/library/system.security.cryptography.rijndael.aspx 2