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.
InformationsquelleAutor rriggs | 2010-03-04
Schreibe einen Kommentar