使用CryptoJS的AES加密

塞尔吉奥·大卫·罗梅罗(Sergio David Romero)

我需要使用JavaScript实现AES加密。使用AES / CBC / NoPadding模式,并创建了一种方法来完成16个长度的块。我已经使用Java解决了。看起来像:

public static String encrypt(byte[] key, byte[] initVector, String value) {
    try {
        IvParameterSpec iv = new IvParameterSpec(initVector);
        SecretKeySpec skeySpec = new SecretKeySpec(key, "AES");
        Cipher cipher = Cipher.getInstance("AES/CBC/NoPadding");
        cipher.init(Cipher.ENCRYPT_MODE, skeySpec, iv);
        byte[] encrypted = cipher.doFinal(completeBlocks(value));
        return Base64.encodeBase64String(encrypted);
    } catch (NoSuchAlgorithmException | NoSuchPaddingException | InvalidKeyException | InvalidAlgorithmParameterException | IllegalBlockSizeException | BadPaddingException ex) {
        System.out.println("Error: " + ex);
    }

    return null;
}

/**
 * Completes 16 lenght blocks
 *
 * @param message
 *
 *
 */
static byte[] completeBlocks(String message) {
    try {

        int bytesLenght = message.getBytes("UTF-8").length;
        if (bytesLenght % 16 != 0) {
            byte[] newArray = new byte[bytesLenght + (16 - (bytesLenght % 16))];
            System.arraycopy(message.getBytes(), 0, newArray, 0, bytesLenght);
            return newArray;
        }

        return message.getBytes("UTF-8");

    } catch (UnsupportedEncodingException ex) {
        System.out.println("" + ex);
    }
    return null;
}

public static void main(String[] args) {

    String key = "253D3FB468A0E24677C28A624BE0F939";
    String strToEncrypt = "My Secret text";
    final byte[] initVector = new byte[16];
    String resultado = encrypt(new BigInteger(key, 16).toByteArray(), initVector, strToEncrypt.trim());
    System.out.println("ENCRYPTED:");
    System.out.println(resultado);
}

具有输入key = 253D3FB468A0E24677C28A624BE0F939strToEncrypt = "My Secret text"和CEROS IV。它抛出

7StScX3LnPUly / VNzBes0w ==

我知道这是所需的输出。这是正确的!我试图使用JavaScript复制此代码。我使用了CryptoJs库。但是我无法产生相同的Java输出。我尝试过:

var text = "My Secret text";
var key = CryptoJS.enc.Base64.parse("253D3FB468A0E24677C28A624BE0F939");
var iv  = CryptoJS.enc.Base64.parse("                ");
var encrypted = CryptoJS.AES.encrypt(text, key, {iv: iv});
console.log(encrypted.toString());

var decrypted = CryptoJS.AES.decrypt(encrypted, key, {iv: iv});
console.log(decrypted.toString(CryptoJS.enc.Utf8));

使用相同的输入,我De+CvPVIyiBX2//EE6gXTg==作为输出。我究竟做错了什么?如何获得相同的Java输出?非常感谢!!

亚历克斯·K

假设您将修复诸如空IV之类的问题,并且这是概念证明,那么您的代码将失败,因为:

  1. 您在Java中不使用填充,而在JS中则需要使用填充
  2. 您在Java中手动填充空值,而在JS中也需要这样做
  3. 您对密钥进行base64解码,但对base64则不进行解码(它是字节的十六进制字符串)
  4. Java IV是一个null数组,但是在JS中,您使用了空格(并且错误地将其视为base64)。

要在JS中复制输出:

CryptoJS.pad.NoPadding = {pad: function(){}, unpad: function(){}};

var text = "My Secret text\0\0";
var key  = CryptoJS.enc.Hex.parse("253D3FB468A0E24677C28A624BE0F939");
var iv   = CryptoJS.enc.Hex.parse("00000000000000000000000000000000");

var encrypted = CryptoJS.AES.encrypt(text, key, {iv: iv, padding: CryptoJS.pad.NoPadding});

console.log(encrypted.toString());

对于:

7StScX3LnPUly / VNzBes0w ==

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章

AES CBC:JavaScript / CryptoJS加密-> Golang解密

使用AES加密数据

Go中的AES-CTR加密和CryptoJS中的解密

使用CryptoJS在Java中进行AES加密并在JavaScript中进行解密

CryptoJS使用密码对AES进行加密,但PHP解密需要一个密钥

使用CryptoJS加密并使用PHP解密

使用CryptoJS和PHP进行AES加密

AES-256-CBC中的CryptoJS加密返回意外值

AES在Cryptojs中加密,在Pycrypto中解密

如何使用密钥大小为128的CryptoJS在AES中进行加密?

使用ECB模式的CryptoJS AES加密在相同的参数下产生不同的结果

CryptoJS AES解密用PHP openssl_encrypt加密的消息

如何使用CryptoJs正确加密AES256的方法

使用CryptoJS在javascript中进行AES加密/解密

使用AES加密文件

创建CryptoJS AES密码加密器以在.NET中解密

使用CryptoJS解密openssl AES

在浏览器的Node和CryptoJS之间使用AES加密时的问题

使用phpseclib使用AES进行加密,并使用CryptoJS进行解密

使用CryptoJS进行AES加密并使用CodeIgniter进行解密

使用AES的Java加密

AES-256 CBC加密在Ruby / PHP中成功,但是使用CryptoJS解密失败

在Cryptojs中将Pkcs5填充与AES加密一起使用

使用CryptoJS加密数据并使用AESCipherService解密

在 node.js 中重复 cryptojs aes 加密的替代方法

使用 CryptoSwift 和 CryptoJS 的 AES 加密

传递 CryptoJS AES 加密密钥的静态值是否安全?

在 C# 中使用 MD5 和 SHA256 的 CryptoJS AES 加密未生成正确的值

CryptoJS javascript AES-128,ECB 加密/解密