在爬取网页数据时,发现加密用的aes,模式cbc,密钥是32位十六进制数的字节,经测试密钥用binascii转16位字节是真正的密钥。
问题来了
javascript标准的加密库密钥可以这么用么?
可以 提供一个完整的示例
// 导入CryptoJS库
const CryptoJS = require('crypto-js')
// 定义加密密钥(32位十六进制数的字节)
const keyHex = '0123456789abcdef0123456789abcdef'
// 将16位字节转换为TypedArray
function hexToTypedArray(hex) {
var typedArray = new Uint8Array(hex.length / 2);
for (var i = 0; i < hex.length; i += 2) {
typedArray[i / 2] = parseInt(hex.substr(i, 2), 16);
}
return typedArray;
}
// 将16位字节转换为ArrayBuffer
function hexToArrayBuffer(hex) {
var typedArray = hexToTypedArray(hex);
var arrayBuffer = typedArray.buffer;
return arrayBuffer;
}
// 定义要加密的数据
const data = 'Hello world!'
// 要加密的数据需要先转换为WordArray
const dataBytes = CryptoJS.enc.Utf8.parse(data)
// 将密钥转换为WordArray
const keyBytes = CryptoJS.lib.WordArray.create(hexToArrayBuffer(keyHex))
// 定义加密算法、加密模式和填充模式
const options = {
mode: CryptoJS.mode.CBC,
padding: CryptoJS.pad.Pkcs7
}
// 加密数据
const encrypted = CryptoJS.AES.encrypt(dataBytes, keyBytes, options)
// 获取加密后的数据(以Base64字符串形式)
const ciphertext = encrypted.ciphertext.toString(CryptoJS.enc.Base64)
console.log(`加密前的数据: ${data}`)
console.log(`加密后的数据: ${ciphertext}`)