2017-02-22 1 views
1

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

+0

starten, indem sichergestellt werden Sie das gleiche Bytes verwenden. String-Darstellungen variieren stark zwischen den Sprachen. – chrylis

+1

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

+0

) 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

Antwort

1

Das erste, was ist aus dem angegebenen Passwort derive the IV and key zu tun.

Aus dem obigen Link erhalten Sie eine codierte IV und KEY, die mit "VDiJjncs4ak=" bzw. "s9e42J3PpmQv8n5T8L3zzuFaGdrzK/wU" entspricht. Das bedeutet, dass der im Java-Code verwendete Schlüssel und IV-Vektor falsch ist, wie es in den Kommentaren gesagt wurde.

Unten ist der resultierende Java-Code:

public class SymmetricDESedeCipher { 
    private static final String DATA = "Whackabad"; 
    private static final String ALGORITHM = "DESede"; 
    private static final String XFORM = "DESede/CBC/PKCS5Padding"; 
    private static final String KEY = "s9e42J3PpmQv8n5T8L3zzuFaGdrzK/wU"; 
    private static final String IV = "VDiJjncs4ak="; 

    private static byte[] encrypt(String data, 
            SecretKey key, String XFORM, byte[] iv) throws Exception { 
     Cipher cipher = Cipher.getInstance(XFORM); 
     cipher.init(Cipher.ENCRYPT_MODE, key, new IvParameterSpec(iv)); 
     return cipher.doFinal(data.getBytes()); 
    } 

    public static void main(String[] unused) throws Exception { 
     DESedeKeySpec spec = new DESedeKeySpec(new BASE64Decoder().decodeBuffer(KEY)); 
     SecretKeyFactory secretKeyFactory = SecretKeyFactory.getInstance(ALGORITHM); 
     SecretKey secretKey = secretKeyFactory.generateSecret(spec); 

     byte[] encBytes = encrypt(DATA, secretKey, XFORM, new BASE64Decoder().decodeBuffer(IV)); 

     System.out.println("Data: " + DATA); 
     System.out.println("Encrypted Data: " + new BASE64Encoder().encode(encBytes)); 
    } 
} 

Ausgang:

Data: Whackabad 
Encrypted Data: AEsDXVcgh2jsTjlDgh+REg== 
Verwandte Themen