javascript实现playfair和hill加密算法
期末到期末,补习信息安全概论的作业。碰巧遇到了经典的密码算法playfair算法和hill算法,用javascript语言实现很有意思。一边编码一边查百度,顺便有个不错的javascript基础教程。
游乐场
Playfair密码(英文:Playfair密码或Playfair square)是一种替代密码。按照一张5*5平方的码表,表中有25个字母排列。对于英语中的26个字母,最常用的Z被移除以形成密码列表。
实施思路:
1.编译密码列表
密钥是一个单词或短语,密码表是根据用户给出的密钥整理出来的。如果有重复的字母,后面的重复字母可以去掉。
比如钥匙疯狗,可以编程为
c O H M T R G I N U A B J P V Y E K Q W F L S X复制代码如下:/**函数:编译密码表**参数:key(去掉空格和大写后)* *返回:密码表*/函数create key(key){//字母数组varallchars=['a ',' B ',' c ',' D ',' E ',' F ',' G ',' H ',' I ',' J ',' L ',' M ',' N '//变量keychars获取字母在字母列表中的位置,并删除ikeychars.lengthI){ var index=all chars . indexof(key chars[I]);if(index-1){ all chars . splice(index,1);} }//将keychar中的字母插入(var I=keycars)的字母表中。长度-1;I=0;I-){ all chars . unshift(key chars[I]);}//将第一列中的keychars插入(var I=0;i5;I){ for(var j=0;j5;j){ key[j][I]=all chars[I * 5j];} }}
考虑到在密码表中插入键码时需要删除重复字符和z,设计算法如下:
复制代码代码如下:/**函数:删除字符串中重复的字母**参数:待处理的字符串* *返回:已处理的字符串*/函数删除重复的(str) {var result=[],tempstr=var arr=str . split(');//将字符串分成数组//arr . sort();//排序为(var I=0;一、长度;I){ var repeatBack=true;//变量的设计是为了保证字符串前部不存在相同的字符,因为下面的算法只能保证连接在一起的相同字符是for(var j=0;jresult.lengthj){ if(arr[I]==result[j])repeat back=false;} if(arr[i]!==tempStr repeatBack){ result . push(arr[I]);tempStr=arr[I];}else{继续;} }返回result . join(“”);//将数组转换为字符串}
2、完成明文
用纯文本每两个字母做一对。如果旁边有两个相同的字母或者最后一个字母是单个的,就插入一个字母x,最初的编码考虑不周,字母数量强烈拒绝单数,导致用户体验不佳。
var k=document . getelementbyid(' key chars '). value . touppercase()。替换(/\ s/ig ' ');明文去掉空格并转换为大写。
3.写密文
明文加密规则(来自百度):1)如果p1 p2在同一行,对应的密文c1 c2就是靠近p1 p2右端的字母。其中第一列被视为最后一列的右侧。例如,根据上表,ct对应于oc2。如果p1 p2在同一列,对应的密文c1 c2就是紧接p1 p2下面的字母。其中第一行被认为是最后一行的下部。3)如果p1 p2不在同一行或同一列,c1 c2为p1 p2确定的矩形另外两个角的字母(至于水平替换还是垂直替换,提前预约或者自己试试)。根据上表,wh对应tk或kt。比如根据上表,有生命、有希望的明文可以排序为where there是li fe th er ei sh op ex然后密文是cm yg kg lm mb wf的kt yg wo ok gy nl hj,密文大写,再排列成几个字母的组。例如,一组五个是KTYGW OOKGY NLHJO FCMYG KGLMM BWF4。解密时,将密钥填充在一个5*5的矩阵中(去掉重复的字母和字母Z),矩阵中其他未使用的字母依次填充在矩阵的剩余位置,根据替换矩阵从密文中得到明文。往相反的方向走。实现效果如图:
小山
希尔密码是基于基本矩阵理论的替代密码。按照一张5*5平方的码表,表中有25个字母排列。对于英语中的26个字母,最常用的Z被移除以形成密码列表。
实施思路:
1.编写alphabet varchars=['a ',' b ',' c ',' d ',' e ',' f ',' g ',' h ',' I ',' j ',' k ',' l ',' m ',' n ',2,随机生成密钥
复制代码代码如下:/**函数:随机生成密钥* * Return:密钥矩阵*/函数randomCreateKey(){ //随机生成0到26的数字进行(var I=0;i3;I){ for(var j=0;J3;J) {key [I] [j]=数学。圆(数学。random () * 100&)}}} 3、密钥码,根据自动生成的密钥,对明文进行处理:
复制代码如下:/**函数:hill算法**参数:长度倍数为3的大写数组* *返回:加密字符串*/函数hill(p){ //大写字母密文var res=//算出遍历字符串的总次数。var round=math . round(p . length/3);//的句柄(var b=0;broundB ){ //明文3var tem3=var temparr 3=[];var Sumarr 3=[];for(var I=0;i3;I){ temp 3=p . shift();for(var j=0;jchars.lengthj){ if(temp 3[I]==chars[j])temparr 3[I]=j;} }//计算(var I=0;i3;I){ for(var j=0;J3;j){ Sumarr 3[I]=(temparr 3[j]* key[I][j])& amp;} }//获取字母表中字符的对应索引(var I=0;i3;I){ RES=chars[Sumarr 3[I]];} }返回res};
实现效果如图:
上述算法都有缺点:
1.面向过程的高耦合设计
2、嵌套循环过多,算法效率有待优化
3.它没有考虑到可能出现的情况,比如没有处理用户输入的非字母字符。
总结:
学了一段时间的《信息安全概论》这门课程,对信息安全的理解也只能是这样。信息安全是一个非常有趣的课题。遇到一些问题的时候,尽量多思考,多动手,多使用。同时要加强数学基础的积累,巩固js基础,拓宽知识面。这条路还有很长的路要走。
版权声明:javascript实现playfair和hill加密算法是由宝哥软件园云端程序自动收集整理而来。如果本文侵犯了你的权益,请联系本站底部QQ或者邮箱删除。