繁体   English   中英

java中的AES加密和使用CryptoJS的javascript中的解密

[英]AES encryption in java and decryption in javascript using CryptoJS

我有以下代码使用AES / CTR / NOPADDING模式加密java中的某些文件内容。 我正在使用javax的crypto包。 此外,我使用相同的密钥生成密钥和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中加密和解密。

你的加密循环是错误的。 我不确定这是否是你问题的原因,但我会从它开始

read = fileInputStream.read(block);
byte[] writeBuffer = cipher.update(block);

即使您只读取块的部分大小,也可以在整个块上执行加密操作,您可以尝试

byte[] writeBuffer = cipher.update(block, 0, read);

关于将密钥用作IV,我必须强调,在CTR模式下,安全性将完全被破坏。

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

    • 密钥必须作为WordArray传递给CryptoJS.decrypt() - 方法。 由于密钥数据是Base64编码的,因此可以使用CryptoJS.enc.Base64.parse() - CryptoJS.enc.Base64.parse()将它们转换为WordArray
    • 密文可以作为WordArray内的CipherParams传递给CryptoJS.decrypt() - 方法。 Java代码将加密数据存储在文件中。 假设字符串encryptedContent包含这些数据为十六进制字符串(遗憾的是,这不会从发布的代码中出现,因此必须在此处做出假设),可以使用WordArray将它们转换为CryptoJS.enc.Hex.parse() -method并包装在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 )。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM