标题:求“维琼内尔密码法”的解密算法及程序,内详:
只看楼主
lgwlgwlgw
Rank: 1
等 级:新手上路
帖 子:6
专家分:0
注 册:2004-11-3
 问题点数:0 回复次数:6 
求“维琼内尔密码法”的解密算法及程序,内详:

小弟在德国念书,教授出了一道加解密题目,关于“Vigenère-Cipher”问题,即维琼内尔密码法,用C语言编写相关内容。

命题:已知密文为“WGPKYKVRYTHHDXSL”,密钥长短和内容不知,知道明文包含字符“SIND”,选择合适的办法猜解出密钥。用C语言编写该程序。

(小弟问了同学,说可以用穷举法,如a,b,c...aa,ab,ac...aaa,aab,aac...等等一一尝试下去,可小弟c编程快忘光了,一时间也拣不起来了,所以请各位高人帮忙,写个程序,谢谢。)附上2则附录,有需要了解此加密机制和编程辅助的可以参看。

附录1:“维琼内尔密码法”的加密原理。 附录2:“维琼内尔密码法”的加密过程C语言程序,小弟改写的,经编译和验证正确。

****************************************************************

附录1:維瓊內爾密碼法是由多套的單套字母替代式密碼法所組成,讓我們先觀察一下表一:維瓊內爾最上面一行的小寫字母是明文字母,接著下面的是二十六套密碼字母,每套都是將它前套字母向後挪移一位。每個密匙字母都對應著與它同行的一行密文字母(即每一行的第一个字母即是密文字母)。每一行密文字母與最上面一行的明文字母就組成凱撒密碼的一張換字表,一共有26行密文字母,因此有26張換字表,它們分別代表“後移1位”、“後移2位”……“後移26”的凱撒密碼。

例如,現在要用HOUSE為鑰匙字,順序依著H、O、U、S、E去加密明文New Generation,得出的就是經維瓊內爾密碼法加密過的密文(詳參後表)。简而言之就是(明文+密钥)再与26求模=密文了。

鑰匙字 H O U S E H O U S E H O U 明文 n e w g e n e r a t i o n 密碼文 U S Q Y I U S L S X P C H

可以看出,在明文中,同樣是n,可同時被加密成U及H兩個字,而在密文中,同樣是S,卻分別代表著e及a兩個字。這樣,便很大程度上消除了單套字母替代式密碼法面對頻率分析法的威脅,從而變得非常難以攻破,一直維持了三百多年。

它的数学模型是:

ZG = ZK + ZS mod 26 例如: 密钥: C O D E C O D E C O D E C O D E ZS : 2 14 3 4 2 14 3 4 2 14 3 4 2 14 3 4 明文: P O L Y A L P H A B E T I S C H ZK : 15 14 11 24 0 11 15 7 0 1 4 19 8 18 2 7 ZG : 17 2 14 2 2 25 18 11 2 15 7 23 10 6 5 11 密文: R C O C C Z S L C P H X K G F L

此主题相关图片如下:

**************************************************************** 附录2:加密过程的C程序

#include<stdio.h>

main() {

int n=0,i=0,j=0,k=0; char word_s[27]="abcdefghijklmnopqrstuvwxyz", passwd[129],message[257]; char *word=word_s,*p=passwd,*m=message; printf("cleartext : "); scanf("%s",m); printf("Keyword : "); scanf("%s",p); printf("codetext : ");

while(p[n]!='\0') { n=n+1; } while(m[i]!='\0') { while(p[i%n]!=word[j]) { j=j+1; } while(m[i]!=word[k]) { k=k+1; }

printf("%c",word[(j+k)%26]); i=i+1; j=0; k=0;

}

return 0;

}

搜索更多相关主题的帖子: 维琼内尔 算法 密码 内详 
2004-11-04 21:32
竹本鸟
Rank: 1
等 级:新手上路
帖 子:72
专家分:0
注 册:2004-10-5
得分:0 

不懂!不过我很想学!!!!


个人主页:wwweye. C语言正在学习中...... --------------------------------------------------
2004-11-05 19:18
mingyue
Rank: 1
等 级:新手上路
帖 子:60
专家分:0
注 册:2004-5-13
得分:0 

命题中已知明文包含字符“SIND”,可以从这里下手,找出对应于这几个字母的密文字母,根据ZG = ZK + ZS mod 26的数学模式就可以算出这几个字母所对应的密钥。 “S-I-N-D”这4个字符之间相距的数目是10,21,16,我推测密文中应该有4个字母,它们之间相距的数字也是10,21,16的。那么这几个密文字母的明文就是“SIND”了。 可是我算了一下,却找不出密文中有这么几个字母,到底是我的想法错了,还是你的密文不对?

破解维琼内尔密码一般从猜解密钥的长度开始,可是这个题目给出的密文太短了,又没有重复的单词,所以密钥的长度猜不出来。


2004-11-07 17:24
hyj919
Rank: 1
等 级:新手上路
帖 子:16
专家分:0
注 册:2004-11-5
得分:0 

我的密码基础知识不够

爱莫能助

2004-11-08 12:37
lgwlgwlgw
Rank: 1
等 级:新手上路
帖 子:6
专家分:0
注 册:2004-11-3
得分:0 
3楼的同学,该密钥和明文为德文,也许你看不懂事正常的。请你将你推导的明文写一下出来。我最想要的事解密过程的程序,如果有就最好了。
2004-11-08 18:36
指向指针的指针
Rank: 1
等 级:新手上路
帖 子:339
专家分:0
注 册:2004-8-8
得分:0 
啥子东西哦~~~~~~~~~~~~

/sign.png" border="0" onload="if(this.width>screen.width*0.7) {this.resized=true; this.width=screen.width*0.7; this.alt='Click here to open new window\nCTRL+Mouse wheel to zoom in/out';}" onmouseover="if(this.width>screen.width*0.7) {this.resized=true; this.width=screen.width*0.7; this.style.cursor='hand'; this.alt='Click here to open new window\nCTRL+Mouse wheel to zoom in/out';}" onclick="if(!this.resized) {return true;} else {window.open('http://www./sign.png');}" onmousewheel="return imgzoom(this);" alt="" />
2004-11-11 17:59
poppylx
Rank: 1
等 级:新手上路
帖 子:367
专家分:0
注 册:2004-9-27
得分:0 

偶在网吧 有点烦 粗略的看一下 有这样一点理解 觉得蛮容易 不过不晓得理解错误没有

密码过程 将A.B.C.D......Z,编号0.1.2.3....25,

这样一个密文就等于其明文+钥匙字

如果密文数字大于25 则减去26 在对应密码编号

解密过程反过来就是

应该就这样吧

西西 如有错误 高手勿骂


动于心而静如水
2004-11-13 20:45



参与讨论请移步原网站贴子:https://bbs.bccn.net/thread-7121-1-1.html




关于我们 | 广告合作 | 编程中国 | 清除Cookies | TOP | 手机版

编程中国 版权所有,并保留所有权利。
Powered by Discuz, Processed in 0.618827 second(s), 8 queries.
Copyright©2004-2024, BCCN.NET, All Rights Reserved