小弟在德国念书,教授出了一道加解密题目,关于“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;
}