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知识水平。这条路很长的路要走。