DSA Genera diferentes firmas con los mismos datos [cerrado]

2

Estoy usando el ejemplo dado en msdn artículo sobre la Clase DSACryptoServiceProvider. El problema es que recibo una firma diferente cada vez que ejecuto el código. Probé OpenSSL y no tuve este problema, pero necesito trabajar con System.Security.Cryptography esta vez.

Este es un código fuente: este es el valor hash que se firmará

byte[] HashValue =
        {
            59, 4, 248, 102, 77, 97, 142, 201,
            210, 12, 224, 93, 25, 41, 100, 197,
            213, 134, 130, 135
        };

y aquí es donde radica el problema

 // The value to hold the signed value.
        byte[] SignedHashValue1 = DSASignHash(HashValue, privateKeyInfo, "SHA1");
        byte[] SignedHashValue2 = DSASignHash(HashValue, privateKeyInfo, "SHA1");

Usé el depurador para averiguar que SignedHashValue1 no es igual a SignedHashValue2

    
pregunta Ibrahim.I 13.12.2013 - 17:05
fuente

1 respuesta

9

Las implementaciones tradicionales de DSA eligen un nonce aleatorio para cada operación de firma. Esto lleva a una firma diferente, incluso cuando se firman los mismos datos. El problema no es que la firma sea diferente cada vez, es una expectativa errónea de que debería ser la misma.

Consulte Wikipedia en DSA para obtener más información:

  

Firma

     
  • Generar un mensaje aleatorio k
  •   
  • Calcula r desde k
  •   
  • Calcule s desde r y la clave privada
  •   
  • La firma es (r, s)
  •   

Como k difiere para cada mensaje, la firma también es diferente. Este k aleatorio es esencial para la seguridad de DSA.

Una buena alternativa a un $ k $ aleatorio lo deriva de la clave privada y el hash del mensaje mediante hash. Esto se comporta como un valor aleatorio desde el punto de vista de un atacante, pero evita fallas catastróficas cuando se genera una firma usando un PRNG débil. Este enfoque resultará en la misma firma al firmar los mismos datos. RFC6979 - Uso determinista del algoritmo de firma digital (DSA) y            El algoritmo de firma digital de curva elíptica (ECDSA) especifica una manera de hacer esto.

No debe intentar verificar una firma DSA firmando de nuevo y comparando. Debe utilizar la operación de verificación especializada utilizando la clave pública. Las firmas son útiles porque no necesita la clave privada para verificar una firma.

Si puede usar la misma clave para firmar y verificar, debe considerar usar un MAC en lugar de una firma. HMAC-SHA-2 es la que yo recomiendo.

    
respondido por el CodesInChaos 13.12.2013 - 17:36
fuente

Lea otras preguntas en las etiquetas