CryptoJS PBKDF2 AES对称加密
CryptoJS
提供了和OpenSSL
加密命令一致的AES对称加密方法,此方法基于EvpKDF
对Secret Passphrase
进行计算(This key derivation function is meant to conform with EVP_BytesToKey.
),确保进行AES加密计算的key
符合长度标准并提升AES加密的安全性。CryptoJS
没有直接提供基于PBKDF2
的AES加密方法,但在OpenSSL
中提供了-pbkdf2
参数并将该参数作为AES加密的推荐选项。
CryptoJS:https://github.com/brix/crypto-js
基于 PBKDF2 的 OpenSSL AES加密命令
openssl enc -aes-256-cbc -md sha256 -pbkdf2 -in infile -out outfile -pass pass:"password" -e -base64
所得到的Base64编码后加密结果,进行Base64解码后,以Salted__
开头([0x53616c74, 0x65645f5f]
,Hex: 53616c7465645f5f
、Base64前缀: U2FsdGVkX1
)。说明其格式遵循OpenSSL
的加密定义。在不同后端语言中均可以较方便的找到遵循OpenSSL
定义的实现方法,相比自定义的data
-salt
-iv
结构通用性更好,亦可遵循Rfc2898DeriveBytes
解密。
CryptoJS 对 PBKDF2 的拓展
CryptoJS.kdf.PBKDF2 = {
/**
* Derives a key and IV from a password.
* @param {string} password The password to derive from.
* @param {number} keySize The size in words of the key to generate.
* @param {number} ivSize The size in words of the IV to generate.
* @param {WordArray|string} salt (Optional) A 64-bit salt to use. If omitted, a salt will be generated randomly.
*
* @return {CipherParams} A cipher params object with the key, IV, and salt.
*
* @static
*
* @example
*
* var derivedParams = CryptoJS.kdf.PBKDF2.execute('Password', 256/32, 128/32);
* var derivedParams = CryptoJS.kdf.PBKDF2.execute('Password', 256/32, 128/32, 'saltsalt');
*/
execute: function (password, keySize, ivSize, salt) {
// Generate random salt
if (!salt) {
salt = CryptoJS.lib.WordArray.random(64 / 8);
}
// Derive key and IV
var key = CryptoJS.algo.PBKDF2.create({ keySize: (keySize + ivSize) * 4, hasher: CryptoJS.algo.SHA256, iterations: 10000 }).compute(password, salt);
// Separate key and IV
var iv = CryptoJS.lib.WordArray.create(key.words.slice(keySize), ivSize * 4);
key.sigBytes = keySize * 4;
// Return params
return CryptoJS.lib.CipherParams.create({ key: key, iv: iv, salt: salt });
}
}
Format
使用Crypto
默认提供的方法即可。
JavaScript CryptoJS AES 加密解密测试
var encrypted = CryptoJS.AES.encrypt("MySecretData", "password", { kdf: CryptoJS.kdf.PBKDF2 }).toString();
console.log("Encrypted string:", encrypted); // Encrypted string: U2FsdGVkX1+y5zXrE41OFRQ/uA/m+XYYrAhOO9pts/A=
var decrypted = CryptoJS.AES.decrypt(encrypted, "password", { kdf: CryptoJS.kdf.PBKDF2 }).toString(CryptoJS.enc.Utf8);
console.log("Decrypted string:", decrypted); // Decrypted string: MySecretData
OpenSSL 解密测试
echo 'U2FsdGVkX1+y5zXrE41OFRQ/uA/m+XYYrAhOO9pts/A=' > outfile
openssl enc -aes-256-cbc -pbkdf2 -in outfile -out testfile -pass pass:"password" -d -base64
测试得到testfile
文件内容为:
MySecretData%
解密成功。
除特别注明外,本站所有文章均为原创。原创文章均已备案且受著作权保护,未经作者书面授权,请勿转载。
打赏
交流区
暂无内容
老师你好,我希望能用一个openwrt路由器实现IPv4和IPv6的桥接,请问我该如何实现?我尝试了直接新增dhcpv6的接口,但是效果不甚理想(无法成功获取公网的ipv6,但是直连上级路由的其他设备是可以获取公网的ipv6地)
![%E5%B1%8F%E5%B9%95%E6%88%AA%E5%9B%BE20241205230845.png](https://cdn.wyr.me/visitor-files/2024-12-05/1733411344287屏幕截图 2024-12-05 230845.png)你好
,为什么我这里是0039 813C 0600 0075 16xx xx xx,只有前6组是相同的,博客中要前8位相同,这个不同能不能照着修改呢?我系统版本是Win1124H2
大神你好,win11专业版24h2最新版26100.2033,文件如何修改?谢谢
win11专业版24h2最新版26100.2033,Windows Feature Experience Pack 1000.26100.23.0。C:\Windows\System32\termsrv.dll系统自带的这个文件,39 81 3C 06 00 00 0F 85 XX XX XX XX 替换为 B8 00 01 00 00 89 81 38 06 00 00 90。仍然无法远程连接。原来是win11 21h2系统,是可以远程链接的。共享1个主机,2个显示器,2套键鼠,各自独立操作 各自不同的账号,不同的桌面环境。
博主,win11专业版24h2最新版,C:\Windows\System32\termsrv.dll系统自带的这个文件,找不到应该修改哪个字段。我的微信:一三五73二五九五00,谢谢