fe-interview icon indicating copy to clipboard operation
fe-interview copied to clipboard

[js] 第8天 写一个加密字符串的方法

Open haizhilin2013 opened this issue 5 years ago • 22 comments

第8天 写一个加密字符串的方法

haizhilin2013 avatar Apr 23 '19 20:04 haizhilin2013

function strEncrypt(str) {
  return str.split('').map(s => {
    return String.fromCharCode(s.charCodeAt() + 1)
  }).join('')
}

console.log(strEncrypt('hello world')) // ifmmp!xpsme

linghucq1 avatar May 08 '19 09:05 linghucq1

escape("我是被简单的加密了") // "%u6211%u662F%u88AB%u7B80%u5355%u7684%u52A0%u5BC6%u4E86"

myprelude avatar Jun 13 '19 08:06 myprelude

仅支持浏览器端:

function encode (str) {
	return btoa(encodeURIComponent(str));
}

function decode (str) {
	return decodeURIComponent(atob(str));
}

源自阮一峰《JavaScript 标准教程》

MartinsYong avatar Jun 24 '19 07:06 MartinsYong

// 利用 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"}));

Konata9 avatar Jul 05 '19 06:07 Konata9

题目应该加密和解密同时实现吧

kokokele avatar Jul 09 '19 03:07 kokokele

@kokokele 你可以同时实现出来

haizhilin2013 avatar Jul 09 '19 03:07 haizhilin2013

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));

JJL-SH avatar Sep 05 '19 13:09 JJL-SH

//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'));

pigPEQ avatar Nov 08 '19 06:11 pigPEQ

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/

crazyming9528 avatar Dec 20 '19 06:12 crazyming9528

//第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)));

YeChang avatar Dec 22 '19 07:12 YeChang

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;
}

susanforme avatar Feb 04 '20 06:02 susanforme

    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

giggleCYT avatar Jun 01 '20 08:06 giggleCYT

    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

这么搞你怎么解密

timeyo avatar Jun 01 '20 12:06 timeyo

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);

yangyingwx avatar Sep 11 '20 07:09 yangyingwx

贴一个每次生成不同的密文同时支持解密的方法。

思路

  1. 获取原字符串中每个字符的unicode码
  2. 每一位之前插入随机数
  3. 合成新的字符串
  4. 解码的时候排除掉随机数
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', '你', '好' ]

zebratt avatar Jan 14 '21 08:01 zebratt

// 写一个加密字符串的方法 加密方法:每个字符等于字符的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);

GodEnd avatar Mar 21 '21 09:03 GodEnd

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));

378406712 avatar Apr 23 '21 03:04 378406712

let code = escape("hello_world"); let decode = unescape(code); console.log(decode);

378406712 avatar Apr 23 '21 03:04 378406712

function encode (str) { return btoa(encodeURIComponent(str)); } function decode (str) { return decodeURIComponent(atob(str)); } console.log(encode(str)) console.log(decode(encode(str)))

xuan-123 avatar Oct 11 '21 07:10 xuan-123

字符转换

// 字符转换加密/解密
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"));

amikly avatar Oct 26 '21 10:10 amikly

// 写一个加密字符串的方法 // 第一种 利用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)))

xiaoqiangz avatar May 23 '22 02:05 xiaoqiangz

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);

lili-0923 avatar Feb 02 '24 06:02 lili-0923