Domanda

Sto usando un certificato generato da Makecert con chiave sia privata che pubblica. Il lato Java utilizza questa chiave pubblica per crittografare i dati e .net li decodifica nuovamente.

Sto cercando di decrittografare la stringa codificata a 64 bit crittografata di Java e ottenere dati errati.

Per vedere se tutto va bene on.Net end, prima ho provato a crittografare con la chiave pubblica e quindi a decifrare con privato usando lo stesso certificato. Il mio codice è simile al seguente.

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); 

Anche qui sto ricevendo l'errore. Mi sto perdendo qualcosa?

Il certificato sembra valido sia con chiave pubblica che privata.

È stato utile?

Soluzione 4

Ho finalmente trovato il problema. Non stavo mettendo la chiave a Makecert per definirla come chiave RSA Crypto.

Altri suggerimenti

Ho avuto lo stesso problema con un certificato autofirmato, il problema era che stavo generando il certificato con l'opzione -sky signature anziché -sky exchange ( usi la firma per firmare e scambiare per crittografia / decrittazione)

Ecco il mio comando completo per makecert che funziona:

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

Il seguente codice funziona bene per me:

        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);
        }

Puoi ricontrollare che la chiave privata esportata provenga da cert.PrivateKey e che la chiave pubblica provenga da cert.PublicKey.Key?

Mi sono imbattuto in questa pagina quando stavo cercando di trovare esempi di utilizzo di makcert con certificati x509 e rsa usando c #, e sfortunatamente ha fornito solo una parte della soluzione. Ho messo insieme tutti i bit in un post di blog a cui le persone potrebbero essere interessate, e può essere trovato qui: http://nick-howard.blogspot.com /2011/05/makecert-x509-certificates-and-rsa.html

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top