YuKi
论坛版主
论坛版主
  • 最后登录2024-03-25
  • 发帖数20
  • 社区居民
阅读:5149回复:0

用JS实现密码加密算法

楼主#
更多 发布于:2020-11-23 15:44
今天就由我给大家整个活,用JS实现密码加密算法。


注:前端加密意义不大,通常使用SSL,仅做展示



想到对字符串进行加密,我想到的就是两个方法
charCodeAt()  和  fromCharCode()


charCodeAt() 可返回指定位置的字符的 Unicode 编码。这个返回值是 0 - 65535 之间的整数。
fromCharCode() 可接受一个指定的 Unicode 值,然后返回一个字符串

var a = "hollow world"
for(let i=0;i<a.length;i++){
    var x = a.charCodeAt(i)
    console.log(x)
}
var y = String.fromCharCode(104,111,108,108,111,119,111,114,108,100)
console.log(y)
既然可以返回数字,那么就可以对这个数字进行一系列算法。
比如可以定义一个由0-9和A-Z组成的密钥,然后将获取字符串的Unicode值通过下标的形式映射到这串密钥上,但是直接用下标的话就失去了加密的意义了。


由于我们的密钥需要0-9A-Z随机组成,也就是36位。那么我们就获取到Unicode编码后不断的求36的余,然后再映射到秘钥上。


加密的思路有了,但是如何搞一串密钥呢?直接自己定义的话也很麻烦,所以就要写一个定义密钥的方法:


function getKey(){
       var str = "",
       arr = ['0', '1', '2', '3', '4', '5', '6', '7', '8', '9',  'A', 'B', 'C', 'D', 'E', 'F', 'G', 'H', 'I', 'J', 'K', 'L', 'M', 'N', 'O', 'P', 'Q', 'R', 'S', 'T', 'U', 'V', 'W', 'X', 'Y', 'Z'];
       arr.sort(function() {
           return (0.5-Math.random());
       });
       for(var i=0; i<arr.length; i++){
           str += arr<i>;
       }
       return str;
   }</i>


这个方法很简单,就是单纯的定义一个0-9,A-Z的数组,然后打乱顺序后拼接成字符串。


现在有了密钥,那么具体如何加密呢?
刚刚说到,获取到Unicode编码后不断的求密钥长度的余,然后映射到密钥的下标,然后获取密钥对应下标的字符串后拼接起来 ,就是一串加密的密码了。


function encryption(_strToenCode,key){
        let l = key.length;
        let a = key.split("");
        let s="",x,x1,x2,x3;
        for(let i=0;i<_strToenCode.length;i++){
            x=_strToenCode.charCodeAt(i);
            x1=x%l;
            x=(x-x1)/l;
            x2=x%l;
            x=(x-x2)/l;
            x3=x%l;
            s+=a[x3]+a[x2]+a[x1];
        }return s;
    }
现在,已经把密码加好密了,但是光加了密,不能解密怎么能行?
既然我们密码映射到密钥的下标上了,那么就通过密钥的下标找回来。
通过遍历加密密码,然后去密钥上找对应的下标,然后往回算出字符串对应的UniCode编码就可以了
let l=key.length;
let x,x1,x2,x3,y=0,s;
s=new Array(Math.floor(encode.length/3));
x=s.length;
for(var i=0;i<x;i++){
    x1=key.indexOf(encode.charAt(y));
    y+=1;
    x2=key.indexOf(encode.charAt(y));
    y+=1;
    x3=key.indexOf(encode.charAt(y));
    y+=1;
    s<i>=x1*l*l+x2*l+x3;
}</i>
这样一来我们就拿到密码对应的UniCode编码的数组了,你可以遍历这个数组,然后一个一个解析后拼接起来,也可以像我这样使用eval()方法。
eval('String.fromCharCode('+s.join(",")+')')
eval()方法是把括号里的字符串视为JS代码然后执行这行代码。为什么要这样做呢?因为fromCharCode()方法可以接收多个Unicode编码,用逗号隔开,但是数组拆开后是字符串。用这个方法拼接后用eval()执行,就可以把本为字符串的数组拼接后的值视为用逗号隔开的int类型。


接下来就可以封装一下:
function deGui(_str){
    this.encryption=function(_strToenCode,key){
        let l = key.length;
        let a = key.split("");
        let s="",x,x1,x2,x3;
        for(let i=0;i<_strToenCode.length;i++){
            x=_strToenCode.charCodeAt(i);
            x1=x%l;
            x=(x-x1)/l;
            x2=x%l;
            x=(x-x2)/l;
            x3=x%l;
            s+=a[x3]+a[x2]+a[x1];
        }return s;
    }
    this.getKey = function(){
        var str = "",
        arr = ['0', '1', '2', '3', '4', '5', '6', '7', '8', '9',  'A', 'B', 'C', 'D', 'E', 'F', 'G', 'H', 'I', 'J', 'K', 'L', 'M', 'N', 'O', 'P', 'Q', 'R', 'S', 'T', 'U', 'V', 'W', 'X', 'Y', 'Z'];
        arr.sort(function() {
            return (0.5-Math.random());
        });
        for(var i=0; i<arr.length; i++){
            str += arr<i>;
        }
        return str;
    }
    this.decrypt=function(encode,key){
        let l=key.length;
        let x,x1,x2,x3,y=0,s;
        s=new Array(Math.floor(encode.length/3));
        x=s.length;
        for(var i=0;i<x;i++){
            x1=key.indexOf(encode.charAt(y));
            y+=1;
            x2=key.indexOf(encode.charAt(y));
            y+=1;
            x3=key.indexOf(encode.charAt(y));
            y+=1;
            s<i>=x1*l*l+x2*l+x3;
        }
        x=eval('String.fromCharCode('+s.join(",")+')')
        return x;
    }
    var key= this.getKey();
    var encode=this.encryption(_str,key);
    this.getEncode=function(){
        return encode;
    }
    this.getKey=function(){
        return key;
    }
    this.getPasswordByKey=function(encode,key){
        return this.decrypt(encode,key);
    }
    this.getPassword=function(){
        return this.decrypt(encode,key)
    }
}</i></i>
使加密的密码和密钥只能通过get方法获取,当然,也可以把解密方法定义在服务器。下次写,下次一定写。

最新喜欢:

真知棒、真知棒、
游客


返回顶部

公众号

公众号