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==
違う。アイデアはありますか?もしそうなら、それは多くの助けになるだろう!
おかげ
スタートあなたは同じバイトを使用している確保することによって。文字列表現は言語によって大きく異なります。 – chrylis
あなたはそのRuby暗号化ライブラリを使用してもいいですか?ドキュメントはパスワードから初期化ベクトルを導出したことを示しているようですが、これはひどい考えです - [IVはランダムでなければなりません](http://crypto.stackexchange.com/a/82) – dnault
はい@dnault、それは何の遺産ですか?私はJavaに翻訳しようとしているので、この時点でメソッドが使用されており、複製するメソッドがあります。 – rakemous