EVP方式实现的3DES方法加密结果不正确

可爱的小莱 2014-02-10 02:39:59
封装了openssl中的3des算法,计算出的结果不正确
EVP_des_ede_cbc\EVP_des_ede3_ecb\EVP_des_cbc三个参数都测试了,都不正确
测数数据:
密钥 11111111111111111111111111111111
数据 11111111111111111111111111111111
结果 F40379AB9E0EC533F40379AB9E0EC533B95374BA8DDFF8C2
正确结果 F40379AB9E0EC533F40379AB9E0EC533
为什么最后多一个分组呢?

//3DES
int ThreeTrip_DES(unsigned char* data,int datalen,unsigned char* key,int keylen,
unsigned char* outdata,int* outdatalen)
{
unsigned char outbuf[1024];
int outlen, tmplen;

unsigned char iv[8] = {0,0,0,0,0,0,0,0}; //8字节一个分组的长度

EVP_CIPHER_CTX ctx;

EVP_CIPHER_CTX_init(&ctx);
EVP_EncryptInit_ex(&ctx,EVP_des_ede_cbc(),NULL,key,iv);//3DES算法 EVP_des_ede_cbc\EVP_des_ede3_ecb\EVP_des_cbc

if(!EVP_EncryptUpdate(&ctx, outbuf, &outlen, (unsigned char*)data, datalen))
{
EVP_CIPHER_CTX_cleanup(&ctx);
return -1;
}

//注意,传入给下面函数的输出缓存参数必须注意不能覆盖了原来的加密输出的数据
if(!EVP_EncryptFinal_ex(&ctx, outbuf + outlen, &tmplen))
{
EVP_CIPHER_CTX_cleanup(&ctx);
return -2;
}
outlen += tmplen;
EVP_CIPHER_CTX_cleanup(&ctx);

//返回数据
*outdatalen = outlen;
memcpy(outdata,outbuf,outlen);

return 0;
}
...全文
428 3 打赏 收藏 转发到动态 举报
写回复
用AI写文章
3 条回复
切换为时间正序
请发表友善的回复…
发表回复
米修and米兔 2015-05-11
  • 打赏
  • 举报
回复
是的,可是为什么sjcl.js library 和 openssl互解不了呢,使用的是aes ccm模式,所有的条件都一样,虽然padding 方式不同,但是两者加密出来的密文压根就不一样。。。??
可爱的小莱 2014-02-11
  • 打赏
  • 举报
回复
问题已解决。 存在以下问题: 1、默认是有填充的,设置为不填充 EVP_CIPHER_CTX_set_padding(&ctx,0); //1 自动补齐 0 不补齐 2、3DES标准算法应该是ECB模式,设置为EVP_EncryptInit_ex(&ctx,EVP_des_ede_ecb(),NULL,key,iv);
zhuobattle 2014-02-10
  • 打赏
  • 举报
回复
填充了?~~

24,854

社区成员

发帖
与我相关
我的任务
社区描述
C/C++ 工具平台和程序库
社区管理员
  • 工具平台和程序库社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

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