Descargo de responsabilidad: Sé Java y la criptografía, pero mi conocimiento de C# y .NET es muy limitado. Estoy escribiendo aquí solo bajo la influencia de mis habilidades de Google-fu.
Suponiendo que se podía descifrar una clave privada RSA PKCS # 8 codificado, a continuación, por lo que leí en MSDN, el resto del código debería tener este aspecto:
byte[] hv = MD5.Create().ComputeHash(data);
RSACryptoServiceProvider rsp = new RSACryptoServiceProvider();
RSAParameters rsp = new RSAParameters();
// here fill rsp fields by decoding pkcs8PrivateKey
rsp.ImportParameters(key);
RSAPKCS1SignatureFormatter rf = new RSAPKCS1SignatureFormatter(rsp);
rf.SetHashAlgorithm("MD5");
byte[] signature = rf.CreateSignature(hv);
Las clases pertinentes están en el espacio de nombre System.Security.Cryptography
.
En cuanto a la decodificación de blob de clave PKCS # 8 (es decir, rellenando los campos rsp
), encontré this page que describe una utilidad de línea de comandos en C# que puede realizar ese trabajo. El código fuente se proporciona y es un único archivo C#. Por lo que leo en él, ese código decodifica el archivo PKCS # 8 "manualmente"; indirectamente, esto debería significar que .NET (2.0) en bruto no tiene facilidades para la decodificación del archivo de claves PKCS # 8 (de lo contrario, el autor de esa herramienta no se habría tomado la molestia de implementar dicha decodificación). Para la tarea que tiene entre manos, puede eliminar de ese archivo fuente las piezas que necesita, omitiendo todo lo relacionado con PEM y el cifrado simétrico; su punto de entrada sería la función DecodePrivateKeyInfo()
, que aparentemente espera un archivo PKCS # 8 no cifrado DER codificado, al igual que el PKCS8EncodedKeySpec
de Java.
poco fuera de tema, pero si es posible, debería evitar el uso de MD5 en cualquier aplicación – Krystian
'debería' es una palabra fuerte, incluso si MD5 se ha demostrado débil en que se puede romper fácilmente (ver http : //merlot.usc.edu/csac-f06/papers/Wang05a.pdf, como se hace referencia en Wikipedia) no siempre es decisión del programador. :-) – Patrick
@Krystian, fue una decisión tomada por quién construyó la interfaz hace 6 años :) – balint