免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
12下一页
最近访问板块 发新帖
查看: 12888 | 回复: 12

[C] openssl的des加密与php、c#加密结果不一致的问题 [复制链接]

论坛徽章:
0
发表于 2009-06-04 15:10 |显示全部楼层
使用C语言调用openssl进行des加密,cbc模式,但加密出来的结果和php,c#,python等加密的结果不一致,请问,有人遇到类似情况吗?

谢谢!

c测试函数如下:


#include <stdio.h>
#include <string.h>
#include  <openssl/des.h>

int main()
{
        int i = 0;
        des_cblock   key1;
                char input[8];
                des_cblock   ivec;
        des_key_schedule   schedule1;
                unsigned char output[32] = { 0 };

        DES_string_to_key("password", &key1);
        DES_set_key_checked(&key1, &schedule1);

        strncpy(input, "hehehehe", ;
               

                /**
                 *      ncbc encrypt
                 */
                memset(ivec, 0, sizeof(ivec));
                DES_ncbc_encrypt(input, output, sizeof(input), &schedule1, &ivec, DES_ENCRYPT);
                printf("use key1 ncbc-encrypt 'hehehehe' output is: ";
        for(i = 0; i < sizeof(input); i ++)
        {
                printf("%02x", output);
        }
        printf("\n\n";
        return 0;
}

论坛徽章:
0
发表于 2009-06-04 15:20 |显示全部楼层
在线等!

论坛徽章:
0
发表于 2009-06-04 15:57 |显示全部楼层
使用mcrypt库加密的结果和c#一致,已经可以确定上面函数的问题,但不知道错在哪里了!

论坛徽章:
0
发表于 2009-06-04 16:28 |显示全部楼层
你确定 DES_string_to_key() 得到的一定是你想要的那个 key?或者说,你能确保 OpenSSL, C#, PHP 都是用同样的方法产生最终用于算法的密钥?

论坛徽章:
0
发表于 2009-06-04 16:57 |显示全部楼层
怎么确定?

论坛徽章:
0
发表于 2009-06-04 18:37 |显示全部楼层
1. 似乎C#中是Unicode字符串吧?
2. 确认填充标准是否一样

论坛徽章:
0
发表于 2009-06-04 18:55 |显示全部楼层
我的测试例子正好8个byte,因此不存在填充问题。

论坛徽章:
0
发表于 2009-06-04 21:15 |显示全部楼层
多半是生成 key 的方式不一样,DES 的有效密钥长度是 56 位,而 DES_string_to_key 能把任意长度的字符串转成 8 字节 key。这一过程似无标准,其它库的处理方法可能不一样。

OpenSSL 的  man page 说:

DES_string_to_key() is available for backward compatibility with the MIT library.
       New applications should use a cryptographic hash function.


你可以把 mcrypt 的 key 与 openssl 的 key 对照一下。

评分

参与人数 1可用积分 +8 收起 理由
langue + 8 我很赞同

查看全部评分

论坛徽章:
0
发表于 2009-06-05 08:21 |显示全部楼层
我设定的key就是8个字节。

论坛徽章:
0
发表于 2009-06-05 08:50 |显示全部楼层
原帖由 guotie 于 2009-6-5 08:21 发表
我设定的key就是8个字节。


你给定 8 个字节,并不等于这 8 个字节直接就是 key 了:

1、8字节中有 8 位是校验位,你给的满足校验关系吗?
2、如果简单修改其中 8 位为校验,选那 8 位合适呢?
3、由于 DES_string_to_key 能处理“任意长度”的输入,这暗示它采用了某个类似 md5 之类的单向算法来处理输入。

[ 本帖最后由 win_hate 于 2009-6-5 08:52 编辑 ]
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP