求助openSSL中的AES加密返回的数据总会有几次解密后是乱码的情况.

龙马谷编程 2015-01-06 07:57:51

求助openSSL中的AES加密返回的数据总会有几次解密后是乱码的情况.

问题是这样的,使用Openssl 中的aes加密后再用base64编码,然后再用base64解码后,再用AES解密,最后得到的数据,总会有几次会出现乱码是什么情况? 不能正常的返回需要的数据。

在PHP里面返回的AES加密数据就可以正常的被解密。

附上代码:

char * aes_encode(const char *sourcestr, char *key)
{
int len = strlen(sourcestr);
unsigned char iv[AES_BLOCK_SIZE + 1] = "1234567890123456";
unsigned char *out = (unsigned char *)malloc(1024);
if (out == NULL) {
fprintf(stderr, "No Memory!\n");
}
AES_KEY aes;
if (AES_set_encrypt_key((unsigned char*)key, 128, &aes) < 0)
{
return NULL;
}

/* 计算补0后的长度 */
int out_len = ((len - 1) / 16 + 1) * 16;
char * sstr = (char *)malloc(sizeof(char)* out_len + 1);

/* 补0 */
memset(sstr, 0, out_len + 1);
strcpy(sstr, sourcestr);
AES_cbc_encrypt((unsigned char*)sstr, out, out_len, &aes, (unsigned char*)iv, AES_ENCRYPT);

/* 这里的长度一定要注意,不能用strlen来获取,加密后的字符串中可能会包含\0 */
char *out2 = (char *)malloc(1024);
base64_encode2((const unsigned char *)out, out2, out_len);

free(out);
out = NULL;
free(sstr);
sstr = NULL;
return out2;
}

就是上面这个代码,哪里需要改进的吗?
...全文
790 2 打赏 收藏 转发到动态 举报
写回复
用AI写文章
2 条回复
切换为时间正序
请发表友善的回复…
发表回复
赵4老师 2015-01-07
  • 打赏
  • 举报
回复
base64编码对尾部数据有两种约定,可能你搞混了。
赵4老师 2015-01-07
  • 打赏
  • 举报
回复
void HexDump(char *buf,int len,int addr) {
    int i,j,k;
    char binstr[80];

    for (i=0;i<len;i++) {
        if (0==(i%16)) {
            sprintf(binstr,"%08x -",i+addr);
            sprintf(binstr,"%s %02x",binstr,(unsigned char)buf[i]);
        } else if (15==(i%16)) {
            sprintf(binstr,"%s %02x",binstr,(unsigned char)buf[i]);
            sprintf(binstr,"%s  ",binstr);
            for (j=i-15;j<=i;j++) {
                sprintf(binstr,"%s%c",binstr,('!'<buf[j]&&buf[j]<='~')?buf[j]:'.');
            }
            printf("%s\n",binstr);
        } else {
            sprintf(binstr,"%s %02x",binstr,(unsigned char)buf[i]);
        }
    }
    if (0!=(i%16)) {
        k=16-(i%16);
        for (j=0;j<k;j++) {
            sprintf(binstr,"%s   ",binstr);
        }
        sprintf(binstr,"%s  ",binstr);
        k=16-k;
        for (j=i-k;j<i;j++) {
            sprintf(binstr,"%s%c",binstr,('!'<buf[j]&&buf[j]<='~')?buf[j]:'.');
        }
        printf("%s\n",binstr);
    }
}

33,311

社区成员

发帖
与我相关
我的任务
社区描述
C/C++ 新手乐园
社区管理员
  • 新手乐园社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

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