-
Notifications
You must be signed in to change notification settings - Fork 0
/
aes-cbc.cpp
92 lines (73 loc) · 2.68 KB
/
aes-cbc.cpp
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
#include "cryptopp/aes.h"
using CryptoPP::AES;
#include "cryptopp/modes.h"
using CryptoPP::CBC_Mode;
#include "functions.h"
string CBCMode_Encrypt(string text, byte key[], int keySize, byte iv[]) {
string cipher = "";
//Encryption
try
{
CBC_Mode<AES>::Encryption e;
e.SetKeyWithIV(key, keySize, iv);
// The StreamTransformationFilter adds padding
// as required. ECB and CBC Mode must be padded
// to the block size of the cipher.
StringSource(text, true, new StreamTransformationFilter(e, new StringSink(cipher))); // StringSource
}
catch(const CryptoPP::Exception& e)
{
cerr << e.what() << endl;
exit(1);
}
return cipher;
}
string CBCMode_Decrypt(string cipher, byte key[], int keySize, byte iv[]) {
string recovered = "";
//Decryption
try
{
CBC_Mode< AES >::Decryption d;
d.SetKeyWithIV(key, keySize, iv);
// The StreamTransformationFilter removes
// padding as required.
StringSource s(cipher, true, new StreamTransformationFilter(d,new StringSink(recovered))); // StringSource
}
catch(const CryptoPP::Exception& e)
{
cerr << e.what() << endl;
exit(1);
}
return recovered;
}
int main(int argc, char* argv[])
{
//Define the key and iv
byte key[AES::DEFAULT_KEYLENGTH] = {0x01,0x23,0x45,0x67,0x89,0xab,0xcd,0xef, 0x23,0x45,0x67,0x89,0xab,0xcd,0xef,0x01};
byte iv[AES::BLOCKSIZE] = {0x12,0x34,0x56,0x78,0x90,0xab,0xcd,0xef, 0x34,0x56,0x78,0x90,0xab,0xcd,0xef,0x12};
string plain = "The quick brown fox jumped over the lazy dog’s back";
string sha1_digest_result, cipher, encoded, recovered;
//Print Data
cout << "Key: " << PrettyPrint(key, AES::DEFAULT_KEYLENGTH) << endl;
cout << "iv: " << PrettyPrint(iv, AES::BLOCKSIZE) << endl;
cout << "Plain text: " << plain << endl;
//SHA-1 - Plain
cout << "SHA-1 Plain: " << sha1_digest(plain) << endl;
//MD5 - Plain
cout << "MD5 Plain: " << md5(plain) << endl;
//HMAC - Plain
cout << "HMAC Plain: " << HMAC_SHA_1(plain, key, sizeof(key)) << endl;
//Encrypt
cipher = CBCMode_Encrypt(plain, key, sizeof(key), iv);
cout << "Cipher Text: " << PrettyPrint(cipher) << endl;
//Decrypt
recovered = CBCMode_Decrypt(cipher, key, sizeof(key), iv);
cout << "Recovered text: " << recovered << endl;
//SHA-1 Recovered
cout << "SHA-1 Recovered: " << sha1_digest(recovered) << endl;
//MD5 - Recovered
cout << "MD5 Recovered: " << md5(recovered) << endl;
//HMAC - Recovered
cout << "HMAC Recovered: " << HMAC_SHA_1(recovered, key, sizeof(key)) << endl;
return 0;
}