Ich muss die gleiche verschlüsselte Zeichenfolge in Java wie die mit der Ruby encrypted_strings Bibliothek erstellt erzeugen. Ich habe viele verschiedene Möglichkeiten ausprobiert, aber mein Java-Code liefert immer wieder eine andere Ausgabe, und ich kann nicht verstehen, was ich falsch mache.Verschlüsseln Sie einen String in Java nach der Methode encrypt aus chiffrected_strings ruby lib
Unten ist das Ruby-Skript, das die gewünschte Ausgabe erzeugt, die ich in Java nicht bekommen kann.
#!/usr/bin/ruby
require 'encrypted_strings'
data = 'Whackabad'
password = 'bAJLyifeUJUBFWdHzVbykfDmPHtLKLMzViHW9aHGmyTLD8hGYZ'
encrypted_data = data.encrypt(:symmetric, :password => password)
printf "Data: #{data}\n"
printf "Encrypted Data: #{encrypted_data}"
Ausgang:
Data: Whackabad
Encrypted Data: AEsDXVcgh2jsTjlDgh+REg==
hatte ich einen Blick auf die Bibliothek, und es scheint DES-EDE3-CBC
als Standard-Algorithmus für die Verschlüsselung zu verwenden. Ich folge daraus, dass ich DESede
oder TripleDES
Algorithmus und CBC
Modus verwenden sollte. Als Padding-Option verwende ich PKCS5Padding
, weil die Bibliothek pkcs5_keyivgen
aufruft.
Unten ist der Java-Code, der versucht, dieselbe Ausgabe ohne Erfolg zu reproduzieren.
package ...
import sun.misc.BASE64Encoder;
import javax.crypto.Cipher;
import javax.crypto.SecretKey;
import javax.crypto.SecretKeyFactory;
import javax.crypto.spec.DESedeKeySpec;
import javax.crypto.spec.IvParameterSpec;
public class SymmetricDESedeCipher {
private static final String DATA = "Whackabad";
private static final String key = "bAJLyifeUJUBFWdHzVbykfDmPHtLKLMzViHW9aHGmyTLD8hGYZ";
private static final String ALGORITHM = "DESede";
private static final String XFORM = "DESede/CBC/PKCS5Padding";
private static byte[] iv = new byte[8];
private static byte[] encrypt(byte[] inpBytes,
SecretKey key, String XFORM) throws Exception {
Cipher cipher = Cipher.getInstance(XFORM);
IvParameterSpec ips = new IvParameterSpec(iv);
cipher.init(Cipher.ENCRYPT_MODE, key, ips);
return cipher.doFinal(inpBytes);
}
public static void main(String[] unused) throws Exception {
byte[] keyBytes = key.getBytes();
DESedeKeySpec desKeySpec = new DESedeKeySpec(keyBytes);
SecretKeyFactory secretKeyFactory = SecretKeyFactory.getInstance(ALGORITHM);
SecretKey secretKey = secretKeyFactory.generateSecret(desKeySpec);
byte[] dataBytes = DATA.getBytes();
byte[] encBytes = encrypt(dataBytes, secretKey, XFORM);
System.out.println("Data: " + DATA);
System.out.println("Encrypted Data: " + new BASE64Encoder().encode(encBytes));
}
}
Ausgabe
Data: Whackabad
Encrypted Data: ScPTKQBsR9Ni1nJ1tsMaaQ==
Ich habe Daten aus Java gesehen, wie Menschen der Verschlüsselung von Ruby und umgekehrt mit verschiedenen Algorithmen entschlüsselt werden, so denke ich, dies erreicht werden kann, aber ich kann nicht sehen, was falsch. Haben sie eine Idee? Wenn ja, wäre das sehr hilfreich!
Dank
starten, indem sichergestellt werden Sie das gleiche Bytes verwenden. String-Darstellungen variieren stark zwischen den Sprachen. – chrylis
Sind Sie absolut sicher, dass Sie diese Ruby-Verschlüsselungsbibliothek verwenden möchten? Die Dokumentation scheint darauf hinzuweisen, dass sie den Initialisierungsvektor von einem Passwort ableitet, was eine schreckliche Idee ist - [IVs sollten zufällig sein] ( – dnault
) Ja @dnault, es ist Vermächtnis was Ich versuche, in Java zu übersetzen, so dass die Methode in diesem Moment verwendet wird und diejenige, die ich replizieren möchte. – rakemous