Hash 为什么mbedTLS ECDSA签名依赖于哈希算法?

Hash 为什么mbedTLS ECDSA签名依赖于哈希算法?,hash,cryptography,digital-signature,mbed,polarssl,Hash,Cryptography,Digital Signature,Mbed,Polarssl,我目前正在使用mbedTLS(以前的polarSSL)库对哈希消息进行签名。我目前一直在使用显而易见的功能: int mbedtls_ecdsa_write_signature( mbedtls_ecdsa_context *ctx, mbedtls_md_type_t md_alg, const unsigned char *hash, size_t hlen, unsigned char *sig,

我目前正在使用mbedTLS(以前的polarSSL)库对哈希消息进行签名。我目前一直在使用显而易见的功能:

int mbedtls_ecdsa_write_signature( mbedtls_ecdsa_context *ctx, mbedtls_md_type_t md_alg,
                       const unsigned char *hash, size_t hlen,
                       unsigned char *sig, size_t *slen,
                       int (*f_rng)(void *, unsigned char *, size_t),
                       void *p_rng )
这似乎工作正常,但我对给定的参数
mbedtls\u md\u type\u t md\u alg
有问题。此参数标识用于给定哈希的消息摘要算法

md_alg
是在“md.h”中定义的枚举,描述了以下值:

enum mbedtls\u md\u type\u t{
MBEDTLS_MD_NONE=0,MBEDTLS_MD_MD2,MBEDTLS_MD_MD4,MBEDTLS_MD_MD5,
MBEDTLS_MD_SHA1,MBEDTLS_MD_SHA224,MBEDTLS_MD_SHA256,MBEDTLS_MD_SHA384,
MBEDTLS_MD_SHA512,MBEDTLS_MD_RIPEMD160
}

由于我需要使用SHA3(keccak 256)作为散列算法,所以mbedTLS不提供此功能。我现在使用另一种方法进行散列,并将SHA3散列放入
mbedtls\u ecdsa\u write\u signature()
函数中

作为
md_alg
参数,我尝试了定义消息摘要算法的不同值,并得到以下输出:

(md_alg)+签名:(len:长度)
签名

(3)+签名:(len:70)304402206AD43BB99B8D97A0890ED7295BDDF8E826AF44AA1FAC9B471EBD415078F3194C02204C0DE87286C2C2B6160B7410A7692DE0995FE79347752A1E828E829FFD981257
(4) +签名:(len:72)3046022100D8C89CD146F08ECA0ACCD66AD0FAF07D8ED761602EB5DAC8E4F2B6E9634EBC40221008975883BAE04B40B46044AD5910CC704039F7B46DDCBA46344E065687798B2E605
(5) +签名:(len:71)3045022100EBDFC64BC39F7753E5255AED340CFB8946584B7D2AAF5F32A611BFF29631CFC0202233084DD8E96598483F2BEAFACD03E5D8449511A3F6BAB85175158950333084
(6) +签名:(len:71)304502200E7220C8697456CA3151C967EEB2DB6AD6F9E6ACB740E7980D41582496635228022100A01FA55C71A30D042C5932498C0F69ADAB81F5026E5CC0204A30421783B814C
(7) +签名:(len:71)3045022100ADBC91C37D20EA747B9854C26CFE067311C86A168FE8B06237C1D0EB2F8E6F0402004B99EE9B920B57BAE1BFCED6BD7ED3C48571BC4D7326F67EC90AF045AC193
(8) +签名:(len:71)3045022027CC7F76558EF628370E3554B575A0FD15F55952AB2E1CC30AC51A21DEFAE1AC022100974FF2012E05057FF0674E78235BD08B7C54C2547CAC63EDD160245A309
(9) +签名:(len:70)3044022059512D16AC85EB8BFDFDFD488A497A0CAA28AEA0A53F280FD7FDB4297C4D49DBD02200AAD2F32B63C76B82B75F3C97F55E55E5D895C3A8717D5E617AAFD7E8788E4311F

如您所见,为md_alg选择不同的值会导致不同的签名(给定相同的散列和私钥)

到目前为止,我一直在查看“ecdsa.c”源文件,找不到为什么为
md_alg
选择不同的值会导致不同的输出签名的原因

对于使用SHA3散列,我可以做些什么不同的事情吗?为什么签名彼此不同

谢谢

简短回答:

  • 你不需要做任何不同的事情
  • 签名不同,因为签名算法是随机的
这是因为传递给
mbedtls\u ecdsa\u write\u签名的
mbedtls\u md\u type\u md\u alg
的目的不是指示用于创建给定哈希的算法

所发生的是,该算法基于给定的
md_alg
构造一个伪随机生成器(hmac-drbg),并使用私钥对其进行种子。现在,如果散列算法不同,那么伪随机序列将不同,这使得签名本身也不同