Javascript实现playfair加密算法和山

在期末,信息安全导论导论。碰巧遇到Playfair算法和山在古典密码学算法。使用Javascript语言来实现它非常有趣,查找百度端代码并捡起Javascript基础。

普莱费尔

playfair密码(英文:Playfair密码或Playfair square)是一种替代密码。它写的是一个由一个5×5平方密码表,25个字母排列在桌子上。在英语的26个字母,去掉最常用的Z和形成一个密码表。

实现这个想法:

1、编译一个密码表

关键是一个词或短语,和密码表是根据用户给出的关键设置。如果有重复的字母,后面的字母可以去掉。 U3000

例如,关键的疯狂狗可以弥补。






C


o


H


M


T




R


G





n


u







B


J


P


v




Y


E


K


Q


W




D


F


l


S


X








复制代码代码如下所示:

*

*函数:编译一个密码表

*

*参数:键(通过删除空格和大写)

*

*返回:一个密码表

* /

功能createkey(keychars){

字母顺序/数组

无功allchars = {'a',B,C,D,E,F,G,H,我,J。

/ /变keychars获取表中按字母顺序排列的字母位置,删除这封信

对于(var i = 0;i < keychars.length;i++){

VaR指标= allchars.indexof(keychars {我});

如果(索引> - 1){

allchars.splice(指数1);

}

}

keychar / /字母在字母表

对于(var i = keychars.length-1;我> = 0;我--){

AllChars.unshift(keychars {我});

}

/ /从第一列的插入keychars的密码表

对于(var i = 0;i < 5;i + +){

对于(var j=0;j<5;j + +){

关键{ } { } =,我allchars {我* 5 + J };

}

}

}



考虑到需要删除重复的字符和Z插入keychars到密码表,设计算法如下:

复制代码代码如下所示:

*

*函数:用字符串重复字母

*

*参数:需要处理的字符串

*

*返回:处理字符串

* /

功能removeduplicate(STR){

var = =结果tempstr {} ;

var arr = str.split(' '); / /把字符串转换成一个数组

( / / / / arr.sort);排序

对于(var i = 0;i < arr.length;i++){

无功repeatback = true; / /设计变量是确保字符串的一部分不在同一性的存在,因为下面的算法只能保证同一字符

对于(var j = 0;J < result.length;j++){

如果(ARR { } { } =结果J)

repeatback = false;

}

如果(ARR {我}!= = tempstr repeatback){

result.push(ARR {我});

tempstr = ARR {我};

其他{ }

继续;

}

}

返回(结果);将被转换为字符串数组。

}



2,整理明文。

每一个字母的每两个字母都写一个。如果有两个相同的字母在这对上,或者最后一个字母是单个的,插入一个字母x。初始编码不仔细,很难拒绝单数字母,而且用户体验不好。

var k = document.getelementbyid(keychars)。Value.toUpperCase(),更换( / /搞笑,);

清除文本并将其转换为大写。

3、编译密文

明文加密规则(来自百度):



1)如果P1 P2位于同一行上,对应的密文C1 C2是分别位于P1 P2右侧的字母表,第一列被视为最后一列的右侧,例如,根据前一表,CT对应于OC。

2)如果P1 P2在同一列中,对应的密文C1 C2分别是P1 P2之下的字母表,第一行被视为最后一行的底部。

3)如果P1 P2不在同一行上,而不是在同一列中,则C2是另两个矩形,由P2的P1(水平或垂直替换字母来代替预约或尝试)决定。



例如,根据上面的表格,哪里有生命,哪里就有希望。

他是我的朋友。

然后将密文:KT YG窝好Gy NL HJ CM YG公斤LM

将密文转换成大写字母,然后按组排列字母表。

例如,5组是ktygw ookgy nlhjo fcmyg kglmm BWF



4、解密

密钥填入一个5×5矩阵(重复的字母和字母Z)。矩阵中其他未使用的字母按顺序放置在矩阵的剩余位置,根据置换矩阵从密文中获取明文。



执行结果如下:



希尔

希尔密码(希尔密码)是一个使用基本矩阵理论的替换代码。它是由一个由5×5方组成的密码表写成的,在表中有25个字母。对于这26个英文字母,删除最常用的Z并形成一个密码表。

实现这个想法:

1,写字母表

var字符= {'a',B,C,D,E,F,G,H,我,J。

2,生成随机密钥。

复制代码代码如下所示:

*

*函数:随机生成密钥

*

*返回键矩阵

* /

功能randomcreatekey(){

0随机生成的数字为26

对于(var i = 0;i < 3;i + +){

对于(var j=0;j<3;j + +){

{我} { }键J = math.round(Math.random)×100%(26)

}

}

}



3,关键代码,基于自动生成的密钥,处理明文:

复制代码代码如下所示:

*

*函数:Hill算法

*

*参数:长度为3的倍数数组

*

*返回:加密字符串

* /

函数Hill(p){

大写/密文

var;

字符串的总数

VAR圆= math.round(p.length / 3);

治疗

对于(var b = 0;b <圆;B+){

快递 3

VaR来看= ;

无功temparr3 = { };

无功sumarr3 = { };

对于(var i = 0;i < 3;i + +){

(术语= p.shift);

对于(var j = 0;J < chars.length;j++){

如果(术语{我} { } =字符J)

我temparr3 { } = J;

}

}

计算

对于(var i = 0;i < 3;i + +){

对于(var j=0;j<3;j + +){

我sumarr3 { } =(temparr3 { } { } *键J J } {)% 26;

}

}

在字母表对应的索引中获取字符

对于(var i = 0;i < 3;i + +){

RES =字符{ sumarr3 {我} };

}

}

返回水库;

};



执行结果如下:



上述算法不够完善。

1、面向过程设计,高耦合

2,过度嵌套循环,算法的效率有待优化。

3,不考虑可能出现的情况,例如用户不处理的非字母字符。

总结:

一段信息安全导论这门课程,只有毛的安全信息。信息安全是一个非常有趣的话题,经常会碰到的一些问题尽可能多思考,多动手,多使用。同时,我们应该加强数学基础的积累,巩固和扩大基础的JS知识水平。这条路很长的路要走。