SHA1 面向位的测试向量在 openssl 下给出错误的摘要
SHA1 bit-oriented test vector gives wrong digest under openssl
所以我看到了这个测试向量列表来测试 SHA1 实现的有效性(您可以在 http://csrc.nist.gov/groups/STM/cavp/secure-hashing.html 的底部找到它)
大多数称为 "short" 的测试向量(因为它们的大小小于块大小)通过。但是,对于所有长测试向量,openssl 输出的摘要与预期的摘要不同。
示例:
Msg = d372b4bf97daa3be77e0d78c123c7bb39dde10c82824c83f2250308320391247da419a167686b7320a5dc49b5cfc686eec76bb7034edaaeb2e029cb91791569e739c1bdb518418ffd07f0001e0
Expected MD = c60a02fffa45deccb075e386be3aa9313c2df4f2
Openssl output = 77 2d ff f3 54 31 2c df 93 e1 94 2f 10 91 f7 f8 78 61 91 c1
N.B :测试向量是为面向比特的实现而制作的。我的理解是,这种实现可以计算大小不一定是字节倍数的消息摘要。
有人知道为什么会这样吗?
您回答了您自己的问题,您正在尝试验证位模式,但 OpenSSL 仅支持字节模式。或者,至少,他们只获得了字节模式的 FIPS CAVP 证书:http://csrc.nist.gov/groups/STM/cavp/documents/shs/shaval.html#2465
SHA-1 (BYTE-only)
SHA-224 (BYTE-only)
SHA-256 (BYTE-only)
SHA-384 (BYTE-only)
SHA-512 (BYTE-only)
如果您需要经认证可提供 BIT 值正确答案的库,请在该列表中搜索 "SHA-1 (BIT)"。不过有几个,不知道有多少是消耗品API。
或者,字节对齐你的数据。
因此,针对您的评论,我认为当您使用 NIST 测试向量时,输出的关键区别在于指定的长度在进行面向位的输出时非常重要。对于面向字节的输出,如果 NIST 消息是 98
,您可以确信 SHA 算法的正确输入是字节 b10011000
。但是,如果它是面向位的,例如它可能有 len = 6
,在这种情况下,算法的正确输入是 b100110
。或者 len = 7
和 b1001100
。
所以我看到了这个测试向量列表来测试 SHA1 实现的有效性(您可以在 http://csrc.nist.gov/groups/STM/cavp/secure-hashing.html 的底部找到它)
大多数称为 "short" 的测试向量(因为它们的大小小于块大小)通过。但是,对于所有长测试向量,openssl 输出的摘要与预期的摘要不同。
示例:
Msg = d372b4bf97daa3be77e0d78c123c7bb39dde10c82824c83f2250308320391247da419a167686b7320a5dc49b5cfc686eec76bb7034edaaeb2e029cb91791569e739c1bdb518418ffd07f0001e0
Expected MD = c60a02fffa45deccb075e386be3aa9313c2df4f2
Openssl output = 77 2d ff f3 54 31 2c df 93 e1 94 2f 10 91 f7 f8 78 61 91 c1
N.B :测试向量是为面向比特的实现而制作的。我的理解是,这种实现可以计算大小不一定是字节倍数的消息摘要。
有人知道为什么会这样吗?
您回答了您自己的问题,您正在尝试验证位模式,但 OpenSSL 仅支持字节模式。或者,至少,他们只获得了字节模式的 FIPS CAVP 证书:http://csrc.nist.gov/groups/STM/cavp/documents/shs/shaval.html#2465
SHA-1 (BYTE-only)
SHA-224 (BYTE-only)
SHA-256 (BYTE-only)
SHA-384 (BYTE-only)
SHA-512 (BYTE-only)
如果您需要经认证可提供 BIT 值正确答案的库,请在该列表中搜索 "SHA-1 (BIT)"。不过有几个,不知道有多少是消耗品API。
或者,字节对齐你的数据。
因此,针对您的评论,我认为当您使用 NIST 测试向量时,输出的关键区别在于指定的长度在进行面向位的输出时非常重要。对于面向字节的输出,如果 NIST 消息是 98
,您可以确信 SHA 算法的正确输入是字节 b10011000
。但是,如果它是面向位的,例如它可能有 len = 6
,在这种情况下,算法的正确输入是 b100110
。或者 len = 7
和 b1001100
。