Wie zum Verschlüsseln von in C# .NET dasselbe wie Java-code
Brauche ich zum senden einer verschlüsselten string aus einem privaten Schlüssel auf einem webserver zur Authentifizierung. Ich habe Java-client-code, der generiert die verschlüsselte Zeichenfolge korrekt (so dass der webserver wieder entschlüsselt mit dem öffentlichen Schlüssel). Ich bin versucht zu schreiben, der C# - code, um die exakt gleiche Verschlüsselung - aber nicht gelungen ist.
Erstes einen keystore erstellt wurde in java mithilfe von keytool, ähnlich diesem:
keytool -genkey -dname "cn=Application Test, ou=XXX, o=YYY, c=US" -alias AppTest -keypass AppTest -keystore AppTest.jks -storepass AppTest -validity 1800 -keyalg RSA
Dann dieses java-code richtig liest den keystore und verschlüsselt die Daten (privateKey.getAlgorithm() gibt "RSA"):
KeyStore ks = KeyStore.getInstance("JKS");
InputStream is = new FileInputStream("AppTest.jks");
ks.load(is, "AppTest".toCharArray());
is.close();
PrivateKey privateKey = (PrivateKey) ks.getKey(user, password.toCharArray());
//Encrypt with the private key
String stamp = "123456";
byte[] bytesStampUtf8Unencrypted = stamp.getBytes(Charset.forName("UTF-8"));
Cipher cipher = Cipher.getInstance(privateKey.getAlgorithm());
cipher.init(Cipher.ENCRYPT_MODE, privateKey);
byte[] bytesTimestampUtf8Encrypted = cipher.doFinal(bytesStampUtf8Unencrypted);
String encrypted = new String((new Base64()).encode(bytesStampUtf8Unencrypted));
Diesem funktioniert alles Super, wenn übergeben, um den web-service. Ich habe dann keytool zum konvertieren von java-keystore zu einer PKCS12-Zertifikat für den Einsatz in meinem .NET-Anwendung:
keytool -importkeystore -srckeystore AppTest.keystore -destkeystore KEYSTORE.p12 -srcstoretype JKS -deststoretype PKCS12 -srcstorepass AppTest -deststorepass AppTest-srcalias AppTest -destalias AppTest -srckeypass AppTest -destkeypass AppTest -noprompt
Mithilfe von keytool ich verglich die Fingerabdrücke der keystore-und P12-Dateien identisch. Ich dachte, der folgende C# - code sollte funktionieren:
X509Certificate2 myCertificate =
new X509Certificate2(@"C:\Temp\KEYSTORE.p12", "AppTest");
RSACryptoServiceProvider privateKey =
myCertificate.PrivateKey as RSACryptoServiceProvider;
String stamp = "123456";
byte[] buffer = Encoding.UTF8.GetBytes(stamp);
byte[] encryptedBytes = privateKey.Encrypt(buffer, false);
String encrypted = Convert.ToBase64String(encryptedBytes);
Er liest die konvertierten keystore-Datei korrekt ausgeführt, ohne problem, und erzeugt, was zu sein scheint verschlüsselte Daten, aber die web-service mag Sie NICHT, die verschlüsselte Zeichenfolge (kann nicht mit dem öffentlichen Schlüssel entschlüsseln). Wenn ich ersetzte das C# - verschlüsselte Zeichenfolge mit dem Java-verschlüsselt (im debugger) und geschickt, dass string durch den C# - Programm, um die web-service - alles funktioniert - also bin ich zuversichtlich das problem in der Verschlüsselung Prozess, und nicht in die web-service-Kommunikation.
Ich habe keine Kontrolle über die Art, den ursprünglichen Schlüssel erzeugt wurde (als java-keystore), oder welche Verschlüsselungsmethode ist zu erwarten, dass durch den web-service. Ich kann nur kontrollieren die .NET-client, der im zusammenspiel mit dem Java-basierten web-service.
Bin ich etwas fehlt flag, Einstellung, variable, was?
- Ich bin nicht sicher, von nichts - außer, dass der java-code arbeitet. Das ist der Grund, warum ich die Frage gestellt habe. Ich habe nicht in der Lage gewesen, um herauszufinden, was Polsterung, Modus, usw. verwendet wird in jedem Fall. Damit ich all die keytool-Befehle zur Erstellung und Konvertierung - in der Hoffnung, dass jemand sehen konnte, eine mögliche Fehlanpassung. Immer noch Hoffnung.
Du musst angemeldet sein, um einen Kommentar abzugeben.
Sind Sie sicher, dass die Verschlüsselung Algorithmus, die Blockchiffre-Modus und Polsterung-Modus äquivalent sind, in Ihrem C# - Implementierung im Vergleich zu java-Implementierung?
Edit: Eigentlich für RSACryptoProvider Sie wahrscheinlich nicht brauchen cipher/Polsterung-Modus - nehmen Sie einen Blick auf das Beispiel auf MSDN, speziell im Abschnitt importieren von public-key-Informationen über ImportParameters
Dies ist eine Lösung, die schwer zu finden in der Arbeit Bedingung für das Verschlüsseln im Java-und Entschlüsseln in .Net und schließlich war ich in der Lage zu implementieren, in meinem Projekt,mit diesem können wir verschlüsseln von Strings in java-und entschlüsseln an .Net Ende mit BouncyCastle API.
Habe ich verwendet Blowfish-Verschlüsselung/Entschlüsselung:
Finden Sie Dateien etc für bouncycastle aus : http://bouncycastle.org/latest_releases.html
Java-code
C# - Code
Hinweis: Bitte stellen Sie sicher, dass Sie denselben Schlüssel an beiden enden.