javascript实现playfair和hill密码算法

2014-09-01  来源:本站原创  分类:基础知识  人气:3 

这篇文章主要介绍了javascript实现playfair和hill密码算法,需要的朋友可以参考下

时至期末,补习信息安全概论作业。恰巧遇古典密码学算法中的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实现playfair和hill密码算法 2014-09-01

    这篇文章主要介绍了javascript实现playfair和hill密码算法,需要的朋友可以参考下 时至期末,补习信息安全概论作业.恰巧遇古典密码学算法中的playfair算法和hill算法,用javascript语言实现起来是在有趣,边查百度边编码,顺便好好补习一下javascript基础. playfair Playfair密码(英文:Playfair cipher 或 Playfair square)是一种替换密码.依据一个5*5的正方形组成的密码表来编写,表中排列有25个字母.对于英语中

  • JavaScript实现维吉尼亚(Vigenere)密码算法实例 2015-04-29

    Vigenere密码就是一种传统加密技术,它是多表代换密码,能够有效改进单表代换密码的词频分布特征问题,本文用JavaScript实现维吉尼亚(Vigenere)密码算法 传统加密技术对于当今的网络安全发挥不了大作用,但每一本讲述密码学的书的开头都会率先介绍它们,因为它们是密码学的基础,是密码学的历史.几乎每一本密码学的书在讲述Vigenere密码的章节都会有这么一个<Vigenere代换表>用户讲解Vigenere密码机制: 加密过程很简单,就是给定密钥字母x和明文字母y,密文字母是位于x行

  • javascript中解析四则运算表达式的算法和示例 2014-06-05

    这篇文章主要介绍了javascript中解析四则运算表达式的算法和示例,本文介绍了中缀表示法.逆波兰表示法这2种算法,并分别给出了代码实例,需要的朋友可以参考下 在编写代码时我们有时候会碰到需要自己解析四则运算表达式的情况,本文简单的介绍使用JavaScript实现对简单四则运算表达式的解析. 一.熟悉概念 中缀表示法(或中缀记法)是一个通用的算术或逻辑公式表示方法, 操作符是以中缀形式处于操作数的中间(例:3 + 4).也就是我们最常用的算术表达式,中缀表达式对于人类来说比较容易理解,但是不易

  • 用VBS实现的凯撒密码算法 2014-07-14

    在密码学中,恺撒密码(或称恺撒加密.恺撒变换)是一种最简单且最广为人知的加密技术.它是一种替换加密的技术,明文中的所有字母都在字母表上向後(或向前)按照一个固定数目进行偏移後被替换成密文 在密码学中,恺撒密码(或称恺撒加密.恺撒变换)是一种最简单且最广为人知的加密技术.它是一种替换加密的技术,明文中的所有字母都在字母表上向後(或向前)按照一个固定数目进行偏移後被替换成密文.例如,当偏移量是3的时候,所有的字母A将被替换成D,B变成E,以此类推.这个加密方法是以恺撒的名字命名的,当年恺撒曾用此方法

  • JavaScript实现穷举排列(permutation)算法谜题解答 2014-11-28

    这篇文章主要介绍了JavaScript实现穷举排列(permutation)算法谜题解答,穷举排列是指穷举一个数组中各个元素的排列,需要的朋友可以参考下 谜题 穷举一个数组中各个元素的排列 策略 减而治之.递归 JavaScript解 /** * Created by cshao on 12/23/14. */ function getPermutation(arr) { if (arr.length == 1) { return [arr]; } var permutation = []; f

  • JS维吉尼亚密码算法实现代码 2015-02-01

    我想用JS实现对文本的加密和解密,想用维吉尼亚密码算法,谁有现成代码啊 var Vigenere = { _strCpr: 'abcdefghijklmnopqrstuvwxyz_12345 67890.ABCDEFGHIJKLMNOPQRSTUVWXYZ',//可以将此字符串的顺序打乱点,或者添加更多字符 _strKey: function(strK,str){//生成密钥字符串,strK为密钥,str为明文或者密文 var lenStrK = strK.length; var lenStr

  • UCenter密码算法规则和生成方法 2014-12-04

    康盛的系列产品,包括Discuz.UCHome.Supesite都集成了同一个用户系统--UCenter,用户登录的密码也保存在UCenter中,对于其他系统集成或导出数据到UCenter系统,通常会遇到密码生成的问题,这里就讨论一下UCenter的用户密码算法规则和生成方法. 密码通常使用MD5对用户密码HASH后保存在数据库中的方法,如果黑客拿到了这个HASH数值,那么可以采用字典的方式暴力破解,如果这个字典数据库足够大,并且字典比较符合人们的设置习惯的话,那很容易就能破解常见的密码,因此U

  • javaScript 简单验证代码(用户名,密码,邮箱) 2015-02-17

    下面的代码包括了用户名,密码,邮箱的基本验证代码,需要的朋友可以参考下. <script language="javascript"> function IsDigit(cCheck) { return (('0'<=cCheck) && (cCheck<='9')); } function IsAlpha(cCheck) { return ((('a'<=cCheck) && (cCheck<='z')) || ((

  • Powershell生成Windows密码算法简单学习 2013-11-05

    利用Powershell生成Windows密码:密码一共8位/字符的次序是随机组成的等等,接下来为你详细介绍下,感兴趣的你可以参考下哈,希望对你学习Powershell有所帮助 说明: 1.密码一共8位. 2.由2个数字,2个大写字符,2个小写字符,2个特殊字符组成. 3.字符的次序是随机组成的. function CreatePassword { $figure=1,2,3,4,5,6,7,8,9; $capital="Q","W","E",&

  • WordPress用户密码算法规则 2015-01-14

    WordPress系统的用户密码是保存在wp_users数据表的user_pass字段,密码是通过Portable PHP password hashing framework类产生的,密码的形式是随机且不可逆,同一个明文的密码在不同时间,产生的密文也不一样,相对来说较为安全. WordPress用户密码产生的过程是,当需要生成用户密码的时候,随机产生了一个salt,然后将salt和password相加,又进行了count次md5,最后和encode64的hash数值累加,就得到了一个以$P$开

  • JavaScript全排列的六种算法 具体实现 2015-02-20

    这篇文章介绍了全排列的六种算法有,交换算法,链接算法,回溯算法等,有需要的朋友可以参考一下 全排列是一种时间复杂度为:O(n!)的算法,前两天给学生讲课,无意间想到这个问题,回来总结了一下,可以由7种算法求解,其中动态循环类似回溯算法,实现起来比较繁琐,故总结了6种,以飨读者.所有算法均使用JavaScript编写,可直接运行. 算法一:交换(递归) <html xmlns="http://www.w3.org/1999/xhtml"> <head> <m

  • javascript实现锁定网页.密码解锁效果(类似系统屏幕保护效果) 2015-02-21

    这篇文章主要介绍了javascript实现锁定网页.密码解锁效果,跟Windows系统的屏幕保护效果类似,需要的朋友可以参考下 功能描述:打开一个网站的网页,过5分钟不动作,就会锁定页面,隐藏内容容器,显示一个容器用于输入密码,输入正确的密码来解锁.锁定后即使用户刷新页面,还是保留原来的状态.如已经锁定的,需要继续锁定,否则显示内容. 示例代码如下,通过document.onmouseover来实现多少分钟没有动作,使用计时器来实现. <!DOCTYPE html PUBLIC "-//W

  • [安全] 关于 RSA 算法的原理与实践 2012-03-09

    当代信息网络发展至今,覆盖面已经非常广泛,广大用户使用这个互联网络来分享信息,搜索资料,进行商业交易等等,可以说是无处不在,也因为这样,这个领域中的信息安全也就变得越来越重要.在这个背景下 "公匙密码学" 也就应运而生,很显然的是,随着信息网络越来越深入到人们的生活和商务金融领域,这门学科也将变得越来越重要.以下石头将会就这个命题展开,首先让我们来看看 "公钥密码学概述" (摘自网络): 公开密钥密码算法的提出是整个密码学历史上最大的而且也许是最唯一真正的变革.从最

  • JavaScript加密库Crypto-JS的使用 2012-07-30

    先来图片一张,看看效果(一个采用Crypto-JS实现的工具展示): CryptoJS (crypto.js) 为 JavaScript 提供了各种各样的加密算法.目前已支持的算法包括: MD5 SHA-1 SHA-256 AES Rabbit MARC4 HMAC HMAC-MD5 HMAC-SHA1 HMAC-SHA256 PBKDF2 散列/哈希 CryptoJS是一个纯javascript写的加密类库(下载),我们使用它只需要加入相关的引用即可: 散列/哈希示例1: <script ty

  • 如何安全的存储用户的密码[摘] 2014-03-17

    大多数的web开发者都会遇到设计用户账号系统的需求.账号系统最重要的一个方面就是如何保护用户的密码.一些大公司的用户数据库泄露事件也时有发生,所以我们必须采取一些措施来保护用户的密码,即使网站被攻破的情况下也不会造成较大的危害.如果你还在存储用户密码的MD5,那可真的有点弱了.赶紧来看看这篇文章吧. 保护密码最好的的方式就是使用带盐的密码hash(salted password hashing).对密码进行hash操作是一件很简单的事情,但是很多人都犯了错.接下来我希望可以详细的阐述如何恰当的对

  • 视窗操作系统密码体系的弱点及对策(图) 2014-01-08

    一.问题的提出 本文仅就此处所列的几个在实际工作里发现的问题,对目前普遍使用的视窗操作系统里隐藏的几个有关密码体系的危险弱点进行了分析并给出相应对策,这些危险弱点导致的计算机安全隐患,希望能引起相关用户的重视. 1.视窗操作系统"用户登录"对话框问题 图A是大家熟悉的"用户登录"对话框: 图A 大家都知道,只要愿意,现在可以通过很多能方便从互联网上下载的实用程式对图A所示的"TesT"用户进行"Crack"以获得其原先设定在T

  • javascript解三阶幻方(九宫格) 2014-03-16

    本文给大家分享的是使用javascript实现解答九宫格问题的算法,非常的简单实用,有需要的小伙伴可以参考下. 谜题:三阶幻方, 试将1~9这9个不同整数填入一个3×3的表格,使得每行.每列以及每条对角线上的数字之和相同. 策略:穷举搜索.列出所有的整数填充方案,然后进行过滤. 亮点为递归函数getPermutation的设计,文章最后给出了几个非递归算法 // 递归算法,很巧妙,但太费资源 function getPermutation(arr) { if (arr.length == 1)

  • 专家观点:破解MD5和SHA-1不意味密码破解(图) 2014-05-04

    有关山东大学王小云教授破解MD5和SHA-1的报道,让人对电子信息的安全性颇为关注,真相究竟如何? 要问当今众生,在日常生活中什么对你最重要,什么让你最头痛?相信很多人的回答是密码."请您输入密码,请再输一遍",无论是在银行柜台还是在网上冲浪,这样的提示对我们已是司空见惯.银行密码.登录密码.邮箱密码.各种游戏的密码.各个用户名的密码--密码已是世人生活中不可或缺的一部分.最近有关山东大学王小云教授破解MD5和SHA-1报道频频见诸报端,使人们对电子信息的安全性颇为关注,密码真的不可靠

  • 如何改进javascript代码的性能 2014-09-27

    在web应用中,应用了大量的Javascript,因此代码的执行效率变得尤为重要,也就是性能!为了提高JS的性能,我们应该掌握一些基本的性能优化方式,并让它成为我们书写代码的习惯.下面介绍几种优化性能的方式,很多初学者甚至有经验的开发者也会忽略,希望对你有帮助 本来在那片编写可维护性代码文章后就要总结这篇代码性能文章的,耽搁了几天,本来也是决定每天都要更新一篇文章的,因为以前欠下太多东西没总结,学过的东西没去总结真的很快就忘记了,记录一下在你脑力留下更深的印象,特别是这些可维护性代码,性能什么的

  • VC++网络安全编程范例(9)-基于OPENSSL实现对称算法与BASE64编码 2012-03-09

    对称密码算法有时又叫传统密码算法,就是加密密钥能够从解密密钥中推算出来,反过来也成立.在大多数对称算法中,加密解密密钥是相同的.这些算法也叫秘密密钥算法或单密钥算法,它要求发送者和接收者在安全通信之前,商定一个密钥.对称算法的安全性依赖于密钥,泄漏密钥就意味着任何人都能对消息进行加密解密.只要通信需要保密,密钥就必须保密. 对称算法的加密和解密表示为: Ek(M)=C Dk(C)=M 对称算法可分为两类.一次只对明文中的单个位(有时对字节)运算的算法称为序列算法或序列密码.另一类算法是对明文的一