第八天

  • 题目来源: 前端每日知识3+1

Javascript题目

题目 : 写一个加密解密字符串的方法(js)

问题解答

解题思路

  • 写一个加密解密字符串的方法, 可以使用动态加密的方法(比如加入随机数和时间戳)来混淆密码, 然后在根据传入的数据进行反解密

时间戳混淆

  1. function encodeStr(str) {
  2. let timeC = Date.now().toString().substr(0, 5); // 获取当前的时间戳淆
  3. let a = [',', '[', '-', 'j', '=', 'f', '/', '?', '*', '%']
  4. let newS = ''
  5. for (let item of [...str + timeC].reverse()) { //顺序颠倒
  6. newS += a[item]
  7. }
  8. return newS;
  9. }
  10. console.log(encodeStr('1321359732')); //数字型字符串//[j-[jf%?j-[/-?%
  11. // 解密
  12. function decodeStr(str) {
  13. let pwd = str.slice(5)
  14. let a = [',', '[', '-', 'j', '=', 'f', '/', '?', '*', '%']
  15. let newS = ''
  16. for (let item of [...pwd].reverse()) { // 顺序颠倒
  17. newS += a.indexOf(item)
  18. }
  19. return newS
  20. }
  21. console.log(decodeStr('%?-/[-j?%fj[-j[')); //1321359732

使用字符转换加密的方法

  1. //param: method可选参数:encodeStr(加密)与decodeStr(解密)
  2. var codeStr = (method, str) => {
  3. var hit = method == 'encodeStr' ? '*' : '/';
  4. return [...str].map((item) => {
  5. // console.log(item.charCodeAt() + hit + 10); 830/10 或者830*10
  6. return String.fromCharCode(eval(item.charCodeAt() + hit + 10));
  7. }).join('');
  8. }
  9. console.log(codeStr('decodeStr', '̾ʨ̾ʊː')); //SDSAH //̾ʨ̾ʊː

encodeURIComponent方法

  1. // 0 表示加密 1 表示解密 参数必须为数字型
  2. function codeStr(method, str) {
  3. if (method === 0) {
  4. return btoa(encodeURIComponent(str))
  5. } else if (method === 1) {
  6. return decodeURIComponent(atob(str))
  7. } else {
  8. return '输入的参数有误'
  9. }
  10. }
  11. console.log(codeStr(0, 'dawd231_Dawd'));

知识扩展

  • 获取时间戳的几种方法:Date.now(); Date.parse()可以自定义获取时间戳的方法, 返回当前时间的时间戳使用这个方法传递参数new Date()即可; +new Date(); new Date().valueOf(); new Date().getTime()时间戳详解
  • eval()方法返回js语法, 接受字符串 并且可以将接受的字符串转换成js表达式并且立即执行该表达式
  • encodeURLComponent()方法 详解