2017-02-22 5 views
1

Ruby encrypted_stringsライブラリで構築されたものと同じ暗号化された文字列をJavaで生成する必要があります。私はいろいろな方法で試しましたが、私のJavaコードは別の出力を返し続けます。私が間違っていることを理解できません。encrypted_strings ruby​​ libからのencryptメソッドでJavaで文字列を暗号化

以下は、Javaで正しく取得できない望ましい出力を生成するrubyスクリプトです。

#!/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}" 

出力:

Data: Whackabad 
Encrypted Data: AEsDXVcgh2jsTjlDgh+REg== 

私は図書館で見ていた、そしてそれは、暗号化のデフォルトアルゴリズムとしてDES-EDE3-CBCを使用しているようです。ここでは、DESedeまたはTripleDESアルゴリズムとCBCモードを使用する必要があることを推論します。パディングオプションとして、ライブラリpkcs5_keyivgenを呼び出しているので、PKCS5Paddingを使用しています。

以下は、同じ出力を再現しようとするJavaコードです。

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)); 
    } 
} 

私はので、私はこれを達成することができると思いますが、私は何を見ることができない、Javaからデータを暗号化する人が異なるアルゴリズムでRubyとその逆から復号化する見てきた出力

Data: Whackabad 
Encrypted Data: ScPTKQBsR9Ni1nJ1tsMaaQ== 

違う。アイデアはありますか?もしそうなら、それは多くの助けになるだろう!

おかげ

+0

スタートあなたは同じバイトを使用している確保することによって。文字列表現は言語によって大きく異なります。 – chrylis

+1

あなたはそのRuby暗号化ライブラリを使用してもいいですか?ドキュメントはパスワードから初期化ベクトルを導出したことを示しているようですが、これはひどい考えです - [IVはランダムでなければなりません](http://crypto.stackexchange.com/a/82) – dnault

+0

はい@dnault、それは何の遺産ですか?私はJavaに翻訳しようとしているので、この時点でメソッドが使用されており、複製するメソッドがあります。 – rakemous

答えて

1

まず最初に行うには、指定されたパスワードからderive the IV and keyにあります。

上記のリンクから、"VDiJjncs4ak=""s9e42J3PpmQv8n5T8L3zzuFaGdrzK/wU"にそれぞれ対応するエンコードされたIVとKEYが得られます。 これは、Javaコードで使用されているキーとIVベクトルがコメント内で述べられているように間違っていることを意味します。以下は

結果のJavaコードです:

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)); 
    } 
} 

出力:

Data: Whackabad 
Encrypted Data: AEsDXVcgh2jsTjlDgh+REg== 
関連する問題