维格内尔加密(Vigenere cipher)密码分析

2020年4月8日16:52:19 发表评论

维格内尔加密使用"n位偏移"序列的简单替换密码来加密,其中偏移量使用关键字作为索引,"A"代表偏移0位,"B"代表偏移1位,依此类推。举个例子,如果关键词是"DOG",那么第1个字母被加密时使用3位偏移量的简单替换密码,第2个字母使用14位偏移量的简单替换密码,第3个字母使用6位偏移量的简单替换密码,接下来按照该模式重复,即第4个字母加密时使用3位偏移量,第4个字母加密时使用14位偏移量,依此类推。

对下列密文进行密码分析,设法确定它的明文和密钥。已知关键词是3个字母组成的单词。

CTMYRDOIBSRESRRRIJYREBYLDIYMLCCYQXSRRMLQFSDXFOWFKTCYJRRIQZSMX

根据已知条件我们就可以开始破译了:

穷举密钥空间

根据给出的信息我们知道关键字是3个字母组成的单词,因此我们查找所有3个字母组成的单词,有以下结果:

act,add,age,ago,aid,aim,air,all,and,ant,any,apt,arm,art,ash,ask,awe,bad,bag,ban,bar,bat,bay,bed,bee,beg,bet,bid,big,bin,bit,bow,box,boy,bud,bug,bus,but,buy,cab,can,cap,car,cat,cop,cow,cry,cue,cup,cut,dam,day,dew,die,dig,dim,dip,dog,dot,dry,due,dye,ear,eat,ebb,egg,ego,end,era,eve,eye,fan,far,fat,fax,fee,few,fit,fix,flu,fly,fog,for,fox,fry,fun,fur,gap,gay,get,god,gum,gun,gut,guy,ham,hat,hay,hen,her,him,hip,his,hit,hop,hot,how,hug,hum,hut,ice,icy,ill,ink,inn,ion,jam,jar,jaw,jet,job,jog,joy,jug,key,kid,kin,kit,lab,lad,lag,lap,law,lay,leg,let,lid,lie,lip,log,lot,low,mad,man,map,mat,may,mix,mob,mud,mug,nap,net,new,nod,nor,not,now,nut,oak,oar,odd,off,oil,old,one,opt,ore,our,out,owe,owl,own,pad,pan,pat,paw,pay,pea,pen,per,pet,pig,pin,pir,pit,pop,pot,pub,put,rag,rap,rat,raw,ray,red,rib,rid,rim,rip,rob,rod,rot,row,rub,rug,run,sad,saw,say,sea,see,set,sew,sex,she,shy,sin,sip,sir,sit,six,ski,sky,sly,sob,son,sow,spy,sue,sum,sun,tag,tan,tap,tar,tax,tea,ten,the,tie,tin,tip,toe,ton,too,top,tow,toy,try,tub,tug,two,use,van,via,war,wax,way,web,wet,who,why,win,wit,yes,yet,you,zip,zoo"

粗略统计了下,由3个字母组成的单词大概有300个。

爆破

因为密钥空间只有300个左右,所以我们直接爆破就可以了。当然,用手算是不可能的。于是,根据给出的信息,我们编写如下代码:

#include<iostream>
using namespace std;
int main() {
	char *str = { "act,add,age,ago,aid,aim,air,all,and,ant,any,apt,arm,art,ash,ask,awe,bad,bag,ban,bar,bat,bay,bed,bee,beg,bet,bid,big,bin,bit,bow,box,boy,bud,bug,bus,but,buy,cab,can,cap,car,cat,cop,cow,cry,cue,cup,cut,dam,day,dew,die,dig,dim,dip,dog,dot,dry,due,dye,ear,eat,ebb,egg,ego,end,era,eve,eye,fan,far,fat,fax,fee,few,fit,fix,flu,fly,fog,for,fox,fry,fun,fur,gap,gay,get,god,gum,gun,gut,guy,ham,hat,hay,hen,her,him,hip,his,hit,hop,hot,how,hug,hum,hut,ice,icy,ill,ink,inn,ion,jam,jar,jaw,jet,job,jog,joy,jug,key,kid,kin,kit,lab,lad,lag,lap,law,lay,leg,let,lid,lie,lip,log,lot,low,mad,man,map,mat,may,mix,mob,mud,mug,nap,net,new,nod,nor,not,now,nut,oak,oar,odd,off,oil,old,one,opt,ore,our,out,owe,owl,own,pad,pan,pat,paw,pay,pea,pen,per,pet,pig,pin,pir,pit,pop,pot,pub,put,rag,rap,rat,raw,ray,red,rib,rid,rim,rip,rob,rod,rot,row,rub,rug,run,sad,saw,say,sea,see,set,sew,sex,she,shy,sin,sip,sir,sit,six,ski,sky,sly,sob,son,sow,spy,sue,sum,sun,tag,tan,tap,tar,tax,tea,ten,the,tie,tin,tip,toe,ton,too,top,tow,toy,try,tub,tug,two,use,van,via,war,wax,way,web,wet,who,why,win,wit,yes,yet,you,zip,zoo" };
	char *str2 = { "CTMYRDOIBSRESRRRIJYREBYLDIYMLCCYQXSRRMLQFSDXFOWFKTCYJRRIQZSMX" };
	char *p = str2;
	while (*str != '\0') {
		putchar(*str);
		int a = *str++ - 'a';
		putchar(*str);
		int b = *str++ - 'a';
		putchar(*str);
		int c = *str++ - 'a';
		cout << "----";
		str++;
		for (int i = 0; *p != '\0';i++) {
			if (i % 3 == 0)cout << char((*p - 'A' - a+26) % 26+'a');
			if (i % 3 == 1)cout << char((*p - 'A' - b+26) % 26 + 'a');
			if (i % 3 == 2)cout << char((*p - 'A' - c+26) % 26 + 'a');
			p++;
		}
		cout << endl;
		p = str2;
	}
	system("pause");
	return 0;
}

运行

运行结果如下所示:

横线左边的密钥,右边是明文。通过观察,我们可以看到密钥为"key"时,后面的明文是有意义的,密钥——明文如下:

key----spoonfeedinginthelongrunteachesusnothingbuttheshapeofthespoon

因为博主是个英语渣,GOOGLE翻译一番之后才知道意思是什么,如下:

从长远来看,勺子喂食只会让我们知道勺子的形状

大概是"授之以鱼不如授之以渔"之类的意思,不知道大家理解了没有。

flyingsheep

发表评论