Python md5一个字符串多次在不同的平台上得到不同的结果

Python md5一个字符串多次在不同的平台上得到不同的结果,python,openssl,md5,Python,Openssl,Md5,t、 c 还有t.py all: cc t.c -Wall -L/usr/local/lib -lcrypto 在Debian6 x86和MacOS 10.6上使用python脚本的结果是相同的: #!/usr/bin/env python import hashlib import binascii src = 'abcdef' a = hashlib.md5(src).digest() b = hashlib.md5(a).digest() c = hashlib.md5(b).he

t、 c

还有t.py

all:
cc t.c -Wall -L/usr/local/lib -lcrypto
在Debian6 x86和MacOS 10.6上使用python脚本的结果是相同的:

#!/usr/bin/env python

import hashlib
import binascii

src = 'abcdef'

a = hashlib.md5(src).digest()
b = hashlib.md5(a).digest()
c = hashlib.md5(b).hexdigest().upper()

print binascii.b2a_hex(a)
print binascii.b2a_hex(b)
print c
MacOS上的c版本是:

e80b5017098950fc58aad83c8c14978e
b91282813df47352f7fe2c0c1fe9e5bd
85E4FBD1BD400329009162A8023E1E4B
为什么它不同于Debian6?

Debian环境:

len: 6 
e80b5017098950fc58aad83c8c14978e
len: 48 
eac9eaa9a4e5673c5d3773d7a3108c18
len: 64 
73f83fa79e53e9415446c66802a0383f
gcc (Debian 4.4.5-8) 4.4.5
Python 2.6.6
Linux shuge-lab 2.6.26-2-686 #1 SMP Thu Nov 25 01:53:57 UTC 2010 i686 GNU/Linux
OpenSSL是从测试存储库安装的

MacOS环境:

len: 6 
e80b5017098950fc58aad83c8c14978e
len: 48 
eac9eaa9a4e5673c5d3773d7a3108c18
len: 64 
73f83fa79e53e9415446c66802a0383f
gcc (Debian 4.4.5-8) 4.4.5
Python 2.6.6
Linux shuge-lab 2.6.26-2-686 #1 SMP Thu Nov 25 01:53:57 UTC 2010 i686 GNU/Linux
OpenSSL是从MacPort安装的

i686-apple-darwin10-gcc-4.2.1 (GCC) 4.2.1 (Apple Inc. build 5666) (dot 3)
Python 2.7.1
Darwin Lees-Box.local 10.7.0 Darwin Kernel Version 10.7.0: Sat Jan 29 15:17:16 PST 2011; root:xnu-1504.9.37~1/RELEASE_I386 i386

我认为您正为MD5结果分配字节,而没有结束
\0
。然后,您将计算内存块的MD5,该内存块以先前MD5计算的结果开始,但后面有一些随机字节。您应该为结果多分配一个字节,并将其设置为
\0

我的建议:

openssl @1.0.0d (devel, security)
    OpenSSL SSL/TLS cryptography library

您不会终止传递给
md5
的字符串(
'\0'
) 假设接受一个以
'\0'
结尾的字符串,因为您没有将 长度)。代码

...
unsigned char * result1 = (unsigned char *)malloc(MD5_DIGEST_LENGTH + 1);
result1[MD5_DIGEST_LENGTH] = 0;
...
完全损坏:
sizeof(strlen(i))
sizeof(size\u t)
,在典型机器上为4或8。但是你不想要这个
memset
无论如何。尝试将这些替换为:

memset( data, 0, sizeof( strlen( i ) ) );
memcpy( data, i, strlen( i ) );
或者更好:

strcpy( data, i );
,然后将
i.c_str()
传递到
md5
(并声明
md5
以获取
字符
const*
(我也会在
md5()
中使用
std::vector
, 然后让它返回它。
unsigned\u to\u signed\u char
将接受
std::vector
和return
std::string

到目前为止,我认为答案似乎没有足够清楚地说明问题。具体而言,问题在于这行:

std::string i( "abcdef" );

您传入的数据块未被终止,因此更新调用可能会尝试处理MD5_DIGEST_长度缓冲区结尾以外的更多字节。简而言之,停止使用
strlen()
计算任意字节缓冲区的长度:您知道缓冲区应该有多长,所以请传递长度。

您能在
MD5_Init()和
MD5_Update()之间打印
strlen(in)
的结果吗这个代码是不是应该是C或C++的?这就是代码的结果。我认为MD5结果不是问题;它是一个数组的代码:>无符号char < /> >固定长度的二进制数据,他使用<代码> SaMPTF< <代码>转换为<代码> char const */COD>,它附加了<代码> 0”< />代码>。(但是对于二进制数据使用
std::vector
,对于字符串使用
std::string
)整个过程更简单更清晰。)James,长度是固定的,但对于
strlen()
。我的建议是添加空终止符,但作者也可以为
md5()添加第二个参数
具有该函数将计算的内存块长度的函数。