http://blog.chinaunix.net/uid-23969156-id-1743579.html
/*
* 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;
}
Makefile
CC=g++
CFLAGS=-Wall -g -O2
LIBS=-lcrypto
all: aes
aes: aes.cc
$(CC) $(CFLAGS) aes.cc -o $@ $(LIBS)
clean:
@rm -f aes