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 相关文章推荐
JavaScript入门教程(10) 认识其他对象
Jan 31 Javascript
javaScript中的this示例学习详解及工作原理
Jan 13 Javascript
JavaScript实现的字符串replaceAll函数代码分享
Apr 02 Javascript
JavaScript使用slice函数获取数组部分元素的方法
Apr 06 Javascript
D3.js实现散点图和气泡图的方法详解
Sep 21 Javascript
Web性能优化系列 10个提升JavaScript性能的技巧
Sep 27 Javascript
最常见的左侧分类菜单栏jQuery实现代码
Nov 28 Javascript
bootstrap响应式工具使用详解
Nov 29 Javascript
一次让你了解全部JavaScript的作用域
Jun 24 Javascript
vue实现日历备忘录功能
Sep 24 Javascript
浅谈JS for循环中使用break和continue的区别
Jul 21 Javascript
关于ES6尾调用优化的使用
Sep 11 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 信息采集程序代码
2009/03/17 PHP
windwos下使用php连接oracle数据库的过程分享
2014/05/26 PHP
php生成QRcode实例
2014/09/22 PHP
Yii中创建自己的Widget实例
2016/01/05 PHP
YII2框架中excel表格导出的方法详解
2017/07/21 PHP
php 下 html5 XHR2 + FormData + File API 上传文件操作实例分析
2020/02/28 PHP
JS特殊函数(Function()构造函数、函数直接量)区别介绍
2013/05/19 Javascript
jQuery选择器全面总结
2014/01/06 Javascript
jquery对table中各数据的增加、保存、删除操作示例
2014/05/14 Javascript
jQuery实现感应鼠标动画效果自动伸长的输入框实例
2015/02/24 Javascript
jQuery抛物线运动实现方法(附完整demo源码下载)
2016/01/08 Javascript
基于zepto的移动端轻量级日期插件--date_picker
2016/03/04 Javascript
微信小程序视图template模板引用的实例详解
2017/09/20 Javascript
Vue中props的使用详解
2018/06/15 Javascript
vue项目移动端实现ip输入框问题
2019/03/19 Javascript
vue-cli3+ts+webpack实现多入口多出口功能
2019/05/30 Javascript
在Vue项目中,防止页面被缩放和放大示例
2019/10/28 Javascript
JS面向对象编程实现的Tab选项卡案例详解
2020/03/03 Javascript
react中hook介绍以及使用教程
2020/12/11 Javascript
Python工程师面试题 与Python基础语法相关
2016/01/14 Python
Python实现多进程共享数据的方法分析
2017/12/04 Python
python生成不重复随机数和对list乱序的解决方法
2018/04/09 Python
python 将print输出的内容保存到txt文件中
2018/07/17 Python
python flask实现分页的示例代码
2018/08/02 Python
python的re模块使用方法详解
2019/07/26 Python
django项目登录中使用图片验证码的实现方法
2019/08/15 Python
总结30个CSS3选择器
2017/04/13 HTML / CSS
Vans(范斯)新西兰官方网站:美国原创极限运动品牌
2020/09/19 全球购物
《学会待客》教学反思
2014/02/22 职场文书
大学生社会实践方案
2014/05/11 职场文书
办公室主任岗位职责范本
2015/03/31 职场文书
教你怎么用Python处理excel实现自动化办公
2021/04/30 Python
如何理解Vue前后端数据交互与显示
2021/05/10 Vue.js
mybatis3中@SelectProvider传递参数方式
2021/08/04 Java/Android
Python 类,对象,数据分类,函数参数传递详解
2021/09/25 Python
Win11 BitLocker 驱动器加密
2022/04/19 数码科技