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

时间:2020-01-27 07:34:19

标签: encryption cryptography aes cryptojs

我搜索并找到了具有默认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个密钥大小。

非常感谢您的帮助。

1 个答案:

答案 0 :(得分:3)

这行得通,但是如果我想使用其他不同的纯文本(例如“ Hello World”),则会失败。

您使用了noPadding,这就是问题所在。该示例是16字节的倍数,不会引起问题,但是下一个明文则不会。您可以使用noPadding

  1. 您的消息是块大小的精确倍数,尽管仍然不建议这样做。
  2. 您想自己填充消息,可能是您想测试我们在您的代码中看不到的新填充方案。

您应该像这样填充

padding: CryptoJS.pad.Pkcs7

如我所见,如果我通过密码,CryptoJS期望使用256个密钥大小。

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

如果我想使用“ my-key-001”这样的密码怎么办?

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

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

只需提供一个128位密钥。

AES-128是否具有128位安全性

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

模式:C.mode.ECB

不建议使用ECB操作模式,因为它不安全并且会泄漏模式。您应该使用现代加密模式,例如AES-GCM,它不但提供机密性,而且还提供完整性和身份验证。

在使用GCM模式时,请确保不要在相同的键下再次使用相同的IV /一次。 AES-GCM使用CTR模式进行加密,如果IV / nonce重复,则可以使用CTR模式进行加密,因此可以进行拖拽操作。另外,它还会泄漏身份验证密钥。

相关问题