javascript实现playfair和hill密码算法


Posted in Javascript onDecember 07, 2014

时至期末,补习信息安全概论作业。恰巧遇古典密码学算法中的playfair算法和hill算法,用javascript语言实现起来是在有趣,边查百度边编码,顺便好好补习一下javascript基础。

playfair

Playfair密码(英文:Playfair cipher 或 Playfair square)是一种替换密码。依据一个5*5的正方形组成的密码表来编写,表中排列有25个字母。对于英语中的26个字母,去掉最常用的Z,构成密码表。

实现思路:

1,编制密码表

密钥是一个单词或词组,密码表则根据用户所给出的密钥整理而出。若有重复字母,可将后面重复的字母去掉。 

如密钥crazy dog,可编制成

C O H M T
R G I N U
A B J P V
Y E K Q W
D F L S X

/*

*    功能:编制密码表

*

*    参数:密钥(经过去除空格和大写处理)

*

*    返回:密码表

*/

function createKey(keychars){

       //字母顺序数组

    var allChars = ['A','B','C','D','E','F','G','H','I','J','K','L','M','N','O','P','Q','R','S','T','U','V','W','X','Y'];

       //变量keychars获取字母在字母顺序表中位置,删除该字母

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

        var index = allChars.indexOf(keychars[i]);

        if (index > -1) {

            allChars.splice(index, 1);

        }

    }

       //将keychar中的字母插入到字母表中

    for(var i = keychars.length-1;i>=0;i--){

        allChars.unshift(keychars[i]);

    }

        //从第一列将keychars插入至密码表

    for(var i = 0 ; i<5 ; i++){

        for(var j = 0; j<5 ;j++){

            key[j][i] = allChars[i*5+j];

        }

    }

}   

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

/*

*    功能:去除字符串中重复字母

*

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

*

*    返回:处理过的字符串

*/

function removeDuplicate(str){

    var result = [],tempStr = "";

    var arr = str.split('');//把字符串分割成数组

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

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

            var repeatBack = true;//设计变量是为确保字符串前部分不存在相同字符,因为以下算法只能确保连在一起相同的字符

            for(var j = 0;j<result.length ;j++){

                if(arr[i] == result[j])

                    repeatBack = false;

            }

            if(arr[i] !== tempStr && repeatBack){

                result.push(arr[i]);

                tempStr = arr[i];

            }else{

                continue;

            }

        }

        return result.join("");//将数组转换为字符串

}

2,整理明文

将明文每两个字母组成一对。如果成对后有两个相同字母紧挨或最后一个字母是单个的,就插入一个字母X。初期编码时考虑不周到,强硬地拒绝输入字母个数为单数,用户体验不佳。

var k = document.getElementById("keychars").value.toUpperCase().replace(/\s/ig,'');
对明文去除空格和转换为大写处理。

3,编写密文

明文加密规则(出自百度):
 
1 )若p1 p2在同一行,对应密文c1 c2分别是紧靠p1 p2 右端的字母。其中第一列被看做是最后一列的右方。如,按照前表,ct对应oc
2 )若p1 p2在同一列,对应密文c1 c2分别是紧靠p1 p2 下方的字母。其中第一行被看做是最后一行的下方。
3 )若p1 p2不在同一行,不在同一列,则c1 c2是由p1 p2确定的矩形的其他两角的字母(至于横向替换还是纵向替换要事先约好,或自行尝试)。如按照前表,wh对应tk或kt。
 
如,依照上表,明文where there is life,there is hope.
可先整理为wh er et he re is li fe th er ei sh op ex
然后密文为:kt yg wo ok gy nl hj of cm yg kg lm mb wf
将密文变成大写,然后几个字母一组排列。
如5个一组就是KTYGW OOKGY NLHJO FCMYG KGLMM BWF
 
4,解密
将密钥填写在一个5*5的矩阵中(去出重复字母和字母z),矩阵中其它未用到的字母按顺序填在矩阵剩余位置中,根据替换矩阵由密文得到明文。反其道而行。
 
实现效果如图:

javascript实现playfair和hill密码算法

hill

希尔密码(Hill Password)是运用基本矩阵论原理的替换密码。依据一个5*5的正方形组成的密码表来编写,表中排列有25个字母。对于英语中的26个字母,去掉最常用的Z,构成密码表。

实现思路:

1,编写字母表
var chars = ['A','B','C','D','E','F','G','H','I','J','K','L','M','N','O','P','Q','R','S','T','U','V','W','X','Y','Z'];
2,随机生成密匙

/*

*    功能:随机生成密钥

*

*    返回:密匙矩阵

*/

function randomCreateKey(){

    //随机生成0到26的数字

    for(var i = 0;i<3;i++){

        for(var j = 0;j<3;j++){

            key[i][j] = Math.round(Math.random()*100%26)

        }

    }

}

3,关键性代码,根据自动生成的密匙,对明文进行处理:
/*

*    功能:hill算法

*

*    参数:长度是3的倍数的大写数组

*    

*    返回:加密后的字符串

*/

function hill(p){

    //大写字母密文

    var res = "";

        //制定总共需要对字符串经行遍历的次数

    var round = Math.round(p.length/3);

    //处理

    for(var b = 0;b<round;b++){

        //明文3

            var temp3 ="";

        var tempArr3 = [];

        var sumArr3 = [];

        for(var i = 0;i<3;i++){

            temp3 += p.shift();

            for(var j = 0;j<chars.length;j++){

                if(temp3[i] == chars[j])

                    tempArr3[i] = j;

            }

        }

                //计算

        for(var i =0;i<3;i++){

            for(var j = 0;j<3;j++){

                sumArr3[i] = (tempArr3[j]*key[i][j])%26;

            }

        }

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

        for(var i =0;i<3;i++){

            res += chars[sumArr3[i]];

        }

    }

    return res;

};

 实现效果如图:

javascript实现playfair和hill密码算法

以上算法存在不足:

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

         2,过多嵌套循环,算法效率有待优化

         3,对于可能出现的情况考虑不周到,例如没有对用户输入非字母字符时进行处理。

总结:

学了一段时间的信息安全概论这门课,只能对信息安全了解皮毛。信息安全是一门很有趣的科目,平时遇到一些问题尽可能多思考,多动手,多运用。同时也要加强数学基础积累,巩固js基础,拓宽知识面。这条路任重道远。

Javascript 相关文章推荐
用javascript实现的激活输入框后隐藏初始内容
Jun 29 Javascript
js实现兼容IE6与IE7的DIV高度
May 13 Javascript
javascript 学习笔记(一)DOM基本操作
Apr 08 Javascript
jQuery中的ready函数与window.onload谁先执行
Jun 21 Javascript
Javascript动画效果(4)
Oct 11 Javascript
vue.js利用Object.defineProperty实现双向绑定
Mar 09 Javascript
微信小程序 动态绑定数据及动态事件处理
Mar 14 Javascript
ionic环境配置及问题详解
Jun 27 Javascript
解决js相同的正则多次调用test()返回的值却不同的问题
Oct 10 Javascript
layui表格 列自动适应大小失效的解决方法
Sep 06 Javascript
vue使用prop可以渲染但是打印台报错的解决方式
Nov 13 Javascript
vue监听滚动事件的方法
Dec 21 Vue.js
JS数组(Array)处理函数整理
Dec 07 #Javascript
浅谈JS日期(Date)处理函数
Dec 07 #Javascript
AngularJS HTML编译器介绍
Dec 06 #Javascript
AngularJS初始化过程分析(引导程序)
Dec 06 #Javascript
什么是 AngularJS?AngularJS简介
Dec 06 #Javascript
AngularJS入门教程(二):AngularJS模板
Dec 06 #Javascript
AngularJS入门教程(一):静态模板
Dec 06 #Javascript
You might like
PHP 抓取网页图片并且另存为的实现代码
2010/03/24 PHP
PHP异常类及异常处理操作实例详解
2018/12/19 PHP
HTML代码中标签的全部属性 中文注释说明
2009/03/26 Javascript
js分解url参数(面向对象-极简主义法应用)
2012/08/09 Javascript
利用javascript实现全部删或清空所选的操作
2014/05/27 Javascript
jquery JSON的解析方式示例介绍
2014/07/27 Javascript
javascript函数中参数传递问题示例探讨
2014/07/31 Javascript
js实现仿MSN带关闭功能的右下角弹窗代码
2015/09/04 Javascript
图文详解Heap Sort堆排序算法及JavaScript的代码实现
2016/05/04 Javascript
Bootstrap 折叠(Collapse)插件用法实例详解
2016/06/01 Javascript
jQuery点击导航栏选中更换样式的实现代码
2017/01/23 Javascript
vue数字类型过滤器的示例代码
2017/09/07 Javascript
vue双花括号的使用方法 附练习题
2017/11/07 Javascript
vue左侧菜单,树形图递归实现代码
2018/08/24 Javascript
vue 中滚动条始终定位在底部的方法
2018/09/03 Javascript
node.JS的crypto加密模块使用方法详解(MD5,AES,Hmac,Diffie-Hellman加密)
2020/02/06 Javascript
node.js使用http模块创建服务器和客户端完整示例
2020/02/10 Javascript
[02:53]DOTA2英雄基础教程 山岭巨人小小
2013/12/09 DOTA
[48:00]EG vs LGD 2018国际邀请赛淘汰赛BO3 第二场 8.26
2018/08/29 DOTA
[01:11:37]完美世界DOTA2联赛PWL S2 SZ vs FTD.C 第一场 11.19
2020/11/19 DOTA
python中global与nonlocal比较
2014/11/21 Python
在Python中用split()方法分割字符串的使用介绍
2015/05/20 Python
通过Python来使用七牛云存储的方法详解
2015/08/07 Python
Python编程实战之Oracle数据库操作示例
2017/06/21 Python
Python随机生成均匀分布在单位圆内的点代码示例
2017/11/13 Python
python 获取一个值在某个区间的指定倍数的值方法
2018/11/12 Python
Python File(文件) 方法整理
2019/02/18 Python
Python循环实现n的全排列功能
2019/09/16 Python
Python编译成.so文件进行加密后调用的实现
2019/12/23 Python
PyQt5结合matplotlib绘图的实现示例
2020/09/15 Python
澳大利亚排名第一的狂热牛仔品牌:ONETEASPOON
2018/11/20 全球购物
回馈慈善的设计师太阳镜:DIFF eyewear
2019/10/17 全球购物
英国拖鞋购买网站:Bedroom Athletics
2020/02/28 全球购物
美发活动策划书
2014/01/14 职场文书
会计求职信范文
2014/05/24 职场文书
交警作风整顿剖析材料
2014/10/11 职场文书