宝哥软件园

用JavaScript实现弗吉尼亚密码算法的一个例子

编辑:宝哥软件园 来源:互联网 时间:2021-11-13

传统的加密技术在今天的网络安全中发挥不了太大的作用,但是每一本关于密码学的书都会在一开始就率先介绍它们,因为它们是密码学的基础和历史。几乎每本密码学书籍都会有这样一位《Vigenere代换表》用户,在关于Vigener密码学的章节中解释Vigener密码机制:

加密过程非常简单,即给定密钥字母x和明文字母y,秘密字母就是x行y列中的字母。这决定了加密一条消息需要一个密钥字符串,长度与消息一样长。通常,关键字串是关键字的重复。本文以《密码编码学与网络安全——原理与实践》中的例子为例。比如关键词是欺骗性的,消息是“我们被发现了救你自己”,那么加密过程如下:复制代码如下:欺骗性的(密钥串)weeradiscoveredsaveone(消息)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 Vigener={ _ STRCPR 3360 ' ABCDEFGHIJKLMNOPQRSTUVWXYZ _ 12345 67890。' ABCDEFGHIJKLMNOPQRSTUVWXYZ '。//这个字符串的顺序可以打乱。或者添加更多字符_ strKey:function (strk,str){//生成密钥字符串,其中strk为密钥,str为纯文本或密文var lenStrK=strK.lengthvar lenStr=str.lengthif(lenStrK!=lenStr){//如果密钥长度与Str不同,则需要生成密钥字符串if(lenStrK lenStr){//如果密钥长度比str短,则需要生成密钥字符串while(lenStrK lenStr){ strk=strk strk;lenStrK=2 * lenStrK} }//此时,密钥字符串的长度大于等于字符串长度strK=strK.substring(0,lenStr);//只要str}返回strK,就将密钥字符串截取为字符串;}}Vigenere.lenCpr=Vigenere。_ strCpr.length加密算法。encrypt=function (k,p) {//,其中k是密钥,p是明文k=vigener。_ strkey (k,p);var lenK=K.lengthvar rlt=var循环=0;for(循环=0;looplenK循环){ var iP=Vigenere。_strCpr.indexOf(P.charAt(循环));If(iP==-1)返回“此算法暂时无法加密字符:‘p . charat(loop)’”;var iK=Vigenere。_ strcpr . indexof(k . charat(loop));if(iK==-1) return '键包含非法字符:' K.charAt(循环);var I=(iP iK)% Vigenere . lencpr;rlt=rlt Vigenere。_ strcpr . charat(I);}返回rlt};维格纳。取消加密=函数(K,C){ K=Vigenere。_strKey(K,C);var lenK=K.lengthvar rlt=var循环=0;for(循环=0;looplenK循环){ var iK=Vigenere。_ strcpr . indexof(k . charat(loop));if(iK==-1) return '键包含非法字符:' K.charAt(循环);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);} }返回rlt};

更多资讯
游戏推荐
更多+