Шифрование Java для расшифровки javascript AES, CryptoJS, CTR - PullRequest
0 голосов
/ 20 октября 2019

У меня уже есть код шифрования и дешифрования. Но сейчас я просто собираюсь использовать Java-шифрование для шифрования текста. И собираюсь расшифровать его в JavaScript с помощью CryptoJS.

@Service
public class EncryptionServiceImpl extends EncryptionService {

    protected static final int BLOCK_SIZE_BYTES = 16;

    protected static final int BLOCK_SIZE_BITS = 128;

    protected SecureRandom secureRandom;

    protected int keySizeByte;

    @Value("${encryption.key}")
    private String keyString ;


    public EncryptionServiceImpl() {
        byte[] key = keyString.getBytes();
        //create secret key spec instance
        secretKeySpec = new SecretKeySpec(key, "AES");
        try {
            cipher = javax.crypto.Cipher.getInstance("AES/CTR/NoPadding");
        } catch (NoSuchAlgorithmException | NoSuchPaddingException e) {
        }
        //create secure random number generator instance
        secureRandom = new SecureRandom();
    }


    public String encrypt(String data) {
        byte[] dataByte = new byte[0];
        try {
            dataByte = data.getBytes("UTF-8");
        } catch (UnsupportedEncodingException e) {

        }
        //create iv
        SecureRandom randomSecureRandom;
        IvParameterSpec ivParams = null;
        byte[] iv = new byte[0];
        try {
            randomSecureRandom = SecureRandom.getInstance("SHA1PRNG");
            iv = new byte[cipher.getBlockSize()];
            randomSecureRandom.nextBytes(iv);
            ivParams = new IvParameterSpec(iv);
        } catch (NoSuchAlgorithmException e) {

        }
        try {
            cipher.init(javax.crypto.Cipher.ENCRYPT_MODE, secretKeySpec, ivParams);
        } catch (InvalidKeyException | InvalidAlgorithmParameterException e) {
            throw e;
        }
        //return concatenation of iv + encrypted data
        byte[] encByteArr;
        try {
            encByteArr = ArrayUtils.addAll(iv, cipher.doFinal(dataByte));
        } catch (IllegalBlockSizeException | BadPaddingException e) {
            throw e;
        }
        return  Base64.encodeBase64URLSafeString(encByteArr);
    }

    public String decrypt(String encryptedData) {
         byte[] decodedValue = Base64.decodeBase64(encryptedData);
        byte[] iv = new byte[BLOCK_SIZE_BYTES];
        System.arraycopy(data, 0, iv, 0, BLOCK_SIZE_BYTES);
        try {
            cipher.init(javax.crypto.Cipher.DECRYPT_MODE, secretKeySpec, new IvParameterSpec(iv));
        } catch (InvalidKeyException | InvalidAlgorithmParameterException e) {
        }

        //return decrypted value
        byte[] decryptedByteArray;
        try {
            decryptedByteArray = cipher.doFinal(data, BLOCK_SIZE_BYTES, data.length - BLOCK_SIZE_BYTES);
        } catch (IllegalBlockSizeException | BadPaddingException e) {
        }
        try {
            return new String(decryptedByteArray,"UTF-8");
        } catch (UnsupportedEncodingException e) {
        }
        return new String(decryptedByteArray);
    }
}

Я хочу сделать точную расшифровку в JS, что я сделал в Java. Я новичок в JS. Я пытаюсь ниже вещей, чтобы преобразовать его в JS. Я думаю, глядя на код, мне нужно избавиться от IV от зашифрованного текста. но IV генерируется с SecureRandom. Невозможно понять, как избавиться от IV в JS.

import CryptoJS from 'crypto-js';
/* eslint-disable no-restricted-globals */
function decryption(val) {
    const encrypted = CryptoJS.enc.Base64.parse(val);
    const key = CryptoJS.enc.Base64.parse("<my encryption key used in java code>");
    const iv = CryptoJS.enc.Base64.parse(val);
    const valueDec = CryptoJS.enc.Utf8.stringify(CryptoJS.AES.decrypt(
        { ciphertext: encrypted },
        key,
        { mode: CryptoJS.mode.CTR, padding: CryptoJS.pad.NoPadding, iv: iv, }));
    return valueDec;
}
...