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

作者:缓存笔记

时间:2026-10-27

浏览:193

本文通过JavaScript语言实现了维吉尼亚密码算法。不同于传统的查表法,该实现采用模运算机制,支持字母、数字及标点符号的混合加密。文章详细解析了密钥生成逻辑与加解密核心代码,展示了如何构建字符环以扩展加密字符集,为理解古典密码原理提供了实用的编程案例。

文章目录

维吉尼亚密码原理与代换表

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

加密过程直观:给定密钥字母x和明文字母y,密文字母即为代换表中x行与y列交叉处的字母。这意味着加密一条消息需要长度与消息相等的密钥字符串,通常由密钥词重复构成。本文以《密码编码学与网络安全——原理与实践》中的案例为例进行演示:密钥词为“deceptive”,消息为“we are discovered save yourself”。

具体加密步骤如下所示:

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

以密文首字母“Z”为例,其生成依据是:在Vigenere代换表中,找到密钥字符串首字母“d”所在的行,与消息首字母“w”所在的列,二者交叉处的字母即为“Z”。

基于模运算的JavaScript实现

通过多次查表可总结规律:将A~Z编号为0~25,加密过程即从代换表第一行找到消息字母(如“w”),沿该行向后移动密钥字母对应的数值(如“d”对应3)步,所得字母即为密文。若到达末尾则从头继续,这可视作一个模26的环状移位过程。扩展而言,若加密字符集包含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;
};

实用工具推荐

电子包浆

绿化、压缩、噪点和虚拟水印,自由调节做旧程度。

使用 ›
图片压缩

选择画质和输出格式,预览压缩前后的大小。

使用 ›
相关文章