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
92
93
94
95
96
97
98
| /*
* aes.cc
* - Show the usage of AES encryption/decryption
*/
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#include <openssl/aes.h>
int
main(
int
argc, char
**
argv)
{
AES_KEY aes;
unsigned
char
key[
AES_BLOCK_SIZE]
;
// AES_BLOCK_SIZE = 16
unsigned
char
iv[
AES_BLOCK_SIZE]
;
// init vector
unsigned
char
*
input_string;
unsigned
char
*
encrypt_string;
unsigned
char
*
decrypt_string;
unsigned
int
len;
// encrypt length (in multiple of AES_BLOCK_SIZE)
unsigned
int
i;
// check usage
if
(
argc !
=
2
)
{
fprintf
(
stderr
, "%s <plain text>/n
"
, argv[
0
]
)
;
exit
(
-
1
)
;
}
// set the encryption length
len =
0
;
if
(
(
strlen
(
argv[
1
]
)
+
1
)
%
AES_BLOCK_SIZE ==
0
)
{
len =
strlen
(
argv[
1
]
)
+
1
;
}
else
{
len =
(
(
strlen
(
argv[
1
]
)
+
1
)
/
AES_BLOCK_SIZE +
1
)
*
AES_BLOCK_SIZE;
}
// set the input string
input_string =
(
unsigned
char
*
)
calloc
(
len, sizeof
(
unsigned
char
)
)
;
if
(
input_string ==
NULL
)
{
fprintf
(
stderr
, "Unable to allocate memory for input_string/n
"
)
;
exit
(
-
1
)
;
}
strncpy
(
(
char
*
)
input_string, argv[
1
]
, strlen
(
argv[
1
]
)
)
;
// Generate AES 128-bit key
for
(
i=
0
;
i<
16
;
++
i)
{
key[
i]
=
32
+
i;
}
// Set encryption key
for
(
i=
0
;
i<
AES_BLOCK_SIZE;
++
i)
{
iv[
i]
=
0
;
}
if
(
AES_set_encrypt_key(
key, 128
, &
aes)
<
0
)
{
fprintf
(
stderr
, "Unable to set encryption key in AES/n
"
)
;
exit
(
-
1
)
;
}
// alloc encrypt_string
encrypt_string =
(
unsigned
char
*
)
calloc
(
len, sizeof
(
unsigned
char
)
)
;
if
(
encrypt_string ==
NULL
)
{
fprintf
(
stderr
, "Unable to allocate memory for encrypt_string/n
"
)
;
exit
(
-
1
)
;
}
// encrypt (iv will change)
AES_cbc_encrypt(
input_string, encrypt_string, len, &
aes, iv, AES_ENCRYPT)
;
// alloc decrypt_string
decrypt_string =
(
unsigned
char
*
)
calloc
(
len, sizeof
(
unsigned
char
)
)
;
if
(
decrypt_string ==
NULL
)
{
fprintf
(
stderr
, "Unable to allocate memory for decrypt_string/n
"
)
;
exit
(
-
1
)
;
}
// Set decryption key
for
(
i=
0
;
i<
AES_BLOCK_SIZE;
++
i)
{
iv[
i]
=
0
;
}
if
(
AES_set_decrypt_key(
key, 128
, &
aes)
<
0
)
{
fprintf
(
stderr
, "Unable to set decryption key in AES/n
"
)
;
exit
(
-
1
)
;
}
// decrypt
AES_cbc_encrypt(
encrypt_string, decrypt_string, len, &
aes, iv,
AES_DECRYPT)
;
// print
printf
(
"input_string = %s/n
"
, input_string)
;
printf
(
"encrypted string = "
)
;
for
(
i=
0
;
i<
len;
++
i)
{
printf
(
"%x%x"
, (
encrypt_string[
i]
>>
4
)
&
0xf
,
encrypt_string[
i]
&
0xf
)
;
}
printf
(
"/n
"
)
;
printf
(
"decrypted string = %s/n
"
, decrypt_string)
;
return
0
;
}
|