JavaScript实现维吉尼亚(Vigenere)密码算法实例
本文通过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;
};为什么JS调用reload后页面没有立即更新
2026-11-05 13:38:29
crypto-js 加密结果与 Java/Python 后端不一致怎么解决
2026-11-05 12:09:48
js文件缓存导致代码不更新怎么强制刷新
2026-11-04 22:30:24
JS逆向调试技巧:编写Hook脚本监控加密函数输入输出
2026-11-04 10:42:46
Babylon.js 性能优化技巧:实例化网格与遮挡剔除
2026-11-03 23:43:22
