鱼C论坛

 找回密码
 立即注册
查看: 4721|回复: 1

求助:利用JavaScript代码编写字符串加密

[复制链接]
发表于 2021-5-18 13:05:00 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能^_^

您需要 登录 才可以下载或查看,没有账号?立即注册

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>
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

 楼主| 发表于 2021-5-18 13:07:07 | 显示全部楼层
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2024-9-29 10:31

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表