Pregunta

Estoy usando un certificado generado por makecert que tiene clave pública y privada. El lado de Java utiliza esta clave pública para cifrar los datos y .net los descifra de nuevo.

Estoy tratando de descifrar la cadena codificada encriptada de 64 bits de Java y obteniendo datos incorrectos.

Para ver si todo está bien en .Net end, primero intenté cifrar 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í recibo el error. ¿Me estoy perdiendo algo?

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

¿Fue útil?

Solución 4

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

Otros consejos

Tuve el mismo problema con un certificado autofirmado, el problema era que estaba generando el certificado con el conmutador -sky signature en lugar de -sky exchange ( usa firma para firmar e intercambiar para cifrado / descifrado)

Aquí está mi comando completo para makecert que funciona:

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

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 verificar que la clave privada exportada sea de cert.PrivateKey y que la clave pública sea de cert.PublicKey.Key?

Me topé con esta página cuando intentaba encontrar ejemplos de uso de makcert con certificados x509 y rsa usando c #, y desafortunadamente solo proporcionó parte de la solución. Puse todos los bits juntos en una entrada de blog que la gente podría estar interesada, y se puede encontrar aquí: http://nick-howard.blogspot.com /2011/05/makecert-x509-certificates-and-rsa.html

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top