69,371
社区成员
发帖
与我相关
我的任务
分享
#include "openssl/aes.h"
#define AES_DEBUG
int ez_AES_ecb_encrypt_PKCS5Padding(const char *in, char *out, const unsigned char *key, const int keybits){
AES_KEY aes;
unsigned char *input_string;
unsigned char *encrypt_string;
unsigned int surplus_len;
char b, *tmp_out;
const char *tmp_in;
int encrypt_quit = 0;
if(in == NULL || out == NULL){
#ifdef AES_DEBUG
printf("[%s] [%d] \"in\" or \"out\" point error!!\n", __FILE__, __LINE__);
#endif
}
input_string = (unsigned char*)calloc(AES_BLOCK_SIZE, sizeof(unsigned char));
if (input_string == NULL) {
fprintf(stderr, "Unable to allocate memory for input_string\n");
exit(-1);
}
encrypt_string = (unsigned char*)calloc(AES_BLOCK_SIZE, sizeof(unsigned char));
if (encrypt_string == NULL) {
fprintf(stderr, "Unable to allocate memory for encrypt_string\n");
return -1;
}
memset(encrypt_string, 0, AES_BLOCK_SIZE);
// set encrypt key
if (AES_set_encrypt_key(key, keybits, &aes) < 0) {
fprintf(stderr, "Unable to set encryption key in AES\n");
return -1;
}
tmp_in = in;
tmp_out = out;
while(!encrypt_quit){
if(strlen(tmp_in) == 0){
surplus_len = AES_BLOCK_SIZE;
b = '\0'+surplus_len;
memset(input_string, b, AES_BLOCK_SIZE);
encrypt_quit = 1;
}else if(strlen(tmp_in)/AES_BLOCK_SIZE > 0){
memcpy(input_string, tmp_in, AES_BLOCK_SIZE);
}else{
surplus_len = strlen(tmp_in)%AES_BLOCK_SIZE;
b = '\0'+surplus_len;
memset(input_string, b, AES_BLOCK_SIZE);
memcpy(input_string, tmp_in, strlen(tmp_in));
encrypt_quit = 1;
}
#ifdef AES_DEBUG
printf("input_string: %s\n", input_string);
#endif
memset(encrypt_string, 0, AES_BLOCK_SIZE);
AES_ecb_encrypt(input_string, encrypt_string, &aes, AES_ENCRYPT);
#ifdef AES_DEBUG
printf("encrypt_string: %s\n", encrypt_string);
#endif
memcpy(tmp_out, encrypt_string, AES_BLOCK_SIZE);
tmp_out += AES_BLOCK_SIZE;
tmp_in += AES_BLOCK_SIZE;
}
free(input_string);
free(encrypt_string);
return 0;
}
int aes_encrypt(char* in, char* key, char* out)//, int olen)
{
if(!in || !key || !out) return 0;
AES_KEY aes;
if(AES_set_encrypt_key((unsigned char*)key, 128, &aes) < 0)
{
return 0;
}
int len=strlen(in), en_len=0;
while(en_len<len)//输入输出字符串够长,并且是AES_BLOCK_SIZE的整数倍,需要严格限制
{
AES_encrypt((unsigned char*)in, (unsigned char*)out, &aes);
in+=AES_BLOCK_SIZE;
out+=AES_BLOCK_SIZE;
en_len+=AES_BLOCK_SIZE;
}
return 1;
}
int aes_decrypt(char* in, char* key, char* out)
{
if(!in || !key || !out) return 0;
AES_KEY aes;
if(AES_set_decrypt_key((unsigned char*)key, 128, &aes) < 0)
{
return 0;
}
int len=strlen(in), en_len=0;
while(en_len<len)
{
AES_decrypt((unsigned char*)in, (unsigned char*)out, &aes);
in+=AES_BLOCK_SIZE;
out+=AES_BLOCK_SIZE;
en_len+=AES_BLOCK_SIZE;
}
return 1;
}
下面的链接是编程示例。
http://yuanshuilee.blog.163.com/blog/static/21769727520140942826137/
下面是源码简单解析
http://yuanshuilee.blog.163.com/blog/static/217697275201311314185639/