下面我们来介绍著名的凯撒密码Caesar cipher
,又叫移位密码。
移位密码也就是密码中的字母会按照指定的数量来做移位。
一个常见的案例就是ROT13密码,字母会移位13个位置。由'A' ↔ 'N', 'B' ↔'O',以此类推。
写一个ROT13函数,实现输入加密字符串,输出解密字符串。
分析,这是个密码学的经典场景,一看就是利用字母的unicode码增减实现的,在unicode码中
A~Z :65~90,a~z :97~122,0~9 : 48~57,因此通过unicode码的计算就可以实现密码变换
这里需要用到两个个函数,分别是:
charCodeAt(),将为转换成UNICODE码,如'ABC'.charCodeAt(0) // returns 65
string.fromCharCode(),将UNICODE码转换为文字,如 String.fromCharCode(65, 66, 67); // returns "ABC"
示例程序:
function rot13(str){ // LBH QVQ VG!
function rot13char(char){
if (char.charCodeAt()>=65&&char.charCodeAt()<=90){
return char.charCodeAt()>=78?String.fromCharCode(char.charCodeAt()-13):String.fromCharCode(char.charCodeAt()+13);
}else{
return char;
}
}
str=str.split("").map(rot13char).join("");
return str;
}
// Change the inputs below to test
rot13("SERR PBQR PNZC");
分析如下:
1、通过函数嵌套实现两个功能,分别是函数的切片和重组,unicode码的转换和变化;代码写的很精简
2、str=str.split("").map(rot13char).join(""); 一行代码实现了先切片后重组的全过程,我试着分析一下:
i、先执行str.split(""),字符串切片;
ii、切片完成的数组通过map函数,实现数组的重新组合()并通过join实现了无缝拼合;
iii、map的函数通过调用变量末实现了unicode的自增;
3、rot13char函数,使用了if语句判断是否为英文,65~90,如果不在这个区间则直接返回,在区间的数+13,如果unicode值大于78则为-13,实现了英文字母的轮询;
i、这里面用到了js的三元表达式,对于unicode值大于78的数字进行判断
整个代码写的很巧妙,也很精简,值得学习。