CryptoJS和密钥/IV长度
CryptoJS and key/IV length
我对AES密钥和IV长度有疑问。
首先,例如,如果我使用药物OpenSSL
扩展和openssl_encrypt()
方法,我可以清楚地看到256位AES的密钥应该是32字节,如果它不同于16个字节,IV会发出警告。我能理解,一切都很好。
然而,在CryptoJS
库中,密钥和IV长度令人沮丧。这是一个例子:
var text = "test",
key = "us5N0PxHAWuIgb0/Qc2sh5OdWBbXGady",
iv = "zAvR2NI87bBx746n";
key = CryptoJS.enc.Base64.parse(key);
iv = CryptoJS.enc.Base64.parse(iv);
crypted = CryptoJS.AES.encrypt(text, key, { iv: iv });
其中key是32字节,IV是16。CryptoJS需要解析它,在CryptoJS.enc.Base64.parse()
之后,我得到了48和24个字节。我预计这些值将被截断为所需的256位AES长度,并且进一步扩展到n个字节将是不相关的,因此生成的密文将是相同的。
但事实并非如此。当我传递给CryptoJS.AES.encrypt()更大尺寸的密钥和甚至IV时,它会产生不同的输出。所以我的问题是,为什么?在这种情况下,CryptoJS库和OpenSSL之间有什么区别?
看起来我找到了。
如果您倾向于在使用CryptoJS时传递自定义key
和IV
,请确保(假设CryptoJS.enc.Base64.parse()
给出HEX字符串,该字符串用于CryptoJS.AES.encrypt()
)密钥长度与块大小匹配。
举个例子,使用Base64密钥和iv(长度=22),CryptoJS将其加密为AES-256:
var message = "some_secret_message";
var key = "6Le0DgMTAAAAANokdEEial"; //length=22
var iv = "mHGFxENnZLbienLyANoi.e"; //length=22
key = CryptoJS.enc.Base64.parse(key);
//key is now e8b7b40e031300000000da247441226a, length=32
iv = CryptoJS.enc.Base64.parse(iv);
//iv is now 987185c4436764b6e27a72f2fffffffd, length=32
var cipherData = CryptoJS.AES.encrypt(message, key, { iv: iv });
var data = CryptoJS.AES.decrypt(cipherData, key, { iv: iv });
//data contains "some_secret_message"
对于AES-256,key
的长度为32字节。(如果您想获得AES-128,则为16字节。如果更多,CryptoJS将切换到更高的密钥长度)。在其他情况下,解密时您将得到一条空消息。示例:
var message = "some_secret_message";
var key = "6Le0DgMTAAAAANokdEEial1"; //length=23
var iv = "mHGFxENnZLbienLyANoi.e"; //length=22
key = CryptoJS.enc.Base64.parse(key); // length = 17 bytes
//key is now e8b7b40e031300000000da247441226a5d, length=34 (hex encoded)
iv = CryptoJS.enc.Base64.parse(iv); // length = 16 bytes
//iv is now 987185c4436764b6e27a72f2fffffffd, length=32 (hex encoded)
var cipherData = CryptoJS.AES.encrypt(message, key, { iv: iv });
var data = CryptoJS.AES.decrypt(cipherData, key, { iv: iv });
//data contains "" - an empty string
而且,从我所看到的,只有x % 8 == 0
字节的这种用例给出了有效的结果。
IV
的长度应该是22个字节(当Base64编码时),当使用CryptoJS.enc.Base64.parse()
进行转换时,您将获得16个字节(32个十六进制编码),这是AES-256块大小的最大值。除此之外的所有内容都将被截断。
var message = "some_secret_message";
var key = "6Le0DgMTAAAAANokdEEial"; //length=22
var iv = "mHGFxENnZLbienLyANoi.e"; //length=22
key = CryptoJS.enc.Base64.parse(key); // length=16 bytes
//key is now e8b7b40e031300000000da247441226a5d, length=32 (hex encoded)
iv = CryptoJS.enc.Base64.parse(iv); // length=16 bytes
//iv is now 987185c4436764b6e27a72f2fffffffd, length=32 (hex encoded)
var cipherData = CryptoJS.AES.encrypt(message, key, { iv: iv });
var key = "6Le0DgMTAAAAANokdEEial"; //length=22
var iv = "mHGFxENnZLbienLyANoi.e123"; //length=25
key = CryptoJS.enc.Base64.parse(key); // length = 16 bytes
//key is now e8b7b40e031300000000da247441226a5d, length=32 (hex encoded)
iv = CryptoJS.enc.Base64.parse(iv); // length = 18 bytes
//iv is now 987185c4436764b6e27a72f2fffffffded76, length=36 (hex encoded)
var data = CryptoJS.AES.decrypt(cipherData, key, { iv: iv }); //data contains "some_secret_message", so additional "123" in IV is irrelevant.
- 创建具有可变长度幻灯片显示的幻灯片
- 使用D3.js计算带有字母间距的文本长度
- 使用javascript在MVC中查找网格长度时出错
- CryptoJS和密钥/IV长度
- 淘汰赛.JS'启用'长度绑定条件不起作用
- 如何确定对象内部包含对象的JSON的长度
- 如何显示文本长度,即使它超过ng最大长度
- WAMP响应内容长度限制
- 使用javascript比较对象中的对象值和数组长度
- 必须检查长度,并在文本框中允许一些特殊字符
- 使用正则表达式匹配长度为六个字符的字母数字字符串
- Angular2/JavaScript-如何显示localStorage保存的所有变量并获取所有键的总长度
- 如果用户输入的长度小于最小长度,则显示错误消息
- 如何制作侧边栏以增加其完整长度
- 我可以设置HTML5文件上传的视频长度限制吗
- Why({}+{}).长度等于30
- 在 AngularJS 中输入的数字的限制长度
- json-api和错误结果:无法读取属性'长度'的未定义
- 根据PHP中数组的长度在Google Maps API中循环遍历标记
- 3des加密在Node.JS中返回无效的IV长度