首页 > 解决方案 > java中的AES加密和使用CryptoJS的javascript中的解密

问题描述

我有下面的代码通过使用 AES/CTR/NOPADDING 模式加密 java 中的一些文件内容。我正在使用 javax 的加密包。我也使用相同的密钥来生成密钥和 iv。

Cipher cipher = Cipher.getInstance("AES/CTR/NoPadding");

        byte[] secretKey = Base64.decodeBase64("uQsaW+WMUrjcsq1HMf+2JQ==");

        SecretKeySpec key = new SecretKeySpec(secretKey, "AES");
        IvParameterSpec iv = new IvParameterSpec(secretKey);

        cipher.init(mode, key , iv);

        FileInputStream fileInputStream = new FileInputStream(sourceFilePath);
        FileOutputStream fileOutputStream = new FileOutputStream(destFilePath);

        int read = 0;
        while ((fileInputStream.available()) > 0) {
            byte[] block = new byte[4096];
            read = fileInputStream.read(block);
            byte[] writeBuffer = cipher.update(block);
            fileOutputStream.write(writeBuffer, 0, read);
        }

        byte[] writeBuffer = cipher.doFinal();
        fileOutputStream.write(writeBuffer, 0, writeBuffer.length);

        fileInputStream.close();
        fileOutputStream.close();

我无法使用 cryptojs 解密 javascript 中的加密内容。这是我尝试过的东西。

var key = CryptoJS.enc.Hex.parse(atob('uQsaW+WMUrjcsq1HMf+2JQ=='));

var decrypted = CryptoJS.AES.decrypt(encryptedContent, key, {
    mode: CryptoJS.mode.CTR,
    iv: key,
    padding: CryptoJS.pad.NoPadding
});

var decryptedText = CryptoJS.enc.Utf8.stringify(decrypted);

有人可以告诉我我做错了什么吗?或者告诉我怎么做。

我能够独立地在 java 和 javascript 中加密和解密。

标签: javaencryptioncryptographyaescryptojs

解决方案


  • CryptoJS-documentation中解释了 -method 需要哪些数据类型和参数CryptoJS.decrypt()以及哪些编码器可用:

    • 密钥必须CryptoJS.decrypt()作为WordArray. 由于 key-data 是 Base64 编码的,因此可以WordArray使用CryptoJS.enc.Base64.parse()-method 将它们转换为 a。
    • 密文可以作为-object内部的a传递给CryptoJS.decrypt()-method 。Java 代码将加密数据存储在文件中。假设字符串包含那些作为十六进制字符串的数据(不幸的是,这不会从发布的代码中出现,因此必须在这里做出假设),它们可以使用 - 方法转换为 a并包装在-object 中。WordArrayCipherParamsencryptedContentWordArrayCryptoJS.enc.Hex.parse()CipherParams
    • -CryptoJS.decrypt()方法返回一个WordArray可以用CryptoJS.enc.Utf8.stringify()- 方法转换成字符串的值。
  • 如果输入文件中包含以下纯文本:

    This is the plain text which needs to be encrypted!
    

    Java 代码在输出文件中存储以下字节序列(= 加密数据):

    52F415AB673427C42278E8D6F34C16134D7E3FE7986500980ED4063F3CF51162592CE0F5412CCA0BC2DBAE3F2AEC2D585EE8D7
    

    用于解密的 JavaScript 代码是:

    var key = CryptoJS.enc.Base64.parse('uQsaW+WMUrjcsq1HMf+2JQ==');
    
    var encryptedContent = '52F415AB673427C42278E8D6F34C16134D7E3FE7986500980ED4063F3CF51162592CE0F5412CCA0BC2DBAE3F2AEC2D585EE8D7';
    var cipherParams = CryptoJS.lib.CipherParams.create({
        ciphertext: CryptoJS.enc.Hex.parse(encryptedContent)         
    });
    
    var decrypted = CryptoJS.AES.decrypt(cipherParams, key, {
        mode: CryptoJS.mode.CTR,
        iv: key,
        padding: CryptoJS.pad.NoPadding
    });
    
    var decryptedText = CryptoJS.enc.Utf8.stringify(decrypted);
    console.log(decryptedText); 
    

它在控制台中显示原始纯文本。要运行上面的代码,至少需要 CryptoJS-version 3.1.4(请参阅版本cdnjs)。


推荐阅读