2017-12-28 30 views
0

crypto-js은 자바 스크립트 개발자가 텍스트를 암호화하는 데 사용됩니다. 사용이 간편합니다. 이 예 암호화 함수에 Java의 crypto-js 라이브러리에서 암호화 기능 구현

var CryptoJS = require("crypto-js"); 

// Encrypt 
var ciphertext = CryptoJS.AES.encrypt('my message', 'secret key 123'); 

// Decrypt 
var bytes = CryptoJS.AES.decrypt(ciphertext.toString(), 'secret key 123'); 
var plaintext = bytes.toString(CryptoJS.enc.Utf8); 

console.log(plaintext); 

은 두 인수 messageToEncrypt 염화칼슘을 취하고있다. 구성의 나머지 부분은 정의 내에있을 것입니다. 나는 자바 스크립트 녀석이 아니기 때문에 발견하기가 어렵고 이해하기가 의 정의이다.

자바를 사용하여 동일한 AES 암호화를 달성하고 싶습니다. 예. messageToEncrypt and salt crypto-js 라이브러리 및 Java 구현을 사용하여 동일한 암호화 된 텍스트를 가져와야합니다.

Google에서 일부 링크를 탐색하여 javax.crypto을 시도했습니다.

String plainText = "messageToEncrypt"; 
String key = "mySalt"; 
SecretKey secKey = new SecretKeySpec(key.getBytes("UTF-8"), "AES"); 
Cipher aesCipher = Cipher.getInstance("AES"); 
aesCipher.init(Cipher.ENCRYPT_MODE, secKey); 
byte[] x = aesCipher.doFinal(plainText.getBytes()); 
System.out.println(x); 

그러나 keySize 및 iterationCount와 같은 정확한 매개 변수를 알지 못하므로이 기능이 작동하지 않습니다.

나는 또한 https://github.com/mpetersen/aes-example/blob/master/src/main/java/org/cloudme/sample/aes/AesUtil.java을 사용하려고했지만 keySize 및 iterationCount에 대해서는 확실하지 않습니다.

java에서 crypto-js의 AES 암호화를 어떻게 정확하게 구현할 수 있습니까?

+0

어쩌면 https://stackoverflow.com/questions/992019/java-256-bit-aes-password-based-encryption를 보라 – Lino

답변

-1

일부 히트 앤 트라이얼 후 Java에서 구현이 이루어졌습니다.

import java.nio.charset.StandardCharsets; 
import java.security.MessageDigest; 
import java.security.SecureRandom; 
import java.util.Arrays; 
import java.util.Base64; 

import javax.crypto.Cipher; 
import javax.crypto.spec.IvParameterSpec; 
import javax.crypto.spec.SecretKeySpec; 

public class TestAES { 

    static String encrypt(String textToEncrypt, String myOwnSalt) throws Exception { 
     final byte[] pass = textToEncrypt.getBytes(StandardCharsets.UTF_8); 
     final byte[] salt = (new SecureRandom()).generateSeed(8); 
     final byte[] inBytes = myOwnSalt.getBytes(StandardCharsets.UTF_8); 

     final byte[] passAndSalt = array_concat(pass, salt); 
     byte[] hash = new byte[0]; 
     byte[] keyAndIv = new byte[0]; 
     for (int i = 0; i < 3 && keyAndIv.length < 48; i++) { 
      final byte[] hashData = array_concat(hash, passAndSalt); 
      final MessageDigest md = MessageDigest.getInstance("MD5"); 
      hash = md.digest(hashData); 
      keyAndIv = array_concat(keyAndIv, hash); 
     } 

     final byte[] keyValue = Arrays.copyOfRange(keyAndIv, 0, 32); 
     final byte[] iv = Arrays.copyOfRange(keyAndIv, 32, 48); 
     final SecretKeySpec key = new SecretKeySpec(keyValue, "AES"); 

     final Cipher cipher = Cipher.getInstance("AES/CBC/PKCS5Padding"); 
     cipher.init(Cipher.ENCRYPT_MODE, key, new IvParameterSpec(iv)); 
     byte[] data = cipher.doFinal(inBytes); 
     data = array_concat(array_concat("Salted__".getBytes(StandardCharsets.UTF_8), salt), data); 
     return Base64.getEncoder().encodeToString(data); 
    } 

    private static byte[] array_concat(final byte[] a, final byte[] b) { 
     final byte[] c = new byte[a.length + b.length]; 
     System.arraycopy(a, 0, c, 0, a.length); 
     System.arraycopy(b, 0, c, a.length, b.length); 
     return c; 
    } 

    public static void main(String[] args) throws Exception { 
     String s = encrypt("myPassword", "2ErFG"); 
     System.out.println(s); 
    } 

}