首页 > 解决方案 > Java加密转javascript解密AES、CryptoJS、CTR

问题描述

我已经有了加密和解密代码。但现在我将使用 java 加密来加密文本。并使用 CryptoJS 在 JavaScript 中对其进行解密。

@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 生成。无法弄清楚如何摆脱 JS 中的 IV。

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

标签: javascriptjavaencryptionaescryptojs

解决方案


推荐阅读