1- #include " AES.h"
1+ #include " AES.h"
22
33AES::AES (int keyLen)
44{
@@ -19,144 +19,136 @@ AES::AES(int keyLen)
1919 break ;
2020 default :
2121 throw " Incorrect key length" ;
22- }
23-
22+ }
23+
2424 blockBytesLen = 4 * this ->Nb * sizeof (unsigned char );
25- }
26-
27- unsigned char * AES::EncryptECB (unsigned char in[], unsigned int inLen, unsigned char key[], unsigned int &outLen)
28- {
29- outLen = GetPaddingLength (inLen);
30- unsigned char *alignIn = PaddingNulls (in, inLen, outLen);
31- unsigned char *out = new unsigned char [outLen];
32- for (unsigned int i = 0 ; i < outLen; i+= blockBytesLen)
33- {
34- EncryptBlock (alignIn + i, out + i, key);
35- }
36-
37- delete[] alignIn;
38-
39- return out;
40- }
41-
42- unsigned char * AES::DecryptECB (unsigned char in[], unsigned int inLen, unsigned char key[], unsigned int &outLen)
43- {
44- outLen = GetPaddingLength (inLen);
45- unsigned char *alignIn = PaddingNulls (in, inLen, outLen);
46- unsigned char *out = new unsigned char [outLen];
47- for (unsigned int i = 0 ; i < outLen; i+= blockBytesLen)
48- {
49- DecryptBlock (alignIn + i, out + i, key);
50- }
51-
52- delete[] alignIn;
53-
54- return out;
55- }
56-
57-
58- unsigned char *AES::EncryptCBC (unsigned char in[], unsigned int inLen, unsigned char key[], unsigned char * iv, unsigned int &outLen)
59- {
60- outLen = GetPaddingLength (inLen);
61- unsigned char *alignIn = PaddingNulls (in, inLen, outLen);
62- unsigned char *out = new unsigned char [outLen];
63- unsigned char *block = new unsigned char [blockBytesLen];
64- memcpy (block, iv, blockBytesLen);
65- for (unsigned int i = 0 ; i < outLen; i+= blockBytesLen)
66- {
67- XorBlocks (block, alignIn + i, block, blockBytesLen);
68- EncryptBlock (block, out + i, key);
69- }
70-
71- delete[] block;
72- delete[] alignIn;
73-
74- return out;
75- }
76-
77- unsigned char *AES::DecryptCBC (unsigned char in[], unsigned int inLen, unsigned char key[], unsigned char * iv, unsigned int &outLen)
78- {
79- outLen = GetPaddingLength (inLen);
80- unsigned char *alignIn = PaddingNulls (in, inLen, outLen);
81- unsigned char *out = new unsigned char [outLen];
82- unsigned char *block = new unsigned char [blockBytesLen];
83- memcpy (block, iv, blockBytesLen);
84- for (unsigned int i = 0 ; i < outLen; i+= blockBytesLen)
85- {
86- DecryptBlock (alignIn + i, out + i, key);
87- XorBlocks (block, out + i, out + i, blockBytesLen);
88- }
89-
90- delete[] block;
91- delete[] alignIn;
92-
93- return out;
94- }
95-
96- unsigned char *AES::EncryptCFB (unsigned char in[], unsigned int inLen, unsigned char key[], unsigned char * iv, unsigned int &outLen)
97- {
98- outLen = GetPaddingLength (inLen);
99- unsigned char *alignIn = PaddingNulls (in, inLen, outLen);
100- unsigned char *out = new unsigned char [outLen];
101- unsigned char *block = new unsigned char [blockBytesLen];
102- unsigned char *encryptedBlock = new unsigned char [blockBytesLen];
103- memcpy (block, iv, blockBytesLen);
104- for (unsigned int i = 0 ; i < outLen; i+= blockBytesLen)
105- {
106- EncryptBlock (block, encryptedBlock, key);
107- XorBlocks (alignIn + i, encryptedBlock, out + i, blockBytesLen);
108- memcpy (block, out + i, blockBytesLen);
109- }
110-
111- delete[] block;
112- delete[] encryptedBlock;
113- delete[] alignIn;
114-
115- return out;
116- }
117-
118- unsigned char *AES::DecryptCFB (unsigned char in[], unsigned int inLen, unsigned char key[], unsigned char * iv, unsigned int &outLen)
119- {
120- outLen = GetPaddingLength (inLen);
121- unsigned char *alignIn = PaddingNulls (in, inLen, outLen);
122- unsigned char *out = new unsigned char [outLen];
123- unsigned char *block = new unsigned char [blockBytesLen];
124- unsigned char *encryptedBlock = new unsigned char [blockBytesLen];
125- memcpy (block, iv, blockBytesLen);
126- for (unsigned int i = 0 ; i < outLen; i+= blockBytesLen)
127- {
128- EncryptBlock (block, encryptedBlock, key);
129- XorBlocks (alignIn + i, encryptedBlock, out + i, blockBytesLen);
130- memcpy (block, alignIn + i, blockBytesLen);
131- }
132-
133- delete[] block;
134- delete[] encryptedBlock;
135- delete[] alignIn;
136-
137- return out;
138- }
139-
140- unsigned char * AES::PaddingNulls (unsigned char in[], unsigned int inLen, unsigned int alignLen)
141- {
142- unsigned char *alignIn = new unsigned char [alignLen];
143- memcpy (alignIn, in, inLen);
144- memset (alignIn + inLen, 0x00 , alignLen - inLen);
145- return alignIn;
14625}
14726
148- unsigned int AES::GetPaddingLength (unsigned int len)
149- {
150- unsigned int lengthWithPadding = (len / blockBytesLen);
151- if (len % blockBytesLen) {
152- lengthWithPadding++;
153- }
154-
155- lengthWithPadding *= blockBytesLen;
156-
157- return lengthWithPadding;
158- }
159-
27+ unsigned char * AES::EncryptECB (unsigned char in[], unsigned int inLen, unsigned char key[], unsigned int &outLen)
28+ {
29+ outLen = GetPaddingLength (inLen);
30+ unsigned char *alignIn = PaddingNulls (in, inLen, outLen);
31+ unsigned char *out = new unsigned char [outLen];
32+ for (unsigned int i = 0 ; i < outLen; i+= blockBytesLen)
33+ {
34+ EncryptBlock (alignIn + i, out + i, key);
35+ }
36+
37+ delete[] alignIn;
38+
39+ return out;
40+ }
41+
42+ unsigned char * AES::DecryptECB (unsigned char in[], unsigned int inLen, unsigned char key[])
43+ {
44+ unsigned char *out = new unsigned char [inLen];
45+ for (unsigned int i = 0 ; i < inLen; i+= blockBytesLen)
46+ {
47+ DecryptBlock (in + i, out + i, key);
48+ }
49+
50+ return out;
51+ }
52+
53+
54+ unsigned char *AES::EncryptCBC (unsigned char in[], unsigned int inLen, unsigned char key[], unsigned char * iv, unsigned int &outLen)
55+ {
56+ outLen = GetPaddingLength (inLen);
57+ unsigned char *alignIn = PaddingNulls (in, inLen, outLen);
58+ unsigned char *out = new unsigned char [outLen];
59+ unsigned char *block = new unsigned char [blockBytesLen];
60+ memcpy (block, iv, blockBytesLen);
61+ for (unsigned int i = 0 ; i < outLen; i+= blockBytesLen)
62+ {
63+ XorBlocks (block, alignIn + i, block, blockBytesLen);
64+ EncryptBlock (block, out + i, key);
65+ memcpy (block, out + i, blockBytesLen);
66+ }
67+
68+ delete[] block;
69+ delete[] alignIn;
70+
71+ return out;
72+ }
73+
74+ unsigned char *AES::DecryptCBC (unsigned char in[], unsigned int inLen, unsigned char key[], unsigned char * iv)
75+ {
76+ unsigned char *out = new unsigned char [inLen];
77+ unsigned char *block = new unsigned char [blockBytesLen];
78+ memcpy (block, iv, blockBytesLen);
79+ for (unsigned int i = 0 ; i < inLen; i+= blockBytesLen)
80+ {
81+ DecryptBlock (in + i, out + i, key);
82+ XorBlocks (block, out + i, out + i, blockBytesLen);
83+ memcpy (block, in + i, blockBytesLen);
84+ }
85+
86+ delete[] block;
87+
88+ return out;
89+ }
90+
91+ unsigned char *AES::EncryptCFB (unsigned char in[], unsigned int inLen, unsigned char key[], unsigned char * iv, unsigned int &outLen)
92+ {
93+ outLen = GetPaddingLength (inLen);
94+ unsigned char *alignIn = PaddingNulls (in, inLen, outLen);
95+ unsigned char *out = new unsigned char [outLen];
96+ unsigned char *block = new unsigned char [blockBytesLen];
97+ unsigned char *encryptedBlock = new unsigned char [blockBytesLen];
98+ memcpy (block, iv, blockBytesLen);
99+ for (unsigned int i = 0 ; i < outLen; i+= blockBytesLen)
100+ {
101+ EncryptBlock (block, encryptedBlock, key);
102+ XorBlocks (alignIn + i, encryptedBlock, out + i, blockBytesLen);
103+ memcpy (block, out + i, blockBytesLen);
104+ }
105+
106+ delete[] block;
107+ delete[] encryptedBlock;
108+ delete[] alignIn;
109+
110+ return out;
111+ }
112+
113+ unsigned char *AES::DecryptCFB (unsigned char in[], unsigned int inLen, unsigned char key[], unsigned char * iv)
114+ {
115+ unsigned char *out = new unsigned char [inLen];
116+ unsigned char *block = new unsigned char [blockBytesLen];
117+ unsigned char *encryptedBlock = new unsigned char [blockBytesLen];
118+ memcpy (block, iv, blockBytesLen);
119+ for (unsigned int i = 0 ; i < inLen; i+= blockBytesLen)
120+ {
121+ EncryptBlock (block, encryptedBlock, key);
122+ XorBlocks (in + i, encryptedBlock, out + i, blockBytesLen);
123+ memcpy (block, in + i, blockBytesLen);
124+ }
125+
126+ delete[] block;
127+ delete[] encryptedBlock;
128+
129+ return out;
130+ }
131+
132+ unsigned char * AES::PaddingNulls (unsigned char in[], unsigned int inLen, unsigned int alignLen)
133+ {
134+ unsigned char *alignIn = new unsigned char [alignLen];
135+ memcpy (alignIn, in, inLen);
136+ memset (alignIn + inLen, 0x00 , alignLen - inLen);
137+ return alignIn;
138+ }
139+
140+ unsigned int AES::GetPaddingLength (unsigned int len)
141+ {
142+ unsigned int lengthWithPadding = (len / blockBytesLen);
143+ if (len % blockBytesLen) {
144+ lengthWithPadding++;
145+ }
146+
147+ lengthWithPadding *= blockBytesLen;
148+
149+ return lengthWithPadding;
150+ }
151+
160152void AES::EncryptBlock (unsigned char in[], unsigned char out[], unsigned char key[])
161153{
162154 unsigned char *w = new unsigned char [4 * Nb * (Nr + 1 )];
@@ -203,8 +195,8 @@ void AES::EncryptBlock(unsigned char in[], unsigned char out[], unsigned char k
203195 delete[] state[0 ];
204196 delete[] state;
205197 delete[] w;
206- }
207-
198+ }
199+
208200void AES::DecryptBlock (unsigned char in[], unsigned char out[], unsigned char key[])
209201{
210202 unsigned char *w = new unsigned char [4 * Nb * (Nr + 1 )];
@@ -249,8 +241,8 @@ void AES::DecryptBlock(unsigned char in[], unsigned char out[], unsigned char k
249241 delete[] state[0 ];
250242 delete[] state;
251243 delete[] w;
252- }
253-
244+ }
245+
254246
255247void AES::SubBytes (unsigned char **state)
256248{
@@ -400,7 +392,7 @@ void AES::Rcon(unsigned char * a, int n)
400392
401393void AES::KeyExpansion (unsigned char key[], unsigned char w[])
402394{
403- unsigned char *temp = new unsigned char [4 ];
395+ unsigned char *temp = new unsigned char [4 ];
404396 unsigned char *rcon = new unsigned char [4 ];
405397
406398 int i = 0 ;
@@ -419,9 +411,9 @@ void AES::KeyExpansion(unsigned char key[], unsigned char w[])
419411 temp[3 ] = w[i - 4 + 3 ];
420412
421413 if (i / 4 % Nk == 0 )
422- {
423- RotWord (temp);
424- SubWord (temp);
414+ {
415+ RotWord (temp);
416+ SubWord (temp);
425417 Rcon (rcon, i / (Nk * 4 ));
426418 XorWords (temp, rcon, temp);
427419 }
@@ -435,9 +427,9 @@ void AES::KeyExpansion(unsigned char key[], unsigned char w[])
435427 w[i + 2 ] = w[i + 2 - 4 * Nk] ^ temp[2 ];
436428 w[i + 3 ] = w[i + 3 - 4 * Nk] ^ temp[3 ];
437429 i += 4 ;
438- }
439-
440- delete [] rcon;
430+ }
431+
432+ delete [] rcon;
441433 delete [] temp;
442434
443435}
@@ -485,25 +477,26 @@ void AES::InvShiftRows(unsigned char **state)
485477 ShiftRow (state, 1 , Nb - 1 );
486478 ShiftRow (state, 2 , Nb - 2 );
487479 ShiftRow (state, 3 , Nb - 3 );
488- }
489-
490- void AES::XorBlocks (unsigned char *a, unsigned char * b, unsigned char *c, unsigned int len)
491- {
492- for (unsigned int i = 0 ; i < len; i++)
493- {
494- c[i] = a[i] ^ b[i];
495- }
496- }
497-
498- void AES::printHexArray (unsigned char a[], unsigned int n)
499- {
500- for (int i = 0 ; i < n; i++) {
501- printf (" %02x " , a[i]);
502- }
503-
504- }
505-
506-
507-
508-
480+ }
481+
482+ void AES::XorBlocks (unsigned char *a, unsigned char * b, unsigned char *c, unsigned int len)
483+ {
484+ for (unsigned int i = 0 ; i < len; i++)
485+ {
486+ c[i] = a[i] ^ b[i];
487+ }
488+ }
489+
490+ void AES::printHexArray (unsigned char a[], unsigned int n)
491+ {
492+ for (int i = 0 ; i < n; i++) {
493+ printf (" %02x " , a[i]);
494+ }
495+ }
496+
497+
498+
499+
500+
501+
509502
0 commit comments