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

How to encrypt in AES using CryptoJS with key size of 128?

我搜索并找到了默认 256 密钥大小的 AES 示例,发现它已经可以工作了。但是当我想用128键大小的时候,资料很少。

我已经从 CryptoJS 的 aes 测试中提取了代码:

        var C = CryptoJS;

        var plainText = '00112233445566778899aabbccddeeff';
        var key = '000102030405060708090a0b0c0d0e0f';

        var encryptedText = C.AES.encrypt(C.enc.Hex.parse(plainText), C.enc.Hex.parse(key), { mode: C.mode.ECB, padding: C.pad.NoPadding }).ciphertext.toString();

        console.log(encryptedText);

        var decryptedText = C.AES.decrypt(C.lib.CipherParams.create({ ciphertext: C.enc.Hex.parse(encryptedText) }), C.enc.Hex.parse(key), { mode: C.mode.ECB, padding: C.pad.NoPadding }).toString();

        console.log(decryptedText);

这行得通,但如果我想使用不同的纯文本,如 'Hello World',那么它就失败了。另外,如果我想使用像 'my-key-001' 这样的密码怎么办?正如我所读到的,如果我传递密码,CryptoJS 期望使用 256 密钥大小。

非常感谢您的帮助。

This worked, but if I want to use a different plain text like 'Hello World' then it failed.

您已经使用了 noPadding,这就是问题所在。该示例是 16 字节的倍数,不会造成任何问题,但您的下一个明文不会。您可以使用 noPadding 如果

  1. 您的消息正好是块大小的倍数,但仍然不推荐。
  2. 您想自己填充消息,可能是您想测试我们在您的代码中看不到的新填充方案。

你应该像这样填充

padding: CryptoJS.pad.Pkcs7

As I have read that CryptoJS expect to use 256 key size if I pass a password.

CryptoJS 支持 AES-128、AES-192 和 AES-256。根据您的密钥大小,它将 select 密钥变体。如果您使用密码,它将生成一个 256 位大小的密码。这比 AES-128 慢 %40 倍,因为它需要 14 轮。但是使用一个好的密码,见下文。

Also what if I want to use a password like 'my-key-001'?

高熵密码很重要,否则攻击者可以通过测试密码得手。密钥生成不能增加熵。因此,您需要一种生成高熵密码的好方法,例如使用 diceware.

How to encrypt in AES using CryptoJS with key size of 128?

只需提供一个 128 位密钥。

Does AES-128 has 128-bit security

任何分组密码,不仅是 AES,都容易受到多目标攻击。在这种情况下,它不提供 128 位安全性。因此,您应该使用 192 位或 256 位密钥。 有关更详细的信息,请参阅此问题 AES-128 是否已完全破解?

mode: C.mode.ECB

不建议使用 ECB 操作模式,它不安全并且会泄露模式。您应该使用像 AES-GCM 这样的现代加密模式,它不仅可以为您提供机密性,还可以提供完整性和身份验证。

在使用 GCM 模式时,请确保您永远不会在同一密钥下再次使用相同的 IV/nonce。 AES-GCM 使用 CTR 模式进行加密,如果 IV/nonce 重复使用相同的密钥,则可以进行拖拽。此外,它可能会泄露身份验证密钥。