Frage

Ich bin mit einem Zertifikat von makecert erzeugt, die sowohl privaten als auch öffentlichen Schlüssel haben. Die Java-Seite verwendet diese öffentlichen Schlüssel, um die Daten zu verschlüsseln und .net entschlüsselt sie zurück.

Ich versuche, Java verschlüsselte 64-Bit-codierten String und bekommen schlechte Daten zu entschlüsseln.

Um zu sehen, ob alles gut ist on.Net Ende habe ich versucht, frist mit dem öffentlichen Schlüssel zu verschlüsseln und dann entschlüsseln, mit eigenem das gleiche Zertifikat verwenden. Mein Code sieht wie folgt aus.

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

Auch hier erhalte ich den Fehler. Bin ich etwas fehlt?

Das Zertifikat sieht gültig sowohl mit dem öffentlichen und privaten Schlüsseln.

War es hilfreich?

Lösung 4

Schließlich fand ich das Problem. Ich war nicht den Schlüssel setzen MakeCert es als RSA-Kryptoschlüssel zu definieren.

Andere Tipps

Ich hatte das gleiche Problem mit einem selbst signierten Zertifikat, das Problem war, dass ich das CERT mit dem Schalter -sky signature statt -sky exchange wurde Erzeugung (Sie verwenden Unterschrift für die Unterzeichnung und den Austausch für die Verschlüsselung / Entschlüsselung)

Hier ist mein voller Befehl makecert, das funktioniert:

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

Der folgende Code funktioniert gut für mich:

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

Können Sie doppelt überprüfen, dass die exportierte privaten Schlüssel aus cert.PrivateKey sind und der öffentliche Schlüssel von cert.PublicKey.Key?

ich auf dieser Seite gestoßen, als ich versuchte Beispiele für makcert Nutzung mit x509 Zertifikaten und rsa mit c # zu finden, und leider ist es nur ein Teil der Lösung zur Verfügung gestellt. Ich habe alle Bits zusammen in einem Blog-Eintrag, die Menschen interessieren könnten, und es finden sich hier: http://nick-howard.blogspot.com /2011/05/makecert-x509-certificates-and-rsa.html

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top