|
阅读:5150回复:0
用JS实现密码加密算法
今天就由我给大家整个活,用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方法获取,当然,也可以把解密方法定义在服务器。下次写,下次一定写。 |
|
最新喜欢: |