2009-10-26 19 views
6

estoy usando un certificado generado por makecert que tiene clave privada y pública. El lado java usa esta clave pública para encriptar los datos y .net la descifra.rsacryptoserviceprovider usando certificados x509 C#

Estoy tratando de descifrar la cadena codificada de 64 bits cifrada de Java y obtener datos incorrectos.

Para ver si todo está bien en.Net end, intenté encriptar con la clave pública y luego descifrar con privado usando el mismo certificado. Mi código se ve así.

X509Certificate2 cert = GetCert(key, StoreName.My, StoreLocation.LocalMachine); 
RSACryptoServiceProvider provider = (RSACryptoServiceProvider)cert.PrivateKey; 

RSACryptoServiceProvider publicprovider = (RSACryptoServiceProvider)cert.PublicKey.Key; 

if (cert.HasPrivateKey) 
    MessageBox.Show("Got private key"); 

byte[] encrypted = publicprovider.Encrypt(Encoding.UTF8.GetBytes(text), false); 
byte[] decryptedBytes = provider.Decrypt(encrypted, false); 

Incluso aquí me aparece el error. ¿Me estoy perdiendo de algo?

El certificado parece válido con clave pública y privada.

+0

¿Qué error? y en qué línea? –

+0

Excepción: Datos incorrectos. Sin excepción interna cuando byte [] decryptedBytes = provider.Decrypt (encrypted, false); se llama – bkhanal

Respuesta

1

Finalmente encontré el problema. No estaba poniendo la clave para makecert para definirlo como la clave criptográfica RSA.

4

el siguiente código funciona bien para mí:

 RSACryptoServiceProvider privateKey = new RSACryptoServiceProvider(); 
     privateKey.FromXmlString("<RSAKeyValue><Modulus>wL8s+C8SnnlaaqR+VsyijmxOJOARNa4o7ZNsqfy3+9J9Ol2JNSjjMfQWoUnFtClzJBlZhU5KtuazQe8ZKXTX9YvKoJdRhlsonZkC04qiTMdO/FZIH00GrCRxeQ7XDnQnvPB9Bdsvs//7zrY3f7eLIkpIyK9cQHU+5jjJd5IT0eE=</Modulus><Exponent>AQAB</Exponent><P>83xxN7jvpg5z16pxz2tIQIdqd/EfmikR9Q2TjG2tosWkUSvtyx0xHZ9EqdTUbSGZZ+jgrabzkafYc7Mplylwew==</P><Q>yqcnYSZEXHwJvRWi2V09PNEENTozQZywcFptUUGar9TciaQvoNv3lpnfzUKNBRdhzq4lImxkamajZlTWE5buUw==</Q><DP>37HqilkbwyHwB6mOGhPkM3S1ujAK6qTk3JB2iEOTjMGrru9+7maJYz+Z47Wm3ARMXgyzrpZ9m8nqsJFfmoL11Q==</DP><DQ>v285tv8kMs2FkZYfuP/oOkwkkneBNejjj68Md2bmzlThZDCyQV2pvB1tmgPVHUsiPNCrCaKlFRISJzfa5rR8Ow==</DQ><InverseQ>fgJE2TRe/SS+YqW0/I+FtHrdfbbao0/R3pHD4r4oceZQUemlBgZ7DxOAetebHKthlOdjGkmfWYB8EU4XoWggqw==</InverseQ><D>FMLCwjy3wbAKiCANp6XFAJgz1o7365NFv0k41BpvasViTa4TgFFWH2ROJ7M9g0lPqJy+YrhrHcY9mqV5TVjTheQp0JeckrgO2B39XngPMAMMdne3rWGpf0Pfbj3FLfchMk6XYDXSZzCS2CmSeRA4aBMb+4R3YurixyJLrnGRMH0=</D></RSAKeyValue>"); 
     RSACryptoServiceProvider publicKey = new RSACryptoServiceProvider(); 
     publicKey.FromXmlString("<RSAKeyValue><Modulus>wL8s+C8SnnlaaqR+VsyijmxOJOARNa4o7ZNsqfy3+9J9Ol2JNSjjMfQWoUnFtClzJBlZhU5KtuazQe8ZKXTX9YvKoJdRhlsonZkC04qiTMdO/FZIH00GrCRxeQ7XDnQnvPB9Bdsvs//7zrY3f7eLIkpIyK9cQHU+5jjJd5IT0eE=</Modulus><Exponent>AQAB</Exponent></RSAKeyValue>"); 

     { 
      string text = "foo"; 
      byte[] encrypted = publicKey.Encrypt(Encoding.UTF8.GetBytes(text), false); 
      byte[] decryptedBytes = privateKey.Decrypt(encrypted, false); 
     } 

¿Puede usted compruebe que la clave privada es exportado desde cert.PrivateKey y la clave pública es de cert.PublicKey.Key?

+0

cuando el certificado regresa ya genera la clave simétrica aes. No estoy usando la implementación donde tenemos que hacer primero cree la clave pública privada y genere proveedores basados ​​en eso. Esto usa makecert. El código anterior no proporciona el error, pero tiene un módulo de 128 caracteres ... – bkhanal

+1

"cuando el certificado regresa, ya genera la clave simétrica de aes". Realmente no entiendo lo que eso significa. ¿Dónde se genera la clave AES? No puedo verlo en ninguna parte de tu codesample. –

+0

si hace el certificado con la herramienta makecert. tiene la clave privada y pública en él. Por lo tanto, puede ir a la tienda y obtener la clave pública privada. No he insertado el código para obtener la clave pública y privada – bkhanal

4

he tenido el mismo problema con un certificado autofirmado, el problema fue que yo estaba generando el CERT con el interruptor -sky signature en lugar de -sky exchange (que utilizan la firma para la firma e intercambio para el cifrado/descifrado)

Aquí es mi comando completo a makecert que funciona:

makecert -r -pe -a sha1 -n "CN=MyName" -ss my -sr CurrentUser -sky exchange 
Cuestiones relacionadas