【问题标题】:OpenSSL SHA1 not validating NIST SHAKE test vector?OpenSSL SHA1 不验证 NIST SHAKE 测试向量?
【发布时间】:2023-03-30 01:07:01
【问题描述】:

我编写了一个调用 OpenSSL SHA1 来生成摘要的 C 代码,但我生成的摘要不匹配。

#define MSG_SIZE 190
#include <stdio.h>
#include <string.h>
#include <openssl/sha.h>

void str2hex(char *str, unsigned char *hex, int len) {
 int tt, ss;
 char temp[5];
 for (tt = 0, ss = 0; tt < len, ss < 2 * len; tt++, ss += 2) {
   temp[0] = '0';
   temp[1] = 'x';
   temp[2] = str[ss];
   temp[3] = str[ss + 1];
   temp[4] = 0;

  hex[tt] = strtol(temp, NULL, 0);
 }
}

int main() {
 unsigned char digest[MSG_SIZE],stringt[MSG_SIZE];
 int i;
 char *string = "df1300";

 str2hex(string, stringt, MSG_SIZE);

 SHA_CTX ctx;
 SHA1_Init(&ctx);
 SHA1_Update(&ctx, stringt, strlen(string)/2);
 SHA1_Final(digest, &ctx);

 printf("SHA1 digest\n");

 for (i = 0; i < 16; i++)
   printf("%02x", digest[i]);

 printf("\n");
 return 0;
}

我收到的输出是

SHA1 digest
0450c758f08f726ef77880a15118a237

但输出应该是(来自 NIST 的 SHAKE 测试向量):

daf289eea10de7fef76e085ad70a3bc6

如果有人可以查看我的代码并让我知道我哪里做错了,那将会很有帮助。

【问题讨论】:

    标签: c openssl cryptography sha


    【解决方案1】:

    除了显示在 20 个字节的前 16 个字节之外,您已经计算出正确答案。

    $ echo df1300 | xxd -r -p | openssl dgst -sha1
    (stdin)= 0450c758f08f726ef77880a15118a2379e45f032
    
    $ echo df1300 | xxd -r -p | sha1sum
    0450c758f08f726ef77880a15118a2379e45f032  -
    

    http://csrc.nist.gov/groups/STM/cavp/secure-hashing.html#shavs (FIPS 180-4) 的 CAVP 测试向量没有将 df1300 列为测试用例,因此不清楚您在采购什么以及为什么它是错误的。

    既然你在做 16 个字节,也许你的意思是 MD5?让我们都尝试一下:

    $ openssl dgst -?
    ...
    -md4            to use the md4 message digest algorithm
    -md5            to use the md5 message digest algorithm
    -ripemd160      to use the ripemd160 message digest algorithm
    -sha            to use the sha message digest algorithm
    -sha1           to use the sha1 message digest algorithm
    -sha224         to use the sha224 message digest algorithm
    -sha256         to use the sha256 message digest algorithm
    -sha384         to use the sha384 message digest algorithm
    -sha512         to use the sha512 message digest algorithm
    -whirlpool      to use the whirlpool message digest algorithm
    
    $ echo df1300 | xxd -r -p | openssl dgst -md4
    (stdin)= 76dfc0e2cf5e5206ed12237d98018416
    $ echo df1300 | xxd -r -p | openssl dgst -md5
    (stdin)= 7fca8bd4d9be0b3f0e1783ad3aed3413
    $ echo df1300 | xxd -r -p | openssl dgst -ripemd160
    (stdin)= 30797300cf85c2c5f9135053a757b578cb5856f4
    $ echo df1300 | xxd -r -p | openssl dgst -sha
    (stdin)= 01f78f8a5c08ccb197d01c005f203e326bf435a2
    $ echo df1300 | xxd -r -p | openssl dgst -sha1
    (stdin)= 0450c758f08f726ef77880a15118a2379e45f032
    $ echo df1300 | xxd -r -p | openssl dgst -sha224
    (stdin)= 1b680a76915e27d88c269d63817e04dbca207dd38cca7e9d927a3c40
    $ echo df1300 | xxd -r -p | openssl dgst -sha256
    (stdin)= f0ac1a347ed5d335113b20a763533bea7d7fff610f5f143d811297aa95dd5f0a
    $ echo df1300 | xxd -r -p | openssl dgst -sha384
    (stdin)= 6b18f2ef884a7126d88389b4410e46524b0f501af3f847eb4c4fe0e97ffc24735e30a247799768cac4c38d0d85235502
    $ echo df1300 | xxd -r -p | openssl dgst -sha512
    (stdin)= 4752e6b0bc2d2e80dec50546ea0eb8aad04b944193c3f1eda7b82c2c0bab042ccad2f20f609b8f1dd6abbc3b480d0478a2cf636a3a917706ed785b0d56375a3c
    $ echo df1300 | xxd -r -p | openssl dgst -whirlpool
    (stdin)= f19a5cd03adb2856eec83f88e8d39d34ac591d61e37fbb3831a82a12177d19a761b08df38a4f8d591a694cfd0ff81ef46651d943b4fabec192f64cb4befd00ac
    

    但无论是大端还是小端表示,这些都不像您的预期值。也许您正在查看 HMAC?

    为了交叉检查 OpenSSL 的准确性,我们以 CAVP11 数据集为例,该数据集也是三个字节:

    Len = 24
    Msg = df4bd2
    MD = bf36ed5d74727dfd5d7854ec6b1d49468d8ee8aa
    
    $ echo df4bd2 | xxd -r -p | openssl dgst -sha1
    (stdin)= bf36ed5d74727dfd5d7854ec6b1d49468d8ee8aa
    

    是的,看起来不错。

    【讨论】:

    • 我已经在csrc.nist.gov/groups/STM/cavp/secure-hashing.html#shavs (FIPS 180-4) 上发布了输入 CAVP 测试向量的详细信息,用于散列面向位的消息 (SHAKE128ShortMsg.rsp) Len = 18 Msg = df1300输出 = daf289eea10de7fef76e085ad70a3bc6
    • 那是我获取文件的地方,我在其中的任何一个(位或字节)中都没有看到这种情况。您在哪个文件中看到它?
    • 在我们提取shakebittestvectors.zip文件后,它们是不同的响应(rsp)文件,因为此输入存在于名为SHAKE128ShortMsg.rsp的文件中,第81行
    • SHAKE 是一种不同于 SHA1 的算法。
    • df4bd2 是 SHA1ShortMsg.rsp 中的第四个示例(来自“面向字节”套件)。 SHAKE 是 SHA-3 基础数学的一种模式,具有调用者定义的输出长度而不是固定的输出长度。请参阅 FIPS 202 (nvlpubs.nist.gov/nistpubs/FIPS/NIST.FIPS.202.pdf)
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2015-10-05
    • 2018-07-27
    • 1970-01-01
    • 2014-01-29
    • 2021-02-14
    • 2015-02-21
    相关资源
    最近更新 更多