我目前正在使用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_md_type_t md_alg
有疑问。此参数标识用于给定哈希的消息摘要算法。
md_alg
是'md.h'中定义的枚举,描述了以下值:
enum mbedtls_md_type_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_ecdsa_write_signature()
函数。
作为md_alg
参数,我尝试了定义消息摘要算法的不同值,并得到以下输出:
(md_alg) + Signature: (len: length)
signature
(3) + Signature: (len: 70) 304402206AD43BB99B8D97A0890ED7295BDDF8E826AF44AA1FAC9B471EBD415078F3194C02204C0DE87286C2C2B6160B7410A7692DE0995FE79347752A1E828E829FFD981257
(4) + Signature: (len: 72) 3046022100D8C89CD146F08ECA0ACCD66AD0FAF07D8ED761602EBB5DAC8E4F2B6E9634EBC4022100897583BAE04B0B46044AD5910CC704039F7B46DDCBA46344E065687798B2E605
(5) + Signature: (len: 71) 3045022100EBDFC64BC39F77753E5255AED340CFB8946584B7D2AAF5F32A611BFF29631CFC02201233084DD8E96598483F2BEAFACD03E5D8449511A3F6BAB85175158950333084
(6) + Signature: (len: 71) 304502200E7220C8697456CA3151C967EEB2DB6AD6F9E6ACB740E7980D41582496635228022100A01FA55C71A30D042C5932498C0F69ADAB81F5026E5CC0204A304217883B814C
(7) + Signature: (len: 71) 3045022100ADBC91C37D20EA747B9854C26CFE067311C86A168FE8B06237C1D0EB2F8E6F04022004B99EE9B920B57BAE1BFFCED6BDD7ED3C48571BC4D7326F67EC90AF045AC193
(8) + Signature: (len: 71) 3045022027CC7F76558EF628370E3554B575A0FD15F55952AB2E1CC30AC51A21DEFAE1AC0221009746FF2012E005057BFF0674E78235BD08B7C54C2547CAC63EDD5B160245A309
(9) + Signature: (len: 70) 3044022059512D16AC85EB8BFDFBD488A497A0CAA28AEA0A53F280FD7FDB4297C4D49DBD02200AAD2F32B63C76B82B75F3C97F555E5D895C3A8717D5E617AAFD7E8788E4311F
如您所见,为md_alg选择不同的值会产生不同的签名(给定相同的散列和private_key)。
到目前为止,我一直在查看'ecdsa.c'源文件,但无法找到为什么为md_alg
选择不同值导致不同输出签名的原因。
对于使用SHA3哈希,我有什么不同的做法,为什么签名会有所不同?
谢谢
答案 0 :(得分:1)
简答:
这是因为传递给mbedtls_md_type_t md_alg
的{{1}}的目的不是指示用于创建给定哈希的算法。
该算法会根据给定的mbedtls_ecdsa_write_signature
构造伪随机生成器(hmac-drbg)并使用私钥对其进行种子处理。现在,如果哈希算法不同,那么伪随机序列将是不同的,这使得签名本身也不同。