JavaScript实现维吉尼亚(Vigenere)密码算法实例


Posted in Javascript onNovember 22, 2013

传统加密技术对于当今的网络安全发挥不了大作用,但每一本讲述密码学的书的开头都会率先介绍它们,因为它们是密码学的基础,是密码学的历史。几乎每一本密码学的书在讲述Vigenere密码的章节都会有这么一个《Vigenere代换表》用户讲解Vigenere密码机制:

JavaScript实现维吉尼亚(Vigenere)密码算法实例

加密过程很简单,就是给定密钥字母x和明文字母y,密文字母是位于x行和y列的那个字母。这样就决定了加密一条消息需要与消息一样长的密钥字符串,通常,密钥字符串是密钥词的重复。
以《密码编码学与网络安全——原理与实践》中的例子来作为本文的例子。比如密钥词是deceptive,消息是“we are discovered save yourself”,那么加密过程如下:

deceptivedeceptivedeceptive(密钥字符串)
wearediscoveredsaveyourself(消息)
ZICVTWQNGRZGVTWAVZHCQYGLMGJ(密文)

密文中的第一个字母“Z”是怎么得来的?从Vigenere代换表中,以密钥字符串中的“d”为行,消息中的“w”为列的那个字母就是“Z”了。

使用查表的方式多加密几次就能很轻易地总结出规律:将A~Z以0~25编号,那么加密过程就是,在代换表的第一行中找到消息字母,如“w”,然后向后移动d(即3)次,所得的字母就是密文了。如果数到末位,那么下一次移位就从头(即A)继续。 也就是说,可以将A~Z看成一个环,加密过程就是找定消息字母后,将指针往环的某个特定方向移位,次数就是密钥字母所代表的数字。这其实是一个模26的过程。
扩展一下,以上加密仅能对26个字母进行加密,而且不能区分大小写。但其实英文中除了字母外,还有标点符号,还有空格。如果考虑到大部分英文字符,那么Vigenere代换表将比较大,而且有点浪费空间的嫌疑。如果假设能被加密的字符有N个,如果把这N个字符建成一个环,那么加密过程就是模N的过程,即,C(i)=(K(i)+P(i))modN,其中K、C、P分别代表的是密钥空间、密文空间、消息(明文)空间。
网络上有人用C实现了这个加密算法,几乎都是使用查代换表的方法。虽然可以程序生成代换表,但所生成的代换表太有规律了。以下我用Javascript实现了一次,使用的是模的方法,感觉灵活度更大,占用的空间肯定也更小(时间效率尚未估计)

var Vigenere = {
    _strCpr: 'abcdefghijklmnopqrstuvwxyz_12345 67890.ABCDEFGHIJKLMNOPQRSTUVWXYZ',//可以将此字符串的顺序打乱点,或者添加更多字符
    _strKey: function(strK,str){//生成密钥字符串,strK为密钥,str为明文或者密文
        var lenStrK = strK.length;
        var lenStr = str.length;
        if(lenStrK != lenStr){//如果密钥长度与str不同,则需要生成密钥字符串
            if(lenStrK < lenStr){//如果密钥长度比str短,则以不断重复密钥的方式生成密钥字符串
                while(lenStrK < lenStr){
                    strK = strK + strK;
                    lenStrK = 2 * lenStrK;
                }
            }//此时,密钥字符串的长度大于或等于str长度
            strK = strK.substring(0,lenStr);//将密钥字符串截取为与str等长的字符串
        }
        return strK;
    }
}
Vigenere.lenCpr = Vigenere._strCpr.length;
Vigenere.Encrypt = function(K,P){//加密算法,K为密钥,P为明文
    K = Vigenere._strKey(K,P);
    var lenK = K.length;
    var rlt = '';
    var loop = 0;
    for(loop=0; loop<lenK; loop++){
        var iP = Vigenere._strCpr.indexOf(P.charAt(loop));
        if(iP==-1) return '本算法暂时不能对字符:' + P.charAt(loop) + '进行加密';
        var iK = Vigenere._strCpr.indexOf(K.charAt(loop));
        if(iK==-1) return '密钥中包含非法字符:' + K.charAt(loop);
        var i = (iP + iK) % Vigenere.lenCpr;
        rlt = rlt + Vigenere._strCpr.charAt(i);
    }
    return rlt;    
};
Vigenere.DisEncrypt = function(K,C){
    K = Vigenere._strKey(K,C);
    var lenK = K.length;
    var rlt = '';
    var loop = 0;
    for(loop=0; loop<lenK; loop++){
        var iK = Vigenere._strCpr.indexOf(K.charAt(loop));
        if(iK==-1) return '密钥中包含非法字符:' + K.charAt(loop);        
        var iC = Vigenere._strCpr.indexOf(C.charAt(loop));
        if(iK > iC){
            rlt += Vigenere._strCpr.charAt(iC + Vigenere.lenCpr - iK);
        }
        else{
            rlt += Vigenere._strCpr.charAt(iC - iK);
        }
    }
    return rlt;
};
Javascript 相关文章推荐
firefox中用javascript实现鼠标位置的定位
Jun 17 Javascript
dwr spring的集成实现代码
Mar 22 Javascript
使用jquery局部刷新(jquery.load)从数据库取出数据
Jan 22 Javascript
JavaScript中的原型prototype属性使用详解
Jun 05 Javascript
js实现人民币大写金额形式转换
Apr 27 Javascript
JS把内容动态插入到DIV的实现方法
Jul 19 Javascript
微信小程序 封装http请求实例详解
Jan 16 Javascript
基于JQuery的购物车添加删除以及结算功能示例
Mar 08 Javascript
原生JS实现图片网格式渐显、渐隐效果
Jun 05 Javascript
详解开源的JavaScript插件化框架MinimaJS
Oct 26 Javascript
使用Karma做vue组件单元测试的实现
Jan 16 Javascript
浅谈Vuex的this.$store.commit和在Vue项目中引用公共方法
Jul 24 Javascript
利用js判断浏览器类型(是否为IE,Firefox,Opera浏览器)
Nov 22 #Javascript
javascript删除option选项的多种方法总结
Nov 22 #Javascript
js截取固定长度的中英文字符的简单实例
Nov 22 #Javascript
String.prototype实现的一些javascript函数介绍
Nov 22 #Javascript
nodeType属性返回被选节点的节点类型介绍
Nov 22 #Javascript
在Iframe中获取父窗口中表单的值(示例代码)
Nov 22 #Javascript
解析URI与URL之间的区别与联系
Nov 22 #Javascript
You might like
php REMOTE_ADDR之获取访客IP的代码
2008/04/22 PHP
编写php应用程序实现摘要式身份验证的方法详解
2013/06/08 PHP
php网站被挂木马后的修复方法总结
2014/11/06 PHP
php+mysql结合Ajax实现点赞功能完整实例
2015/01/30 PHP
php上传图片客户端和服务器端实现方法
2015/03/30 PHP
PHP输出一个等腰三角形的方法
2015/05/12 PHP
根据地区不同显示时间的javascript代码
2007/08/13 Javascript
javascript 简单抽屉效果的实现代码
2010/03/09 Javascript
获取dom元素那些讨厌的位置封装代码
2010/06/23 Javascript
在多个页面使用同一个HTML片段的代码
2011/03/04 Javascript
JavaScript高级程序设计(第3版)学习笔记2 js基础语法
2012/10/11 Javascript
Javascript中函数名.length属性用法分析(对比arguments.length)
2016/09/16 Javascript
详解VUE的状态控制与延时加载刷新
2017/03/27 Javascript
在js文件中引入(调用)另一个js文件的三种方法
2020/09/11 Javascript
[03:42]2014DOTA2西雅图国际邀请赛 Navi战队巡礼
2014/07/07 DOTA
[19:54]夜魇凡尔赛茶话会 第一期02:看图识人
2021/03/11 DOTA
在win和Linux系统中python命令行运行的不同
2016/07/03 Python
python利用标准库如何获取本地IP示例详解
2017/11/01 Python
详解爬虫被封的问题
2019/04/23 Python
Python3.5内置模块之time与datetime模块用法实例分析
2019/04/27 Python
详解用Python实现自动化监控远程服务器
2019/05/18 Python
Django项目基础配置和基本使用过程解析
2019/11/25 Python
Python基于traceback模块获取异常信息
2020/07/23 Python
python中watchdog文件监控与检测上传功能
2020/10/30 Python
python反扒机制的5种解决方法
2021/02/06 Python
欧洲最大的笔和书写专家:The Pen Shop
2017/03/19 全球购物
英国和爱尔兰最大的地毯零售商:Kukoon
2018/12/17 全球购物
中兴通讯全球官方网站:ZTE
2020/12/26 全球购物
大学在校生求职信范文
2013/11/21 职场文书
测试工程师职业规划书
2014/02/06 职场文书
2014年三八妇女节活动总结
2014/03/01 职场文书
2014年两会学习心得体会
2014/03/17 职场文书
《谁的本领大》教后反思
2014/04/25 职场文书
Python机器学习之逻辑回归
2021/05/11 Python
Nginx缓存设置案例详解
2021/09/15 Servers
Windows下载并安装MySQL8.0.x 版本的完整教程
2022/04/10 MySQL