3DES加密解密算法,在32位机器和64位机器上面,结果不一致.

meadking 2011-09-14 08:42:25
源代码:
http://svn.openmoko.org/trunk/src/host/qemu-neo1973/d3des.c

背景:我用java调用C的dll结果在64位和32位的机器上面,结果不一致.导致错误.
目前要以32位的结果为标准.

分析:里面使用了大量的register,unsigned long
register unsigned long *cook, *raw0;

谁能给个解决方案:
1,使用类型重新定义,限定32位长度,
2,换个兼容的编译器,
3,使用Java重新DES,(java64位和32位估计也不靠谱)

谢谢大家.
...全文
398 9 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
9 条回复
切换为时间正序
请发表友善的回复…
发表回复
jackyjkchen 2011-09-14
  • 打赏
  • 举报
回复
openssl里我记得也有2des

long问题非常复杂,VC x64的long是32位,gcc x64是64位

如果不考虑16位的编译器,这样是可以的


#if defined(__x86_64__) || (defined(__sparc__) && defined(__arch64__)) || (defined(_MSC_VER) && defined(_M_X64))
typedef unsigned int ulong32;
#else
typedef unsigned long ulong32;
#endif

cfvmario 2011-09-14
  • 打赏
  • 举报
回复
[Quote=引用 7 楼 xblue3 的回复:]

引用 1 楼 mougaidong 的回复:
register不会影响你的结果,这个是存储类型关键字。
但是 long,这个问题很明显了,他在32位机上占32位,64位机上占64位。
所以,这个一定要固定住。

请问,这个long怎么限定?
有code吗?
java男对C男表示无比崇敬...
[/Quote]
<stdint.h>
用intxx_t系列定义
meadking 2011-09-14
  • 打赏
  • 举报
回复
[Quote=引用 1 楼 mougaidong 的回复:]
register不会影响你的结果,这个是存储类型关键字。
但是 long,这个问题很明显了,他在32位机上占32位,64位机上占64位。
所以,这个一定要固定住。
[/Quote]
请问,这个long怎么限定?
有code吗?
java男对C男表示无比崇敬...
meadking 2011-09-14
  • 打赏
  • 举报
回复
谢谢前辈赐教...
问题在于,这个代码也是古董级员工留下的.
使用的还是DES2,(des2key,D2des),
输入:
key密码,0-15位长度
s1待加密,0-16位长度
s2返回结果,32位固定长度.
==========
目前比较疑惑的是,为何每次输出都是32位长度.有木有代替D2DES的函数?

D2des输出是16位长.des 是8位加密,D2des是8*2=16位.
//奇数偶数,分别填充到32位的char中 for (i=0; i<16;i++)



int hsEncrypt(const char *key,const char *s1,char *s2)
{
unsigned char key2[16],tmp1[16],tmp2[16];
char tmpKey[16];
int i;

if(strlen(s1)>16)
return -1;
if(strlen(key)>15)
return -1;
//分配内存
memset(tmpKey, 0, sizeof(tmpKey));
//复制数据
memcpy(tmpKey, key, strlen(key));
//输入密码password ,double数字类型
//生成16byte随机密钥 ,给下面的函数使用
make2key(tmpKey,key2);
// hexkey[16] MODE
// 十六进制的key,mode=
des2key(key2,0);
//复制数据
memset(tmp1, 0, sizeof(tmp1));
memcpy(tmp1, s1, strlen(s1));
//根据寄存器里面的key值,进行加密,或者解密
D2des(tmp1,(unsigned char *)tmp2);



//奇数偶数,分别填充到32位的char中
for (i=0; i<16;i++)
{
//存整数
s2[i*2] = tmp2[i]/16 +( (tmp2[i]/16>=10)?'A'-10:'0' );
//存余数,
s2[i*2+1] = tmp2[i]%16 +( (tmp2[i]%16>=10)?'A'-10:'0' );
}
s2[32]='\0';

return 0;
}
xunxun 2011-09-14
  • 打赏
  • 举报
回复
写的qemu嘛,很正常
jackyjkchen 2011-09-14
  • 打赏
  • 举报
回复
看copyright,都是哪一年的古董了

* Copyright (C) 1999 AT&T Laboratories Cambridge. All Rights Reserved.


* Copyright (c) 1988,1989,1990,1991,1992 by Richard Outerbridge.
* (GEnie : OUTER; CIS : [71755,204]) Graven Imagery, 1992.
jackyjkchen 2011-09-14
  • 打赏
  • 举报
回复
看了下它的代码,竟然还是古老的K&R风格,而且大量使用现代计算机平台和编译器基本没有用处的register关键字

典型的烂算法库,丢掉它
jackyjkchen 2011-09-14
  • 打赏
  • 举报
回复
一个非主流的算法库,根本没考虑跨平台,加密算法是字长敏感的,gcc的数据模型。long在32位和64位下长度不同

请使用openssl、tomcrypt等

这不是你的问题,是算法库的问题

基础库绝对不要随便上网下代码
turing-complete 2011-09-14
  • 打赏
  • 举报
回复
register不会影响你的结果,这个是存储类型关键字。
但是 long,这个问题很明显了,他在32位机上占32位,64位机上占64位。
所以,这个一定要固定住。

70,020

社区成员

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

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