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 相关文章推荐
$(document).ready(function() {})不执行初始化脚本
Jun 19 Javascript
JavaScript实现向OL列表内动态添加LI元素的方法
Mar 21 Javascript
详解Angularjs中的依赖注入
Mar 11 Javascript
轻松掌握JavaScript中介者模式
Aug 26 Javascript
原生javascript移动端滑动banner效果
Mar 10 Javascript
vue2.0 better-scroll 实现移动端滑动的示例代码
Jan 25 Javascript
AngularJS自定义表单验证功能实例详解
Aug 24 Javascript
webpack开发环境和生产环境的深入理解
Nov 08 Javascript
vue组件中watch props根据v-if动态判断并挂载DOM的问题
May 12 Javascript
Vue如何基于es6导入外部js文件
May 15 Javascript
vue基于better-scroll实现左右联动滑动页面
Jun 30 Javascript
vue-preview动态获取图片宽高并增加旋转功能的实现
Jul 29 Javascript
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
Zend studio文件注释模板设置方法
2013/09/29 PHP
分享下页面关键字抓取www.icbase.com站点代码(带asp.net参数的)
2014/01/30 PHP
微信营销平台系统?刮刮乐的开发
2014/06/10 PHP
php自定义分页类完整实例
2015/12/25 PHP
php实现的一段简单概率相关代码
2016/05/30 PHP
yum命令安装php7和相关扩展
2016/07/04 PHP
简单PHP会话(session)说明介绍
2016/08/21 PHP
iOS+PHP注册登录系统 PHP部分(上)
2016/12/26 PHP
php简单构造json多维数组的方法示例
2017/06/08 PHP
php常用的工具开发整理
2019/09/26 PHP
pjblog中的UBBCode.js
2007/04/25 Javascript
JS.getTextContent(element,preformatted)使用介绍
2013/09/21 Javascript
JavaScript cookie的设置获取删除详解
2014/02/11 Javascript
Json实现异步请求提交评论无需跳转其他页面
2014/10/11 Javascript
Javascript基础教程之关键字和保留字汇总
2015/01/18 Javascript
浅谈JavaScript中变量和函数声明的提升
2016/08/09 Javascript
使用Bootstrap + Vue.js实现添加删除数据示例
2017/02/27 Javascript
完美实现js焦点轮播效果(一)
2017/03/07 Javascript
JavaScript引用类型Array实例分析
2018/07/24 Javascript
JavaScript设计模式之模板方法模式原理与用法示例
2018/08/07 Javascript
使用vue实现多规格选择实例(SKU)
2019/08/23 Javascript
Windows上node.js的多版本管理工具用法实例分析
2019/11/06 Javascript
Python3 入门教程 简单但比较不错
2009/11/29 Python
python模拟登录百度代码分享(获取百度贴吧等级)
2013/12/27 Python
python字符类型的一些方法小结
2016/05/16 Python
利用Python中SocketServer 实现客户端与服务器间非阻塞通信
2016/12/15 Python
对python中的for循环和range内置函数详解
2018/04/17 Python
Django shell调试models输出的SQL语句方法
2019/08/29 Python
Pycharm 如何一键加引号的方法步骤
2021/02/05 Python
数字天堂软件测试面试题
2012/12/23 面试题
报关简历自我评价怎么写
2013/09/19 职场文书
生产车间主管岗位职责
2013/12/28 职场文书
群众路线剖析材料范文
2014/10/09 职场文书
幼儿园学前班幼儿评语
2014/12/29 职场文书
有趣的二维码:使用MyQR和qrcode来制作二维码
2021/05/10 Python
python+opencv实现视频抽帧示例代码
2021/06/11 Python