CryptoJS.enc.Hex和CryptoJS.enc.Base64的区别
时间: 2024-08-13 11:00:47 浏览: 108
`CryptoJS.enc.Hex` 和 `CryptoJS.enc.Base64` 都是 CryptoJS 库中的编码工具,用于处理二进制数据在字符串形式之间的转换。
1. **CryptoJS.enc.Hex** (十六进制编码):它将二进制数据转化为十六进制字符的字符串表示。这种编码通常用于显示、存储和传输加密后的数据,因为十六进制字符更易于人类阅读,并且每个十六进制位对应二进制的一个字节。
2. **CryptoJS.enc.Base64** (Base64 编码):Base64 是一种标准的数据编码方式,它将原始二进制数据分成固定长度的块(通常是3个字节),然后用64个字符替换这些块。这种方式生成的字符串长度会比原二进制数据长,但是可以包含常见字符集,因此在需要跨平台兼容或者在线通信时非常常用。
相关问题
这是后端node的加密代码exports.encrypt = (data) => { // 将 key 和 iv 转换为 Buffer 数组 var iv = crypto.randomBytes(8).toString("hex"); let keyBuffer = Buffer.from(key); let ivBuffer = Buffer.from(iv); // 创建加密器 let cipher = crypto.createCipheriv("aes-128-cbc", keyBuffer, ivBuffer); // 对数据进行加密 let encryptedData = cipher.update(data, "utf8"); encryptedData = Buffer.concat([encryptedData, cipher.final()]); // 返回 base64 编码的加密字符串 return { data: encryptedData.toString("base64"), word: iv, encryptiontype:'MD5' };,这是前端解密代码var decrypt = (iv:any,data: any) => { let ivWordArray = CryptoJS.enc.Base64.parse(iv); try { // 创建解密器 let decrypted = CryptoJS.AES.decrypt(data, key, { iv: ivWordArray, mode: CryptoJS.mode.CBC }); // 将解密结果转换为字符串,并将结果解析为 JSON 对象 let decryptedStr = CryptoJS.enc.Base64.stringify(decrypted); console.log(decryptedStr); return JSON.parse(decryptedStr); } catch (err) { console.log(err); } };但是无法解密
根据您提供的加密和解密代码,我发现有一些问题。首先,在加密代码中,您使用了`crypto.randomBytes()`方法生成了一个随机的IV,并将其转换为了一个字符串。但是,在解密代码中,您又使用了`CryptoJS.enc.Base64.parse()`方法将这个字符串转换为了一个WordArray,这样会导致IV不一致,从而无法正确解密。
另外,在解密代码中,您使用了`CryptoJS.enc.Base64.stringify()`方法将解密结果转换为了一个字符串。但是,在加密代码中,您并没有对加密结果进行Base64编码,而是直接将其转换为了一个Buffer,这也会导致解密失败。
为了解决这些问题,您可以按照以下步骤进行修改:
1. 在加密代码中,将IV转换为一个Buffer,并将其一起返回给前端。
```javascript
var iv = crypto.randomBytes(8);
// 将 IV 转换为 Buffer 数组
let ivBuffer = Buffer.from(iv);
// 创建加密器
let cipher = crypto.createCipheriv("aes-128-cbc", keyBuffer, ivBuffer);
// 对数据进行加密
let encryptedData = cipher.update(data, "utf8");
encryptedData = Buffer.concat([encryptedData, cipher.final()]);
// 返回加密结果和 IV
return {
data: encryptedData,
iv: ivBuffer.toString("base64"),
encryptiontype: 'MD5'
};
```
2. 在解密代码中,将IV转换为一个WordArray,并使用加密时返回的IV进行解密。
```javascript
var decrypt = (iv, data) => {
// 将 IV 转换为 WordArray
let ivWordArray = CryptoJS.enc.Base64.parse(iv);
try {
// 创建解密器
let decrypted = CryptoJS.AES.decrypt({ciphertext: CryptoJS.enc.Base64.parse(data)}, key, {
iv: ivWordArray,
mode: CryptoJS.mode.CBC
});
// 将解密结果转换为字符串,并将结果解析为 JSON 对象
let decryptedStr = decrypted.toString(CryptoJS.enc.Utf8);
console.log(decryptedStr);
return JSON.parse(decryptedStr);
} catch (err) {
console.log(err);
}
};
```
这样,您就可以正确地进行加密和解密了。
能详细说下这组代码是什么意思吗?代码是:Com_RegisterFile("security.js"); Com_IncludeFile("aes.js"); Com_IncludeFile("base64.js"); var SECURITYKEY = { toHexString: function(str) { var temp = ""; for (i = 0; i < str.length; i++) { temp += str.charCodeAt(i).toString(16) } return temp }, _2: function() { $.ajax({ async: false, dataType: "script", url: Com_Parameter.ResPath + "js/session.jsp?_=" + new Date().getTime() }); var str = ""; if (window.getSessionId) { str = getSessionId() } return str }, supportEncodings: function() { return ["aes", "des"] }, get: function(encodeType) { var str = SECURITYKEY._2(); if (encodeType == null || encodeType == 'aes') { if (str.length < 32) { str += "abcdefghijklmnopqrstuvwxyz1234567890" } str = str.toUpperCase(); var key = {}; key.key = str.substring(0, 16); key.iv = str.substring(16, 32); key.security = "\u4435\u5320\u4d35" } else { if (str.length < 16) { str += "abcdefghijklmnopqrstuvwxyz" } str = str.toUpperCase(); var key = {}; key.key = SECURITYKEY.toHexString(str.substring(0, 8)); key.iv = SECURITYKEY.toHexString(str.substring(8, 16)); key.security = "\u4445\u5320\u4d45" } return key }, getCookie: function(c_name) { if (document.cookie.length > 0) { var cookies = document.cookie.split(";"); for (i = 0; i < cookies.length; i++) { var xc = cookies[i]; var cn = xc.substring(0, xc.indexOf("=")).toUpperCase(); cn = cn.replace(/^\s*/, "").replace(/\s*$/, ""); if (cn == c_name) { return unescape(xc.substring(xc.indexOf("=") + 1, xc.length)) } } } return "" } }; function base64Convert() { return "\u4241\u5345\u3634{" + Base64.encode(arguments[0]) + "}" } function _0(xForm) { if (xForm == null) { xForm = document.forms[0] } if (xForm != null) { if (xForm.encoding == "multipart/form-data") { return true } } return false } function _1(str, xForm, isX) { if (_0(xForm)) { return str } else { var val = str; if (str != null && str.length > 0) str = base64Convert(str); if (val != str) { if (isX == true) { val = "\u4645\u5810\u4d40" + str } else { val = "\u4649\u5820\u4d45" + str } } return val } } function desEncrypt(value, xForm, type) { if (_0(xForm)) { return value } else { var keyObj = {}; if (type == null || "aes" == type.toLowerCase()) { keyObj = SECURITYKEY.get(); value = CryptoJS.AES.encrypt(value, CryptoJS.enc.Utf8.parse(keyObj.key), { iv: CryptoJS.enc.Utf8.parse(keyObj.iv) }).toString() } else { keyObj = SECURITYKEY.get('des'); value = CryptoJS.DES.encrypt(value, CryptoJS.enc.Hex.parse(keyObj.key), { iv: CryptoJS.enc.Hex.parse(keyObj.iv) }) } return keyObj.security + value } } function base64Encode(str, xForm) { return _1(str, xForm) } function base64Encodex(str, xForm) { return _1(str, xForm, true) }
这段代码主要是定义了一个 SECURITYKEY 对象,它有多个函数用来处理加密和解密。
- Com_RegisterFile("security.js") 和 Com_IncludeFile("aes.js") 和 Com_IncludeFile("base64.js") ,这三句话是在引入 security.js、aes.js 和 base64.js 这三个文件。
- SECURITYKEY.toHexString(str),这个函数是将字符串转换为十六进制字符串。
- SECURITYKEY._2(),这个函数是用 ajax 方式加载 session.jsp 文件,并从中获取 sessionId。
- SECURITYKEY.supportEncodings(),这个函数是返回加密类型的数组。
- SECURITYKEY.get(encodeType),这个函数是根据给定的加密类型返回加密的 key 和 iv。
- SECURITYKEY.getCookie(c_name),这个函数是获取指定名称的 cookie 的值。
- base64Convert(),这个函数是将参数编码为 base64。
- _0(xForm) 和 _1(str, xForm, isX),这两个函数的作用没有明确说明。
总之这段代码主要是定义了一个 SECURITYKEY 对象,它有多个函数用来处理加密和解密,并使用了 aes.js 和 base64.js 这两个文件。
阅读全文