|
马上注册,结交更多好友,享用更多功能^_^
您需要 登录 才可以下载或查看,没有账号?立即注册
x
本帖最后由 废物弟弟云小舟 于 2021-5-18 13:10 编辑
问题阐述:
用浏览器打开以后点击加密/解密没有效果
代码无法运行,因为是初学JS所以也不太会解决
原需求:
编写字符串加密JavaScript代码
1.基本算法:
Step1: 以下代码获得“中”字符的Unicode编码为20013
//申明字符串变量s,并将字符”中”赋值给s,当然s也可以是一个字符串
var s = “中”;
//获取s中第0个字符的Unicode编码
var b=s.charCodeAt(0);
Step2: 以下代码将20013以36为倍数不断取余数,以获得分解成b1,b2,b3参数的运算式
20013=b3*36*36+b2*36+b1
经过计算20013可以用b1=33,b2=15,b3=15,三个参数来表示。以下代码可以实现b1,b2,b3的计算:
b1 = b % 36; //求Unicode编码值得余数
b = (b - b1) / 36; //求最大倍数
b2 = b % 36; //求最大倍数的于是
b = (b - b2) / 36; //求最大倍数
b3 = b % 36; //求最大倍数的余数
Step3: 定义一串密钥:
//36即为该密钥的长度,密钥可以自定义,长度可变,但是密钥内字符不可重复。
var key = "0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ";
Step4:找到b3也就是15在密钥中的第15位的字符,即为F;找到b2也就是15在密钥中的第15位的字符,即为F;找到b1也就是33在密钥中的第33位的字符,即为X;最终“中”的加密后的字符串为FFX。从以上过程可以看出,每个字符加密后变成3个字符。
Step5: 解密过程即为相反的过程。已知密文为FFX,从密钥中可得到FFX分别在密钥中的位置为,15,15,33,即b3=15,b2=15,b1=33。根据公式b3*36*36+b2*36+b1计算得到unicode值为20013,以下代码可以求出该unicode所对应的字符“中”。
//得到s=’中’
var s = String.fromCharCode(20013);
//得到s=’中国’,可以有多个逗号
var s=String.fromCharCode(20013,22269);
2.以下HTML代码,请完成encrypt()和decrypt()这两个函数的编写,实现以下编码解码的算法。其界面效果如下图所示:
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8">
<title>字符串加密解密</title>
</head>
<body>
<input type="text" id="talkwords" value="中">
<button onclick="encrypt()">加密</button>
<button onclick="decrypt()">解密</button>
<p id="result">这里显示加密、解密结果</p>
<script>
function encrypt(){
var TalkWords = document.getElementById("talkwords");
var result = document.getElementById("result");
var plaintext = result.value;
//加密逻辑
var cipherTxt = 'FFX';
result.innerHTML = cipherTxt;
}
function decrypt(){
var result = document.getElementById("result");
var cipherTxt = result.innerHTML;
//解密逻辑
plainTxt = '中';
result.innerHTML = plainTxt;
}
</script>
</body>
</html>
3.可能需要用的JavaScript函数
var key = "0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ";
//获取字符串长度
var keyLen = key.length;
//将字符串转化为字符数组
var keyArray = key.split("");
//遍历字符串
for (var i = 0; i < key.length; i ++){
}
//字符串数组
var strArray = new Array(3);
strArray = [‘banana’, ‘apple’, ‘pear’];
//获取第字符串key第i位置上面的字符的unicode编码
var ch_unicode = key.charCodeAt(i);
//从unicode码译码获得原字符
var s = String.fromCharCode(20013);
var s=String.fromCharCode(20013,22269);
//有字符串s1,s2,实现字符串拼接
var s=s1+s2;
//在字符串key中找到下标为2的字符
var ch = key.charAt(2);
//找到某个字符在字符串中的下标,即位置
var index = key.indexOf(‘F’);
我的代码:
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8">
<title>字符串加密解密</title>
</head>
<body>
<input type="text" id="talkwords" value="吃饭了吗">
<button onclick="toCode()">加密</button>
<button onclick="fromCode()">解密</button>
<p id="result">这里显示加密、解密结果</p>
<script>
var toCode = function (str) { //加密字符串
//定义密钥,36个字母和数字
var key = "0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ";
var l = key.length; //获取密钥的长度
var a = key.split(""); //把密钥字符串转换为字符数组
var s = "",b, b1, b2, b3; //定义临时变量
for (var i = 0; i <str.length; i ++) { //遍历字符串
b = str.charCodeAt(i); //逐个提取每个字符,并获取Unicode编码值
b1 = b % l; //求Unicode编码值得余数
b = (b - b1) / l; //求最大倍数
b2 = b % l; //求最大倍数的余数
b = (b - b2) / 1; //求最大倍数
b3 = b % l; //求最大倍数的余数
s += a[b3] + a[b2] + a[b1]; //根据余数值映射到密钥中对应下标位置的字符
}
return s; //返回这些映射的字符
}
var fromCode = function (str) {
//定义密钥,36个字母和数字
var key = "0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ";
var l = key.length; //获取密钥的长度
var b, b1, b2, b3, d = 0, s; //定义临时变量
s = new Array(Math.floor(str.length / 3)); //计算加密字符串包含的字符数,并定义数组
b = s.length; //获取数组的长度
for (var i = 0; i < b; i ++) { //以数组的长度循环次数,遍历加密字符串
b1 = key.indexOf(str.charAt(d)); //截取周期内第一个字符串,计算在密钥中的下标值
d ++;
b2 = key.indexOf(str.charAt(d)); //截取周期内第二个字符串,计算在密钥中的下标值
d ++;
b3 = key.indexOf(str.charAt(d)); //截取周期内第三个字符串,计算在密钥中的下标值
d ++;
s[i] = b1 * l * l + b2 * l + b3 //利用下标值,反推被加密字符的Unicode编码值
}
b = eval("String.fromCharCode(" + s.join(',') + ")");用fromCharCode()算出字符串
return b ; //返回被解密的字符串
}
</script>
</body>
</html> |
|