2017-12-28 65 views
0

crypto-jsは、JavaScriptの開発者がテキストを暗号化するために使用します。使い方が簡単です。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); 

この例では暗号機能は2つだけmessageToEncrypt引数と塩を取っています。構成の残りの部分はその定義の内側にあります。私はjavascriptの男ではないので、見つけることが難しく、理解するの定義。

javaを使用して同じAES暗号化を達成したいと思います。例えば、同じ入力引数の場合。 messageToEncryptとsalt私はcrypto-jsライブラリとJavaの実装を使用して同じ暗号化されたテキストを取得する必要があります。

私はjavax.cryptoをGoogleで試してみました。

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

} 
関連する問題