¿Cómo puedo verificar una firma de DSA en C#?Verificar una firma de DSA en C# que está usando formato ASR.1 codificado en BER/DER
Dado:
- el texto del mensaje,
- un compendio firmado (típicamente formato DER ASN.1),
- la clave pública (en un certificado X.509 firmado, PEM o DER formato)
he intentado una serie de enfoques, pero no han tenido ningún éxito:
OpenSSL.NET: varios errores extraños con la biblioteca; Tengo un open thread running with the author over on SourceForge pero aún no he podido resolverlo.
Microsoft .NET API: no se puede descomprimir la firma DER para fines de comparación. Una firma DSA tiene 40 bytes (dos enteros de 20 bytes), pero se presenta como una secuencia codificada DER de dos enteros, por lo que la longitud total puede variar de 46 a 48 bytes (consulte this post para obtener una descripción general rápida). Mientras .NET incluye código para analizar ASN.1/DER (porque puede leer certificados en formato DER), está enterrado profundamente, y no hay forma de acceder a él para que pueda recuperar correctamente los 40 bytes de la señal codificada ASN.1/DER. Este problema me llevó a la siguiente opción ...
BouncyCastle: a través del uso de las funciones
Org.BouncyCastle.Asn1
, puedo analizar la firma ASN.1 y tire de ella en que es valores enteros S componente R y. Pero cuando paso estos a las rutinas de verificación de la firma, está fallando sin explicación dada. No estoy seguro de si estoy haciendo algo mal, debido a que el C# API es completamente indocumentado, y la versión de Java está poco documentado (pero no hay ningún ejemplo o COMO información que puedo encontrar.)
Me he estado lanzando sobre este problema desde hace una semana. Sé que alguien debe haberlo hecho antes, pero no he encontrado ningún ejemplo completo/de trabajo.
Tengo aquí tres proyectos de C#, cada uno de los cuales está completo al 95% pero con un error crítico que hace que falle. Cualquier código de ejemplo de trabajo sería tremendamente apreciado.
editar: aquí hay un ejemplo de una firma que estoy tratando de verificar, convertida a Base64 y hexadecimal ASCII para que sea postable. Esta en particular es de 47 bytes, aunque con un analizador adecuado todavía tiene que aceptarlo, leer sobre la especificación DER para obtener más información (BER/DER agrega un líder de 00 para confirmar la señal si el MSB es 1)
Base64: MC0CFQCUgq2DEHWzp3O4nOdo38mDu8mStwIUadZmbin7BvXxpeoJh7dhquD2CTM=
ASCII Hex: 302d0215009482ad831075b3a773b89ce768dfc983bbc992b7021469d6666e29fb06f5f1a5ea0987b761aae0f60933
Estructura es por la especificación DER; se analiza de la siguiente manera:
30 2d: sequence, length 45 (may vary from 44 to 46)
02 15: integer, length 21 (first byte is 00 to confirm sign)
009482ad831075b3a773b89ce768dfc983bbc992b7
02 14: integer, length 20 (leading 00 not necessary for this one)
69d6666e29fb06f5f1a5ea0987b761aae0f60933
escribir mi propio analizador DER es realmente no es una opción, demasiado margen para el error y no tiene que haber una manera de hacer esto correctamente.
Me preguntaba si podría hacerme un favor y cambiar el título de "Verificar firma DSA en C#" a "Verificar firma DSA en C# con formato ASN.1" o algo por el estilo. Podría ayudar a buscar personas un poco. – Greg
Solo como un comentario; Voy por el otro camino (verifique una firma en Java que fue creada en .NET); Tuve que escribir un convertidor del formato .NET DSA (que es simplemente r || s en 40 bytes) al formato DER. De acuerdo con lo que encontré aquí (http://www.mombu.com/microsoft/security-crypto/t-dsa-signature-format-674106.html), el formato DER espera que r y s sean big-endian pero que no lo hicieron No funciona en absoluto así que lo dejé como pequeño endian y funciona ... No he encontrado nada muy claro en esto; debería ser grande o poco indio ... si alguien sabe, por favor, toque el timbre! – SonarJetLens