ICode9

精准搜索请尝试: 精确搜索
首页 > 编程语言> 文章详细

JS自己实现字符串加密和解密算法

2021-09-10 16:33:18  阅读:178  来源: 互联网

标签:字符 加密 36 解密 字符串 密钥 var JS


字符串加密和解密的关键是算法设计,字符串经过复杂的编码处理,返回一组看似杂乱无章的字符串。对于常人来说,输入的字符串是可以阅读的信息,但是被函数打乱或编码之后显示的字符串就会变成无意义的信息。想要把这些垃圾信息变成可用信息,还需要使用相反的算法把它们逆转回来。

如果把字符串中的“中”字进行自定义加密。可以考虑利用 charCodeAt() 方法获取该字符的 Unicode 编码。

var s = "中";
var b = s.charCodeAt(0);  //返回值20013

然后以 36 为倍数不断取余数。

b1 = b % 36;  //返回值33,求余数
b = (b - b1) / 36;  //返回值555,求倍数
b2 = b % 36;  //返回值15,求余数
b = (b - b2) / 36;  //返回值15,求倍数
b3 = b % 36;  //返回值15,求余数

那么不断求得的余数,可以通过下面公式反算出原编码值

var m = b3 * 36 * 36 + b2 * 36 + b1;  //返回值20013,反求字符“中”的编码值

有了这种算法,就可以实现字符与加密数值之间的相互转换。

定义一串密钥:

var key = "0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ";

把余数定位到与密钥中某个下标值相等的字符上,这样就实现了加密效果。反过来,如果知道某个字符在密钥中的下标值,然后反算出被加密字符的 Unicode 编码值,最后就可以逆推出被加密字符的原信息。

本例设定密钥是以 36 个不同的数值和字母组成的字符串。不同的密钥,加密解密的结果是不同的,加密结果以密钥中的字符作为基本元素。

<script>
var toCode = function (str,key) {  //加密字符串
    //定义密钥,36个字母和数字
    
    var l = key.length;  //获取密钥的长度
    var a = key.split("");  //把密钥字符串转换为字符数组
    var s = "",b, bl, b2, b3;  //定义临时变量
    for (var i = 0; i <str.length; i ++) {  //遍历字符串
        b = str.charCodeAt(i);  //逐个提取每个字符,并获取Unicode编码值
        bl = b % l;  //求Unicode编码值得余数
        b = (b - bl) / l;  //求最大倍数
        b2 = b % l;  //求最大倍数的于是
        b = (b - b2) / l;  //求最大倍数
        b3 = b % l;  //求最大倍数的余数
        s += a[b3] + a[b2] + a[bl];  //根据余数值映射到密钥中对应下标位置的字符
    }
    return s;  //返回这些映射的字符
} 

var fromCode = function (str,key) {
    //定义密钥,36个字母和数字
    var l = key.length;  //获取密钥的长度
    var b, bl, b2, b3, d = 0, s;  //定义临时变量
    s = new Array(Math.floor(str.length / 3));  //计算加密字符串包含的字符数,并定义数组
    b = s.length;  //获取数组的长度
    for (var i = 0; i < b; i ++) {  //以数组的长度循环次数,遍历加密字符串
        bl = key.indexOf(str.charAt(d));  //截取周期内第一个字符串,计算在密钥中的下标值
        d ++;
        b2 = key.indexOf(str.charAt(d));  //截取周期内第二个字符串,计算在密钥中的下标值
        d ++;
        b3 = key.indexOf(str.charAt(d));  //截取周期内第三个字符串,计算在密钥中的下标值
        d ++;
        s[i] = bl * l * l + b2 * l + b3  //利用下标值,反推被加密字符的Unicode编码值
    }
    b = eval("String.fromCharCode(" + s.join(',') + ")");//用fromCharCode()算出字符串
    return b ;  //返回被解密的字符串
}

var key = "0l23456789ABCDEFGHIJKLMNOPQRSTUVWXYZ";
var s = "JavaScript 中国";  //字符串直接量
s = toCode(s,key);  //加密字符串
console.log(s);
//返回“02Y02P03A02 P03702R03602X034038FFXH6L”
s = fromCode(s,key);  //解密被加密的字符串
console.log(s);  //返回字符串“JavaScript 中国”

var key = "0l23456789ABCDEFGHIJKLMNOPQRSTUVWXYZZZZ";
var s = "加密字符串";  //字符串直接量
s = toCode(s,key);  //加密字符串
console.log(s);
s = fromCode(s,key);  //解密被加密的字符串
console.log(s);  //返回字符串“JavaScript 中国”
    </script>

 

标签:字符,加密,36,解密,字符串,密钥,var,JS
来源: https://www.cnblogs.com/-mrl/p/15251834.html

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有