manifiestos los firmar crear certificado c# cryptography digital-signature public-key-encryption x509

c# - los - ¿Cómo verificar la firma, cargando PUBLIC KEY del archivo CRT?



crear certificado ssl (1)

Sospecho que el uso de UnicodeEncoding podría ser la razón de los fallos. Como se muestra a continuación, los bytes de ASCIIEncoding y UnicodeEncoding no son los mismos por la razón de que ASCII es una codificación de 8 bits y, en Windows, la codificación de Unicode es de 16 bits de ancho. En su otra pregunta No puede obtener la firma que ha utilizado el ASCIIEncoding. Por lo tanto, suponiendo que la firma se calcula en los bytes de codificación ASCIIE del texto / cadena y verifique que el uso de UnicodeEncoding, obviamente, no coincidirá.

string text = "Hello"; Console.WriteLine("ASCIIEncoding bytes length: {0}", new ASCIIEncoding().GetBytes(text).Length); Console.WriteLine("UnicodeEncoding bytes length: {0}", new UnicodeEncoding().GetBytes(text).Length);

Salidas

ASCIIEncoding bytes length: 5 UnicodeEncoding bytes length: 10

Revisé muchos foros y ejemplos, pero ninguno me ayudó. Necesito verificar la firma de cualquier servicio web. Tengo el archivo test.crt con clave pública para verificar.

static bool Verify(string text, string signature) { X509Certificate2 cert = new X509Certificate2( HttpContext.Current.Server.MapPath("test-server.cert")); RSACryptoServiceProvider csp = (RSACryptoServiceProvider) cert.PublicKey.Key; // Hash the data SHA1Managed sha1 = new SHA1Managed(); UnicodeEncoding encoding = new UnicodeEncoding(); byte[] data = encoding.GetBytes(text); byte[] sign = Convert.FromBase64String(signature); byte[] hash = sha1.ComputeHash(data); return csp.VerifyHash(hash, CryptoConfig.MapNameToOID("SHA1"), sign); }

Pero el resultado es siempre falso :(

Tengo un ejemplo de OpenSSL:

openssl base64 -d -in signature -out signature.bin openssl dgst -sha1 -verify test-server.pub -signature signature.bin from_gateway