前段时间看了阮一峰老师的 《XOR 加密简介》, 突发奇想写了一个基于XOR(异或) 加密解密的JavaScript程序
+-------------------------------------+
| 待 加 密 字 符 串 |
+-------------+----+------------------+
| |
+-----------------------v----v----------------------------+
| |
| 将 字 符 串 每 个 字 符 转 成 ascll 码 |
| |
+-----------------------+----+----------------------------+
| |
+-----------------------v----v----------------------------+
| |
| 将 ascll 码 进 行 xor ( 异 或 ) 加 密 |
| |
+-----------------------+----+----------------------------+
| |
+-----------------------v----v----------------------------+
| |
| 将 加 密 的 ascll 码 转 成 自 定 义 进 制 的 字 符 |
| |
+-----------------------+----+----------------------------+
| |
+-------------v----v------------------+
| 加 密 后 的 字 符 串 |
+-------------------------------------+
+-------------------------------------+
| 待 解 密 字 符 串 |
+-------------+----+------------------+
| |
+-----------------------v----v----------------------------+
| |
| 将 字 符 串 每 个 字 符 转 成 ascll 码 |
| |
+-----------------------+----+----------------------------+
| |
+-----------------------v----v----------------------------+
| |
| 将 ascll 码 进 行 xor ( 异 或 ) |
| |
+-----------------------+----+----------------------------+
| |
+-----------------------v----v----------------------------+
| |
| 将 解 密 的 ascll 码 转 成 对 应 进 制 的 字 符 |
| |
+-----------------------+----+----------------------------+
| |
+-------------v----v------------------+
| 解 密 后 的 字 符 串 |
+-------------------------------------+
Close
/**
* encrypto 加密程序
* @param {Strng} str 待加密字符串
* @param {Number} xor 异或值
* @param {Number} hex 加密后的进制数
* @return {Strng} 加密后的字符串
*/
function encrypto( str, xor, hex ) {
if ( typeof str !== 'string' || typeof xor !== 'number' || typeof hex !== 'number') {
return;
}
let resultList = [];
hex = hex <= 25 ? hex : hex % 25;
for ( let i=0; i<str.length; i++ ) {
// 提取字符串每个字符的ascll码
let charCode = str.charCodeAt(i);
// 进行异或加密
charCode = (charCode * 1) ^ xor;
// 异或加密后的字符转成 hex 位数的字符串
charCode = charCode.toString(hex);
resultList.push(charCode);
}
let splitStr = String.fromCharCode(hex + 97);
let resultStr = resultList.join( splitStr );
return resultStr;
}
/**
* decrypto 解密程序
* @param {Strng} str 待加密字符串
* @param {Number} xor 异或值
* @param {Number} hex 加密后的进制数
* @return {Strng} 加密后的字符串
*/
function decrypto( str, xor, hex ) {
if ( typeof str !== 'string' || typeof xor !== 'number' || typeof hex !== 'number') {
return;
}
let strCharList = [];
let resultList = [];
hex = hex <= 25 ? hex : hex % 25;
// 解析出分割字符
let splitStr = String.fromCharCode(hex + 97);
// 分割出加密字符串的加密后的每个字符
strCharList = str.split(splitStr);
for ( let i=0; i<strCharList.length; i++ ) {
// 将加密后的每个字符转成加密后的ascll码
let charCode = parseInt(strCharList[i], hex);
// 异或解密出原字符的ascll码
charCode = (charCode * 1) ^ xor;
let strChar = String.fromCharCode(charCode);
resultList.push(strChar);
}
let resultStr = resultList.join('');
return resultStr;
}
let s1 = 'hello world';
// 加密
s1 = encrypto(s1, 123, 25);
console.log('s1=', s1);
// s1= jz15znznzkz3gzczkz9znz16
// 解密
let s2 = decrypto(s1, 123, 25);
console.log('s2=', s2);
// s2= hello world