Skip to content

Commit 3c750a1

Browse files
authored
Merge pull request #14 from SergeyBel/issue10
Issue10
2 parents 6706f92 + 48f4611 commit 3c750a1

File tree

3 files changed

+317
-204
lines changed

3 files changed

+317
-204
lines changed

AES.cpp

Lines changed: 161 additions & 168 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
#include "AES.h"
1+
#include "AES.h"
22

33
AES::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+
160152
void 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+
208200
void 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

255247
void AES::SubBytes(unsigned char **state)
256248
{
@@ -400,7 +392,7 @@ void AES::Rcon(unsigned char * a, int n)
400392

401393
void 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

Comments
 (0)