Ruby encrypted_strings 라이브러리로 작성된 것과 동일한 암호화 된 문자열을 Java로 생성해야합니다. 여러 가지 방법을 시도했지만 Java 코드가 다른 출력을 계속 반환하며 잘못된 작업을 이해할 수 없습니다.encrypted_strings의 암호화 방법에 따라 Java에서 문자열 암호화 ruby lib
다음은 Java에서 올바르게 구현할 수없는 원하는 출력을 생성하는 루비 스크립트입니다.
#!/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));
}
}
출력
Data: Whackabad
Encrypted Data: ScPTKQBsR9Ni1nJ1tsMaaQ==
나는이 달성 될 수 있다고 생각, 그래서 내가 자바에서 데이터를 암호화 본 사람들이 루비와 서로 다른 알고리즘과 반대에서 해독 할 적이 있지만 무엇을 내가 볼 수 없습니다 잘못된. 아이디어가 있습니까? 그렇다면 많은 도움이 될 것입니다!
감사
시작. 문자열 표현은 언어마다 매우 다양합니다. – chrylis
그 루비 암호화 라이브러리를 사용 하시겠습니까? 설명서에 암호에서 초기화 벡터가 파생되었음을 나타내는 것 같습니다. [IV는 무작위 적이어야합니다.] (http://crypto.stackexchange.com/a/82) – dnault
예 @dault, 그것은 유산입니다. 나는 자바로 번역하려고 노력 중이므로이 방법은 현재 사용하고있는 방법이고 복제하고 싶은 방법이다. – rakemous