javascript - Javascript 加密函数中的 3DES 十六进制密钥
问题描述
我有一个 javascript 函数,使用 CryptoJS 使用 3DES 密钥加密 8 字节块。
该函数与密钥 01010101010101010101010101010101 一起使用,但它不适用于密钥 ADADADADADAD0101ADADADADADAD0202。
function enc3DES(keyHex){
var block = "040502CFFFFEFDEE";
var encrypted = CryptoJS.DES.encrypt(CryptoJS.enc.Hex.parse(block), CryptoJS.enc.Hex.parse(keyHex), {
mode: CryptoJS.mode.ECB,
padding: CryptoJS.pad.Pkcs7
});
encrypted = encrypted.ciphertext.toString();
return encrypted.substr(0, 8*2).toUpperCase();
}
使用上述函数 enc3DES():使用密钥 01010101010101010101010101010101 加密的块 040502CFFFFEFDEE 为 C9478CAA27ABA56A,此输出是正确的。
但是使用密钥 ADADADADADADAD0101ADADADADADAD0202 加密的块 040502CFFFFEFDEE 是 A413ABD86D52DFFB ,这个输出是错误的,正确的应该是 F6A1C5ACA15A50C3。
你能帮我理解为什么这个功能只有第一个键才能正常工作吗?
解决方案
3DES(或TripleDES)不是DES。因此
CryptoJS.DES
必须替换为CryptoJS.TripleDES
。3DES 密钥由 3 个连接的 DES 密钥(K1、K2、K3)组成。有三种密钥选择:3TDEA(所有三个密钥都不同),2TDEA(2 个密钥不同,K1 = K3)和所有密钥相同的第三种情况,它给出与 DES 相同的密文。第一把钥匙
01010101010101010101010101010101
对应第三个选项(所有键相同),键
ADADADADADAD0101ADADADADADAD0202
对应于第二个选项(2TDEA)。由于 CryptoJS 需要 3DES 的 24 字节密钥,因此密钥
010101010101010101010101010101010101010101010101
和
ADADADADADAD0101ADADADADADAD0202ADADADADADAD0101
必须使用。
由于明文和密文的长度相同,所以填充不能是
Pkcs7
。可以使用代替Pkcs7
,或者如果明文始终是块大小的整数倍(3DES 为 8 字节),则. 如果更改了填充,则可以返回整个密文(而不是子字符串)。ZeroPadding
NoPadding
推荐阅读
- mongodb - MongoDB 数组中的 $project
- vba - VBA - 从列表框中删除空项目
- javascript - 自从我开始学习 DOM 已经 2 周了。尝试制作语言切换器。不工作
- python - 如何将 tcp 套接字与 ftp 服务器连接
- assembly - 更改 IRQ8 ISR
- javascript - 如何过滤、搜索和排序 Django 前端记录?
- python - 使用熊猫重塑/堆叠2列?
- database - 如何以无需加载/解析整个文件即可轻松访问特定数据成员的方式将数据保存到文件?
- python - CPython 中的 _PyObject_GetAttrId() 是什么?
- java - 从生成的 RCP 的 exe 中删除数字签名