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 相关文章推荐
jQuery总体架构的理解分析
Mar 07 Javascript
Javascript模块化编程(三)require.js的用法及功能介绍
Jan 17 Javascript
JS实现网页游戏中滑块响应鼠标点击移动效果
Oct 19 Javascript
JS实现单击输入框弹出选择框效果完整实例
Dec 14 Javascript
node.js express安装及示例网站搭建方法(分享)
Aug 22 Javascript
Angularjs中controller的三种写法分享
Sep 21 Javascript
微信小程序 用户数据解密详细介绍
Jan 09 Javascript
微信小程序 使用canvas制作K线实例详解
Jan 12 Javascript
vue webpack打包优化操作技巧
Feb 22 Javascript
图文详解vue框架安装步骤
Feb 12 Javascript
JavaScript对象属性操作实例解析
Feb 04 Javascript
解决antd 下拉框 input [defaultValue] 的值的问题
Oct 31 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多个字符串替换成同一个的解决方法
2013/06/18 PHP
10个php函数实用却不常见
2015/10/13 PHP
php实现统计目录文件大小的函数
2015/12/25 PHP
初识ThinkPHP控制器
2016/04/07 PHP
php自定义函数br2nl实现将html中br换行符转换为文本输入中换行符的方法【与函数nl2br功能相反】
2017/02/17 PHP
mongodb和php的用法详解
2019/03/25 PHP
PHP经典设计模式之依赖注入定义与用法详解
2019/05/21 PHP
PHP 实现缩略图
2021/03/09 PHP
js 页面关闭前的出现提示的实现代码
2011/05/25 Javascript
js Form.elements[i]的使用实例
2011/11/13 Javascript
javascript学习笔记(十七) 检测浏览器插件代码
2012/06/20 Javascript
如何学习Javascript入门指导
2013/11/01 Javascript
jquery.post用法关于type设置问题补充
2014/01/03 Javascript
使用jQuery制作基础的Web图片轮播效果
2016/04/22 Javascript
JS实现控制图片显示大小的方法【图片等比例缩放功能】
2017/02/18 Javascript
利用imgareaselect辅助后台实现图片上传裁剪
2017/03/02 Javascript
在Linux下使用Python的matplotlib绘制数据图的教程
2015/06/11 Python
使用Python从有道词典网页获取单词翻译
2016/07/03 Python
解决python 自动安装缺少模块的问题
2018/10/22 Python
Python中正反斜杠(‘/’和‘\’)的意义与用法
2019/08/12 Python
python 识别登录验证码图片功能的实现代码(完整代码)
2020/07/03 Python
PyTorch预训练Bert模型的示例
2020/11/17 Python
css和css3弹性盒模型实现元素宽度(高度)自适应
2019/05/15 HTML / CSS
美国在线珠宝商店:SZUL
2017/02/11 全球购物
办公室文秘岗位职责
2013/11/15 职场文书
减负增效提质方案
2014/05/23 职场文书
关于读书的活动方案
2014/08/14 职场文书
女性健康讲座主持词
2015/07/04 职场文书
2015小学教育教学工作总结
2015/07/21 职场文书
小学运动会加油稿
2015/07/22 职场文书
2016国庆节67周年寄语
2015/12/07 职场文书
2016会计专业自荐信范文
2016/01/28 职场文书
2019财务毕业实习报告
2019/06/27 职场文书
python 字典和列表嵌套用法详解
2021/06/29 Python
Python实现PIL图像处理库绘制国际象棋棋盘
2021/07/16 Python
Python可视化神器pyecharts之绘制地理图表练习
2022/07/07 Python