Реализовать функцию шифрования из библиотеки crypto-js в Java

crypto-js используется разработчиками javascript для шифрования текста. Его просто использовать.

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

В этом примере функция encrypt принимает только два аргумента: messageToEncrypt и соль. Остальная часть конфигурации будет находиться внутри его определения. Я не специалист по javascript, поэтому мне сложно найти и понять определение encrypt.

Я хочу добиться такого же шифрования AES, используя java. Итак, для того же входного аргумента, например. messageToEncrypt и соль Я должен получить тот же зашифрованный текст, используя библиотеку 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 и количество итераций.

Как я могу создать простую точную реализацию шифрования AES от crypto-js в java?


person Alok Singh Mahor    schedule 28.12.2017    source источник
comment
возможно, взгляните на stackoverflow. ком/вопросы/992019/   -  person Lino    schedule 28.12.2017


Ответы (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);
    }

}
person Alok Singh Mahor    schedule 28.12.2017
comment
Я попробовал это решение, но не смог зашифровать значение. Можете ли вы поделиться всем файлом? - person Akshay Prabhu; 05.02.2020