2017-12-28 5 views
0

crypto-js wird von JavaScript-Entwicklern verwendet, um Text zu verschlüsseln. Es ist einfach zu bedienen.Implementieren Sie die Verschlüsselungsfunktion aus Crypto-js-Bibliothek in Java

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

In diesem Beispiel encrypt Funktion nur zwei Argumente messageToEncrypt und Salz nimmt. Der Rest der Konfiguration würde innerhalb seiner Definition liegen. Ich bin kein javascript Kerl, so ist es schwierig zu finden und zu verstehen verschlüsseln Definition.

Ich möchte die gleiche AES Verschlüsselung mit Java erreichen. Also für das gleiche Eingabeargument z.B. messageToEncrypt und salt Ich sollte den gleichen verschlüsselten Text mit der crypto-js-Bibliothek und der Java-Implementierung erhalten.

Ich versuchte javax.crypto durch die Erkundung einiger Links auf 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); 

Aber das funktioniert nicht für mich, weil ich genaue Parameter wie keySize und iterationCount nicht kenne.

Ich habe versucht, https://github.com/mpetersen/aes-example/blob/master/src/main/java/org/cloudme/sample/aes/AesUtil.java auch verwenden, aber ich bin mir nicht sicher über keySize und iterationCount.

Wie kann ich einfache exakte Implementierung der AES-Verschlüsselung von crypto-js in Java erstellen?

+0

haben vielleicht einen Blick auf https://stackoverflow.com/questions/992019/java-256-bit-aes-password-based-encryption – Lino

Antwort

-1

Nach ein paar Treffern und Test habe ich eine funktionierende Implementierung in Java bekommen.

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

} 
Verwandte Themen