Openssl 从SHA1消息获取消息摘要

Openssl 从SHA1消息获取消息摘要,openssl,cryptography,sha1,Openssl,Cryptography,Sha1,我正在看关于如何在平台上验证SHA1实现的这一页: 因此,我打开文件并查看测试值:它有数千行长,但这是开始(面向位的实现) 我关注第一个价值观: Len = 2 Msg = 40 MD = ec6b39952e1a3ec3ab3507185cf756181c84bbe2 我的理解是,有一条消息说openssl将获得MD,但是我没有得到与上面相同的MD echo -n "40" | xxd -r -p | openssl dgst -sha1 (stdin)= 9a78211436f6d4

我正在看关于如何在平台上验证SHA1实现的这一页:

因此,我打开文件并查看测试值:它有数千行长,但这是开始(面向位的实现)

我关注第一个价值观:

Len = 2
Msg = 40
MD = ec6b39952e1a3ec3ab3507185cf756181c84bbe2
我的理解是,有一条消息说openssl将获得MD,但是我没有得到与上面相同的MD

 echo -n "40" | xxd -r -p | openssl dgst -sha1 
 (stdin)= 9a78211436f6d425ec38f5c4e02270801f3524f8

你知道我做错了什么吗?其他值也不匹配。

你对数据的解释不正确
Len
是消息中的位数。通过在命令行上与openssl交互,您(据我所知)只能处理整个字节

因此,例如
Len=2
M=40
意味着您应该散列
0x40
(=
01
)的前两位,而不是整个字节(
01000000
)。在命令行上,我认为不可能为openssl提供长度不是8位的倍数的位流,因此如果要这样做,您必须直接与ssl库代码接口

但是,您可以测试长度为8位倍数的位模式:

0 bits:
echo -ne "" | openssl sha1
(stdin)= da39a3ee5e6b4b0d3255bfef95601890afd80709

8 bits:
echo -ne "\x5d" | openssl sha1
(stdin)= 4ff447b8ef42ca51fa6fb287bed8d40f49be58f1

16 bits:
echo -ne "\x53\xa1" | openssl sha1
(stdin)= c9066463926e470db1ba15cbd06e614dbf0bc9a7

etc...

你对数据的解释不正确
Len
是消息中的位数。通过在命令行上与openssl交互,您(据我所知)只能处理整个字节

因此,例如
Len=2
M=40
意味着您应该散列
0x40
(=
01
)的前两位,而不是整个字节(
01000000
)。在命令行上,我认为不可能为openssl提供长度不是8位的倍数的位流,因此如果要这样做,您必须直接与ssl库代码接口

但是,您可以测试长度为8位倍数的位模式:

0 bits:
echo -ne "" | openssl sha1
(stdin)= da39a3ee5e6b4b0d3255bfef95601890afd80709

8 bits:
echo -ne "\x5d" | openssl sha1
(stdin)= 4ff447b8ef42ca51fa6fb287bed8d40f49be58f1

16 bits:
echo -ne "\x53\xa1" | openssl sha1
(stdin)= c9066463926e470db1ba15cbd06e614dbf0bc9a7

etc...

可能重复几乎交叉张贴:堆栈溢出是一个编程和开发问题的网站。这个问题似乎离题了,因为它与编程或开发无关。请参见帮助中心中的。也许或者会是一个更好的提问的地方。另请参阅可能重复的几乎交叉张贴:Stack Overflow是一个用于编程和开发问题的网站。这个问题似乎离题了,因为它与编程或开发无关。请参见帮助中心中的。也许或者会是一个更好的提问的地方。另请参见OpenSSL的库接口,它也以字节(8位)为单位工作。您需要更改代码,或者编写自己的代码。OpenSSL的库接口也以字节(8位)为单位工作。您需要更改代码,或者编写自己的代码。这将是如此的范围。