2016-10-17 2 views
1

Je travaille actuellement à la signature d'un message haché à l'aide de la bibliothèque mbedTLS (anciennement polarSSL). Je suis actuellement coincé à l'aide de la fonction évidente:Pourquoi la signature mbedTLS ECDSA dépend-elle de l'algorithme de hachage?

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) 

Il semble que cela fonctionne correctement, mais j'ai un problème avec le paramètre donné mbedtls_md_type_t md_alg. Ce paramètre identifie l'algorithme de résumé de message utilisé pour le hachage donné.

md_alg est un ENUM défini dans « md.h » et décrit les valeurs suivantes:

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 }

Comme je l'ai besoin d'utiliser les SHA-3 (256) keccak comme un algorithme de hachage, mbedTLS ne offre ce. Je suis maintenant hashing en utilisant une autre méthode et mis dans le hachage SHA3 dans la fonction mbedtls_ecdsa_write_signature().

Comme md_alg paramètre j'ai essayé les différentes valeurs qui définissent le algorithme de hachage et je reçois la sortie suivante:

(md_alg) + Signature: (len: length) signature

(3) + Signature: (len: 70) 304402206AD43BB99B8D97A0890ED7295BDDF8E826AF44AA1FAC9B471EBD415078F3194C02204C0DE87286C2C2B6160B7410A7692DE0995FE79347752A1E828E829FFD981257 (4) + Signature: (len: 72) 3046022100D8C89CD146F08ECA0ACCD66AD0FAF07D8ED761602EBB5DAC8E4F2B6E9634EBC4022100897583BAE04B0B46044AD5910CC704039F7B46DDCBA46344E065687798B2E605 (5) + Signature: (len: 71) 3045022100EBDFC64BC39F77753E5255AED340CFB8946584B7D2AAF5F32A611BFF29631CFC022DD8E96598483F2BEAFACD03E5D8449511A3F6BAB85175158950333084 (6) + Signature: (len: 71) 304502200E7220C8697456CA3151C967EEB2DB6AD6F9E6ACB740E7980D41582496635228022100A01FA55C71A30D042C5932498C0F69ADAB81F5026E5CC0204A304217883B814C (7) + Signature: (len: 71) 3045022100ADBC91C37D20EA747B9854C26CFE067311C86A168FE8B06237C1D0EB2F8E6F04022004B99EE9B920B57BAE1BFFCED6BDD7ED3C48571BC4D7326F67EC90AF045AC193 (8) + Signature: (len: 71) 3045022027CC7F76558EF628370E3554B575A0FD15F55952AB2E1CC30AC51A21DEFAE1AC0221009746FF2012E005057BFF0674E78235BD08B7C54C2547CAC63EDD5B160245A309 (9) + Signature: (len: 70) 3044022059512D16AC85EB8BFDFBD488A497A0CAA28AEA0A53F280FD7FDB4297C4D49DBD02200AAD2F32B63C76B82B75F3C97F555E5D895C3A8717D5E617AAFD7E8788E4311F

Comme vous pouvez le voir, le choix des valeurs différentes pour md_alg donne des signatures différentes (avec les mêmes hash et private_key). Jusqu'à présent, j'ai regardé le fichier source 'ecdsa.c' et je ne trouve pas de raison pour laquelle le fait de choisir des valeurs différentes pour md_alg donne des signatures de sortie différentes.

Y at-il quelque chose que je peux faire différemment pour utiliser un hachage SHA3 et pourquoi la signature diffère-t-elle l'une de l'autre?

Merci

Répondre

1

Réponses courtes:

  • vous n'avez pas besoin de faire quoi que ce soit différemment
  • les signatures diffèrent parce que l'algorithme de signature est aléatoire

En effet, le Le but du mbedtls_md_type_t md_alg passé à mbedtls_ecdsa_write_signature n'est pas d'indiquer l'algorithme qui a été utilisé pour créer le hachage donné.

Ce qui se passe, c'est que l'algorithme construit un générateur pseudo-aléatoire (hmac-drbg) basé sur le md_alg donné et l'ensemence avec la clé privée. Maintenant, si l'algorithme de hachage est différent, alors la séquence pseudo-aléatoire sera différente et cela rendra la signature elle-même différente.