Ich entwickle derzeit eine Windows-Anwendung mit C# und entwickle eine mobile App mit Java.IVParameter Spec Problem in Java
Die Windows-Software und die mobile App arbeiten zusammen, die Windows-App speichert Informationen und verschlüsselt bestimmte Informationen, bevor sie in einer Online-Datenbank gespeichert werden.
Die mobile App ruft die Informationen aus der Online-Datenbank ab und muss die verschlüsselte Zeichenfolge entschlüsseln, die aus der Datenbank abgerufen wird.
Die Verschlüsselungsmethode I in C# bin mit unter
byte[] clearTextBytes = Encoding.UTF8.GetBytes(encryptionString);
SymmetricAlgorithm rijn = SymmetricAlgorithm.Create();
MemoryStream ms = new MemoryStream();
byte[] rgbIV = Encoding.ASCII.GetBytes("ryojvlzmdalyglrj");
byte[] key = Encoding.ASCII.GetBytes("hcxilkqbbhczfeultgbskdmaunivmfuo");
CryptoStream cs = new CryptoStream(ms, rijn.CreateEncryptor(key, rgbIV), CryptoStreamMode.Write);
cs.Write(clearTextBytes, 0, clearTextBytes.Length);
cs.Close();
return Convert.ToBase64String(ms.ToArray());
Die Windows-Methode funktioniert gut.
Der Code, den ich in Java verwende ist wie folgt:
KeySpec ks = new DESKeySpec("hcxilkqbbhczfeultgbskdmaunivmfuo".getBytes("UTF-8"));
SecretKey key = SecretKeyFactory.getInstance("DES").generateSecret(ks);
String ivString = "ryojvlzmdalyglrj";
byte[] ivByte = ivString.getBytes("UTF-8");
IvParameterSpec iv = new IvParameterSpec(ivByte);
//RC5ParameterSpec iv = new RC5ParameterSpec(ivByte);
Cipher cipher = Cipher.getInstance("DES/CBC/PKCS5Padding");
cipher.init(Cipher.ENCRYPT_MODE, key, iv);
byte[] encoded = cipher.doFinal(Base64.decodeBase64("iNtaFme3B/e6DppNSp9QLg=="));
Log.d("Decoded Password", encoded.toString());
Da beide Methoden die gleiche Zeichenfolge verschlüsseln und entschlüsseln müssen zusammen den gleichen Schlüssel und IV verwenden hat. Das einzige Problem, das ich habe, ist in der Java-Methode der IVParameterSpec in den Catch mit einem Fehler, der besagt, IV muss 8 Bytes lang sein.
Wie kann ich dies beheben, um sicherzustellen, dass ich die gleiche IV wie C# habe.
Danke für die Hilfe
Hallo danke für die Hilfe. Wenn ich den ersten SecretKey-Schlüssel = SecretKeyFactory.getInstance ("DES) .... ändere und den DES durch AES ersetze, kommt es zu einem Fehler, der sagt, dass SecretKeyFactory AES-Implementierung nicht gefunden wird – Boardy
Ich empfehle die Verwendung der BouncyCastle (http: // (http://www.bouncycastle.org) Leichtgewichtige API anstelle der Java JCE. JCE ist voll von Problemen wie dieser. –
Verwenden Sie stattdessen eine SecretKeySpec. Aber ich stimme @Cameron Skinner zu. –