fe-interview
fe-interview copied to clipboard
[js] 第8天 写一个加密字符串的方法
第8天 写一个加密字符串的方法
function strEncrypt(str) {
return str.split('').map(s => {
return String.fromCharCode(s.charCodeAt() + 1)
}).join('')
}
console.log(strEncrypt('hello world')) // ifmmp!xpsme
escape("我是被简单的加密了") // "%u6211%u662F%u88AB%u7B80%u5355%u7684%u52A0%u5BC6%u4E86"
仅支持浏览器端:
function encode (str) {
return btoa(encodeURIComponent(str));
}
function decode (str) {
return decodeURIComponent(atob(str));
}
源自阮一峰《JavaScript 标准教程》
// 利用 base64, 浏览器环境自带 btoa / atob 方法
// Node.js 需要引入相关库
const str = "abcdefg";
console.log(btoa(str));
console.log(atob(btoa(str)));
// 凯撒密码
const encodeCaesar = ({str = "", padding = 3}) =>
!str
? str
: str
.split("")
.map((s) => String.fromCharCode(s.charCodeAt() + padding))
.join("");
const decodeCaesar = ({str = "", padding = 3}) =>
!str
? str
: str
.split("")
.map((s) => String.fromCharCode(s.charCodeAt() - padding))
.join("");
console.log(encodeCaesar({str: "hello world"}));
console.log(decodeCaesar({str: "khoor#zruog"}));
题目应该加密和解密同时实现吧
@kokokele 你可以同时实现出来
function encodeStr(str, key) {
return str
.split("")
.map(item => {
return item.charCodeAt() * key;
})
.join("#");
}
function decodeStr(str, key) {
return str
.split("#")
.map(item => {
return String.fromCharCode(+item / key);
})
.join("");
}
console.log(decodeStr(encodeStr("hello world", 665), 665));
//param: method可选参数:encodeStr(加密)与decodeStr(解密)
var codeStr=(method,str)=>{
var hit = method=='encodeStr'?'*':'/';
return [...str].map((item)=>{
return String.fromCharCode(eval(item.charCodeAt()+hit+10));
}).join('');
}
console.log(codeStr('encodeStr','SDSAH'));
js生成动态密文
前端生成的密文虽然谈不上安全,但是可以用于混淆文本,防止一些参数被猜到.
特点: 每次生成的密文都不一样,解密后的文本一样
原理: 加密: 将字符串中的字符拆分成数组并将其转为字符的八进制Unicode码->反序->分割字符串->在字符串中随机加入小写字母,将分割符替换为随机大写字母
这样最终生成了 由数字/小写字母/大写字母的 动态密文
解密: 去掉小写字母->将大写字母替换为一个分割符并用分割符 拆分字符串为数组->反序->将八进制Unicode码转字符串->将数组合并成字符串
使用场景:
隐藏一些不想让用户直接看见的参数, 比如 url中的 id 等参数,cookies中的信息等
生活使用: 也可将自己常用的密码加密后保存在电脑上,避免密码被直接暴露.
//加密 function encodeStr(str) { if (!str) return; var random = function (lower, upper) { return Math.floor(Math.random() * (upper - lower + 1)) + lower; }; var arr = str.toString().split("").map(function (item) { return item.charCodeAt(0).toString(8) }); arr.reverse();//反序数组 arr = arr.join("").split("");//暂时使用 _ 分割字符串; var num = 0; while (num < str.length) { var r = String.fromCharCode(random(97, 122));//生成用于混淆的 的 小写字母 arr.splice(random(0, arr.length), 0, r); num++; } return arr.join("").replace(//ig, function (str) { return String.fromCharCode(random(65, 90)); });//将分割符 _ 替换为随机的 大写字母
}
//解密
function decodeStr(str) { if (!str) return; var temp = []; str.split("").forEach(function (item) { var code = item.charCodeAt(0); if (code <= 90 && code >= 65) { item = "";//将作为分割用的 随机大写字母 统一为 _ 以便切割 temp.push(item); }else if (code <= 57 && code >= 48) { temp.push(item);//提取 数字 } }); temp = temp.join("").split(""); temp.reverse(); var res = temp.map(function (item) { return String.fromCharCode(parseInt(item, 8)); }); return res.join(""); }
https://www.crazyming.com/note/1704/
//第8天 写一个加密字符串的方法
function strEncrypt(str) {
var sault = 3;
return str
.split("")
.map(c => {
return String.fromCharCode(c.charCodeAt(0) + sault);
})
.join("");
}
function strDecrypt(str) {
var sault = 3;
return str
.split("")
.map(c => {
return String.fromCharCode(c.charCodeAt(0) - sault);
})
.join("");
}
var str = "hello, world";
console.log(strEncrypt(str));
console.log(strDecrypt(strEncrypt(str)));
var str="abcdqwa";
var newStr="";
function encrypt(str){
for(var i=0;i<str.length;i++){
newStr+=String.fromCharCode(str[i].charCodeAt()+10);
};
return newStr;
};
function decrypt(newStr){
var char="";
for(var i=0;i<newStr.length;i++){
char+=String.fromCharCode(newStr[i].charCodeAt()-10);
};
return char;
}
function fn(str) {
return str.replace(/\w/g, (s) => {
var code = s.charCodeAt();
if (code <= 77) {
return String.fromCharCode(code + 13);
} else {
return String.fromCharCode(code - 13);
}
})
}
console.log(fn("my family"));//`l YT`\_l
function fn(str) { return str.replace(/\w/g, (s) => { var code = s.charCodeAt(); if (code <= 77) { return String.fromCharCode(code + 13); } else { return String.fromCharCode(code - 13); } }) } console.log(fn("my family"));//`l YT`\_l
这么搞你怎么解密
btoa与atob
只能加密ascii,不能加密汉字。
encodeURIComponent
只能将中文加密,不可以加密ascii
加密时 可以先将中文加密,然后再用btoa加密 解密时可以先将ascii解密,然后再将非ascii解密
var str = 'i love中国';
// 加密
var jiaMi = encodeURIComponent(str);
var jiaM = btoa(jiaMi);
//解密,先用atob解密ascii码,然后再用decodeURIComponent
var jieMi = atob(jiaM);
var jieM = decodeURIComponent(jieMi);
贴一个每次生成不同的密文同时支持解密的方法。
思路
- 获取原字符串中每个字符的unicode码
- 每一位之前插入随机数
- 合成新的字符串
- 解码的时候排除掉随机数
function extend(num, len) {
let res = `${num}`;
while (res.length < len) {
res = "0" + res;
}
return res;
}
function random() {
return Math.floor(Math.random() * 10);
}
function encrypt2(str) {
return Array.from(str)
.map((ele) => {
// 生成随机数,扩展原字符的编码从8至16
const code = ele.charCodeAt();
const extendedCode = extend(code, 8);
const r1 = extendedCode.split("").map((ele) => {
return random() + ele
}).join('')
return r1;
})
.map((ele) => {
// 分成四组,每组四个数字
const arr = [];
for (let i = 0; i < ele.length; i = i + 4) {
const s1 = ele.substr(i, 4);
arr.push(s1);
}
return arr;
})
.map((ele) => {
// 合成最终的字符串
return ele
.map((i) => {
return String.fromCharCode(Number(i) + 33); // 这里33是因为ascii码中0~31是不可显字符,32是空格
})
.join("");
})
.join("");
}
function decrypt2(str) {
const arr = [];
for (let i = 0; i < str.length; i = i + 4) {
arr.push(str.substr(i, 4));
}
return arr.map((ele) => {
return ele.split("").map((i) => {
return extend(i.charCodeAt() - 33, 4);
}).join('');
}).map((ele) => {
const targets = []
for (let i = 1; i < ele.length; i = i+2) {
targets.push(ele[i])
}
return String.fromCharCode(Number(targets.join('')))
});
}
var encrypted = encrypt2("hello你好");
console.log(encrypted);
console.log(decrypt2(encrypted));
ή⎣Ꮢ௧ࡁᏜѤ⍝ѣᯑgល,⎗࿕{вࡖᏻ⎒ᏹࠥ
[ 'h', 'e', 'l', 'l', 'o', '你', '好' ]
ѣࡁ⎉ៃ࠭ᐄఋ࠷J់ᯓဇ២Яရᾱࠤ⏠⍉ЩᾪᑱAᢼ⎬
[ 'h', 'e', 'l', 'l', 'o', '你', '好' ]
gࡋѐួࡋ௭߲њ⍻ᾝ᮳ᐃх࿖ࠫΆఋធ⍩ឨउ᭹⍋①တ
[ 'h', 'e', 'l', 'l', 'o', '你', '好' ]
// 写一个加密字符串的方法 加密方法:每个字符等于字符的Unicode码+2 let myString = '[email protected]'; //加密 function encryptionString(str) { let newStr = new String; // str = str.reverse(); for(let i = 0; i < str.length; i++) { newStr += String.fromCharCode((str.charCodeAt(i) + 2)); } console.log(newStr); return newStr; } //解密 function decodeString(str) { let oldStr = new String; for(let i = 0; i < str.length; i++) { oldStr += String.fromCharCode((str.charCodeAt(i) - 2)); } console.log(oldStr); return oldStr; } let newStr = encryptionString(myString); decodeString(newStr);
const str = "hello world"; function enCode(str) { let key = String.fromCharCode(str.charCodeAt(0) + str.length); for (let i = 1; i < str.length; i++) { key += String.fromCharCode(str.charCodeAt(i) + str.charCodeAt(i - 1)); }
return escape(key); } function deCode(code) { code = unescape(code); let key = String.fromCharCode(code.charCodeAt(0) - code.length); for (let i = 1; i < code.length; i++) { key += String.fromCharCode(code.charCodeAt(i) - key.charCodeAt(i - 1)); } return key; } let code = enCode(str); console.log(deCode(code));
let code = escape("hello_world"); let decode = unescape(code); console.log(decode);
function encode (str) { return btoa(encodeURIComponent(str)); } function decode (str) { return decodeURIComponent(atob(str)); } console.log(encode(str)) console.log(decode(encode(str)))
字符转换
// 字符转换加密/解密
function strEnDecrypt(str, method) {
// 加解密对应不同运算符(默认解密)
let operator = method === "encrypt" ? "*" : "/";
return [...str]
.map((char) => {
return String.fromCharCode(eval(char.charCodeAt() + operator + 10));
})
.join("");
}
console.log(strEnDecrypt("absgdi", "encrypt"));
console.log(strEnDecrypt("ϊϔѾІϨК", "decrypt"));
encodeURIComponent 方法
// encodeURIComponent方法
function strEnDecrypt1(str, method) {
// 0加密 1解密
if (method === 0) {
return btoa(encodeURIComponent(str));
} else if (method === 1) {
return decodeURIComponent(atob(str));
} else {
return "输入参数不正确";
}
}
console.log(strEnDecrypt1("absgdi", 0));
console.log(strEnDecrypt1("YWJzZ2Rp", 1));
时间戳混淆(数字型字符串)
function strEncrypt(str) {
let timeCon = Date.now().toString().substr(0, 5); // 时间戳转字符串取前五位
let order = [",", "[", "-", "j", "=", "f", "/", "?", "*", "%"];
let newStr = "";
for (let char of [...(str + timeCon)].reverse()) {
newStr += order[char];
}
return newStr;
}
function strDecrypt(str) {
let pwd = str.slice(5);
let order = [",", "[", "-", "j", "=", "f", "/", "?", "*", "%"];
let newStr = "";
for (let char of [...pwd].reverse()) {
newStr += order.indexOf(char);
}
return newStr;
}
console.log(strEncrypt("2323232"));
console.log(strDecrypt("-fj/[-j-j-j-"));
XOR加密
// XOR加密
// 生成一个随机的 key
// 生成一个随机整数
function getRandomInt(min, max) {
return Math.floor(Math.random() * (max - min + 1) + min);
}
// 生成一个随机的十六进制数
function getHex() {
let n = 0;
for (let i = 4; i > 0; i--) {
n = getRandomInt(0, 1) << (i - 1 + n);
}
return n.toString(16);
}
// 生成一个32位的十六进制值,用作一次性key
function getOTP() {
const arr = [];
for (let i = 0; i < 32; i++) {
arr.push(getHex());
}
return arr.join("");
}
// XOR运算
function getXOR(message, key) {
const arr = [];
for (let i = 0; i < 32; i++) {
const m = parseInt(message.substr(i, 1), 16);
const k = parseInt(key.substr(i, 1), 16);
arr.push((m ^ k).toString(16));
}
return arr.join("");
}
function xorEncrypt(password) {
const message = md5(password);
const key = getOTP();
return getXOR(password, key);
}
console.log(xorEncrypt("1232aewes"));
// 写一个加密字符串的方法 // 第一种 利用window自带的btoa let str4 = 'hello xq 我' encodeURIComponent function encodeStr(str, gap = 6) { // btoa 不能识别中文 // return btoa(encodeURIComponent(str))
// 第二种 利用 Unicode编码来加密
return str.split('').map(s => {
return String.fromCharCode(s.charCodeAt() + gap)
}).join('')
}
function decodeStr(str, gap = 6) {
// return decodeURIComponent(atob(str))
return str.split('').map(s => {
return String.fromCharCode(s.charCodeAt() - gap)
}).join('')
}
console.log(decodeStr(encodeStr(str4)))
function encryptString(str) { let encryptedStr = ""; // 存放加密后的结果
for (let i = 0; i < str.length; i++) {
const charCode = str[i].charCodeAt(); // 获取每个字符的ASCII值
if (/^[a-zA-Z]$/.test(str[i])) { // 判断当前字符是否为英文字母
const shiftedCharCode = (charCode + 13) % 26; // 将字符向右移动13位(模运算)
encryptedStr += String.fromCharCode(shiftedCharCode); // 转换成对应的字符并添加到加密结果中
} else {
encryptedStr += str[i]; // 非英文字母直接保持不变
}
}
return encryptedStr;
}
// 测试加密函数 const originalStr = "Hello World!"; console.log("原始字符串:", originalStr); const encryptedStr = encryptString(originalStr); console.log("加密后的字符串:", encryptedStr);