crypto-js 中的默认 AES 配置是什么?
what is the default AES config in crypto-js?
https://cryptojs.gitbook.io/docs/ 刚刚说“CryptoJS 支持 AES-128、AES-192 和 AES-256。它会根据您传入的密钥的大小来选择变体。如果您使用密码短语,那么它将生成一个 256 位密钥。"
但是 mode、padding、iv 等默认配置是什么?我注意到模式和填充有一个 CipherOption
interface CipherHelper {
encrypt(message: WordArray | string, key: WordArray | string, cfg?: CipherOption): CipherParams;
decrypt(ciphertext: CipherParams | string, key: WordArray | string, cfg?: CipherOption): WordArray;
}
但我不知道默认值是多少,例如默认情况下它看起来不像 ECB 模式。
我的第二个问题是它如何根据我输入的密钥决定使用ace-128、aes-192、ase-256,例如如果我使用像“我的密码”这样的短字符串密钥,它会决定使用 ace-128 吗?怎么样?
---更新---
除了答案,我发现 cryptojs: How to generate AES passphrase 也有助于理解 CryptoJS 中使用的密码。
您对 CryptoJs-docs (https://cryptojs.gitbook.io/docs/) 的 link 揭示了您问题的答案,但我们确实有两种情况。
- 您正在为加密函数提供密码或 2) 您正在提供一个显式密钥作为输入。
场景 1:您将 password/passphrase 如“myPassword”提供给函数:
CryptoJS.AES.encrypt("Message", "Secret Passphrase");
现在 CryptoJs 派生 一个 32 字节长的 AES-256 加密密钥和 一个 16 字节长的初始化向量 (iv) 来自密码,使用此密钥加密“消息”,iv 在 AES 模式 CBC 和(默认)填充 Pkcs7.
场景 2:你给函数输入一个键:
var key = CryptoJS.enc.Hex.parse("000102030405060708090a0b0c0d0e0f");
var iv = CryptoJS.enc.Hex.parse("101112131415161718191a1b1c1d1e1f");
var encrypted = CryptoJS.AES.encrypt("Message", key, { iv: iv });
现在 CryptoJs 根据密钥长度(16/24/32 字节) 和 使用 AES-128/192/256 的密钥来自密码的 16 字节长初始化向量 (iv),使用此密钥加密“消息”,iv 在 AES 模式 CBC 和(默认)填充 Pkcs7.
更多选项:您可以使用其他模式或填充时使用像这样的选项(key + iv 从密码导出,AES 模式 CFB 和填充 AnsiX923):
var encrypted = CryptoJS.AES.encrypt("Message", "Secret Passphrase", {
mode: CryptoJS.mode.CFB,
padding: CryptoJS.pad.AnsiX923
});
https://cryptojs.gitbook.io/docs/ 刚刚说“CryptoJS 支持 AES-128、AES-192 和 AES-256。它会根据您传入的密钥的大小来选择变体。如果您使用密码短语,那么它将生成一个 256 位密钥。"
但是 mode、padding、iv 等默认配置是什么?我注意到模式和填充有一个 CipherOption
interface CipherHelper {
encrypt(message: WordArray | string, key: WordArray | string, cfg?: CipherOption): CipherParams;
decrypt(ciphertext: CipherParams | string, key: WordArray | string, cfg?: CipherOption): WordArray;
}
但我不知道默认值是多少,例如默认情况下它看起来不像 ECB 模式。
我的第二个问题是它如何根据我输入的密钥决定使用ace-128、aes-192、ase-256,例如如果我使用像“我的密码”这样的短字符串密钥,它会决定使用 ace-128 吗?怎么样?
---更新---
除了答案,我发现 cryptojs: How to generate AES passphrase 也有助于理解 CryptoJS 中使用的密码。
您对 CryptoJs-docs (https://cryptojs.gitbook.io/docs/) 的 link 揭示了您问题的答案,但我们确实有两种情况。
- 您正在为加密函数提供密码或 2) 您正在提供一个显式密钥作为输入。
场景 1:您将 password/passphrase 如“myPassword”提供给函数:
CryptoJS.AES.encrypt("Message", "Secret Passphrase");
现在 CryptoJs 派生 一个 32 字节长的 AES-256 加密密钥和 一个 16 字节长的初始化向量 (iv) 来自密码,使用此密钥加密“消息”,iv 在 AES 模式 CBC 和(默认)填充 Pkcs7.
场景 2:你给函数输入一个键:
var key = CryptoJS.enc.Hex.parse("000102030405060708090a0b0c0d0e0f");
var iv = CryptoJS.enc.Hex.parse("101112131415161718191a1b1c1d1e1f");
var encrypted = CryptoJS.AES.encrypt("Message", key, { iv: iv });
现在 CryptoJs 根据密钥长度(16/24/32 字节) 和 使用 AES-128/192/256 的密钥来自密码的 16 字节长初始化向量 (iv),使用此密钥加密“消息”,iv 在 AES 模式 CBC 和(默认)填充 Pkcs7.
更多选项:您可以使用其他模式或填充时使用像这样的选项(key + iv 从密码导出,AES 模式 CFB 和填充 AnsiX923):
var encrypted = CryptoJS.AES.encrypt("Message", "Secret Passphrase", {
mode: CryptoJS.mode.CFB,
padding: CryptoJS.pad.AnsiX923
});