关于openssl AES/ECB/PKCS5Padding加密 求助

hermitbin 2013-12-20 10:16:21
各位高手们,小弟最近需要做一个用AES/ECB/PKCS5Padding加密的代码,跑在嵌入式linux平台上,平台已经移植了openssl,我写了下面一个基于openssl的AES/ECB/PKCS5Padding加密函数,但最终加密后的结果不对,请各位帮忙看下哪的问题,谢谢各位高手了


#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;
}

...全文
1747 4 打赏 收藏 转发到动态 举报
写回复
用AI写文章
4 条回复
切换为时间正序
请发表友善的回复…
发表回复
basszhx3x 2014-10-17
  • 打赏
  • 举报
回复
您好 能把加密修改好的代码以一份么 算法太差 只能看别人的 我邮箱 395969391@qq.com
hermitbin 2014-03-14
  • 打赏
  • 举报
回复
引用 2 楼 u010599631 的回复:
你的代码写的够乱的啊,ecb加密方式,其实底层是调用AES_encrypt接口,你可以去看源码。 下面的代码给你一个参考,只不过,我是在调用aes_encrypt外面,自己严格控制了in和out的长度,out的长度大于in,并且必须是大于等于16的整数倍。
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/
非常感谢大神指点,我的代码确实太乱了,现在代码的编写能力还是不够,还需要向各位大神学习。 不过,我的那段代码其实运行的结果也是对的,只是我之前没理解好AES加解密,因为我需要加密的内容是字符串,加密后还需要将加密的内容编码成base64,否则看到的就是一串乱码。
u010599631 2014-01-14
  • 打赏
  • 举报
回复
你的代码写的够乱的啊,ecb加密方式,其实底层是调用AES_encrypt接口,你可以去看源码。 下面的代码给你一个参考,只不过,我是在调用aes_encrypt外面,自己严格控制了in和out的长度,out的长度大于in,并且必须是大于等于16的整数倍。
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/
hermitbin 2013-12-21
  • 打赏
  • 举报
回复
自己顶下,求大神帮忙!!!!

69,371

社区成员

发帖
与我相关
我的任务
社区描述
C语言相关问题讨论
社区管理员
  • C语言
  • 花神庙码农
  • 架构师李肯
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧