2017-02-22 1 views
1

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== 

나는이 달성 될 수 있다고 생각, 그래서 내가 자바에서 데이터를 암호화 본 사람들이 루비와 서로 다른 알고리즘과 반대에서 해독 할 적이 있지만 무엇을 내가 볼 수 없습니다 잘못된. 아이디어가 있습니까? 그렇다면 많은 도움이 될 것입니다!

감사

+0

시작. 문자열 표현은 언어마다 매우 다양합니다. – chrylis

+1

그 루비 암호화 라이브러리를 사용 하시겠습니까? 설명서에 암호에서 초기화 벡터가 파생되었음을 나타내는 것 같습니다. [IV는 무작위 적이어야합니다.] (http://crypto.stackexchange.com/a/82) – dnault

+0

예 @dault, 그것은 유산입니다. 나는 자바로 번역하려고 노력 중이므로이 방법은 현재 사용하고있는 방법이고 복제하고 싶은 방법이다. – rakemous

답변

1

먼저 할 일은 주어진 암호와 derive the IV and key이다.

위의 링크에서 각각 "VDiJjncs4ak=""s9e42J3PpmQv8n5T8L3zzuFaGdrzK/wU"에 해당하는 인코딩 된 IV 및 KEY가 표시됩니다. 이것은 Java 코드에서 사용 된 키와 IV 벡터가 주석에서 말한 것과 같이 잘못되었음을 의미합니다. 다음은

은 결과 자바 코드 :

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==