【问题标题】:AES encryption in javascript and decrypting in javajavascript中的AES加密和java中的解密
【发布时间】:2013-12-17 21:26:49
【问题描述】:

我有一个使用 AES 加密和解密的现有 web 服务,现在我必须以与 java 相同的方式但在 javascript 中加密。 我已阅读有关在 javascript 中执行此操作的所有主题,但没有找到任何有用的解决方案。 Javascript 总是以不同的方式加密,我找不到原因。

这是现有的java代码:

public static String encrypt(String data) throws Exception {
    byte[] keyValue = encryptionKey.getBytes();
    Key key = new SecretKeySpec(keyValue, "AES");
    Cipher c = Cipher.getInstance("AES/ECB/PKCS5Padding");
    c.init(Cipher.ENCRYPT_MODE, key);
    byte[] encVal = c.doFinal(data.getBytes());
    String encryptedValue = new BASE64Encoder().encode(encVal);
    return encryptedValue;
}

这是我倾向于使用的 javascript 代码,但提供了不同的加密(CryptoJS):

var encrypted = CryptoJS.AES.encrypt(data, encryptionKey);

或其中之一(GibberishAES):

// Defaults to 256 bit encryption
var encrypted = GibberishAES.enc(data, encryptionKey);
// change the bit encrytion
GibberishAES.size(128);
var encrypted = GibberishAES.enc(data, encryptionKey);
GibberishAES.size(192);
var encrypted = GibberishAES.enc(data, encryptionKey);

我无法更改 java 中的实现或我们执行安全性的方式。是否有人在这方面有更多经验,可以告诉我我在这里做错了什么?

【问题讨论】:

    标签: java javascript encryption aes


    【解决方案1】:

    您只查看加密算法,但您也要注意块模式和填充,否则您将无法创建兼容的结果。根据code.google.com,CryptoJS 的默认值为CBCPKCS7,而您的Java 代码使用ECBPKCS5

    你必须带上它来匹配。您可以设置 CryptoJS 以使用 ECB。关于填充,它更棘手,因为 CryptoJS 没有列出支持的 PKCS5,而 Java 没有列出 PKCS7,事实上,它列出的很少,所以它可能取决于 AES 提供者支持的填充算法,但在Java 和 CryptoJS 至少都支持 NoPadding

    【讨论】:

    • 好的,谢谢这让我更进一步。我已经阅读了关于填充的下一件事:PKCS#5 和 PKCS#7 填充之间只有一个主要区别是块大小。 PKCS#5 填充仅针对 8 字节块大小定义。 PKCS#7 填充适用于从 1 到 255 字节的任何块大小。因此,既然我已将块模式设置为 ECB,这应该可以工作。但我仍然没有得到相同的结果。
    • 我发现我的问题我必须做 var encryptionKey = CryptoJS.enc.Utf8.parse(key);否则我的密钥不会乱用,crypto-js 每次都会让我成为一个随机密钥和 IV
    • @Cenz0 能否请您发布完整的解决方案。
    【解决方案2】:

    这是实现“AES/ECB/PKCS5Padding”但在 JavaScript (Node.js) 中使用 ezcrypto 模块的工作解决方案

    const Crypto = require('ezcrypto').Crypto;
    let whatToEncryptAsUtf8 = Crypto.charenc.UTF8.stringToBytes(whatToEncrypt);
    let keyAsUtf8 = Crypto.charenc.UTF8.stringToBytes(key);
    let encrypted = Crypto.AES.encrypt(whatToEncryptAsUtf8, keyAsUtf8, {
      mode: new Crypto.mode.ECB(Crypto.pad.pkcs7)
    });
    

    【讨论】:

    • 您的模块在浏览器中使用时似乎已损坏。我收到错误Cannot find module './lib/hmac'
    • 这是 node.js 模块,它在 Node.js 中运行良好。如果你需要在浏览器中使用它,它可能不太容易,因为它可能在内部使用原生模块
    【解决方案3】:

    要解密使用 JAVA AES/ECB/PKCS5Padding 生成的哈希,您还需要在 js(nodejs) 中创建一个带有填充的解密密码。

    const crypto = require('crypto');
    function decrypt(data){
      var decipher = crypto.createCipheriv("aes-128-ecb", 'SAME_KEY_AS_JAVA', '');
      var dec = decipher.update(data,'base64','utf8');
      dec += decipher.final('utf8');
      return dec
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2022-10-16
      • 2021-04-13
      • 1970-01-01
      • 2011-07-14
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多