二战德国谜密密码
英纳格玛(ENGMA)是由德国发明家亚瑟·谢尔比乌斯(Arthur?Scherbius),被誉为“超级密码”,并使密码编译从人工手写时代跨越到了机器操作时代。并且为德国在二战时期的密码加密做了不小的贡献。
英纳格玛(ENGMA)又称恩格尼码,在所有用于军事和外交的密码里,最著名的恐怕应属第二次世界大战中德国方面使用的ENIGMA(读作“恩尼格玛”,意为“谜”)。
扩展资料
恩格尼码的诞生:
直到第一次世界大战结束为止,所有密码都是使用手工来编码的。直截了当地说,就是铅笔加纸的方式。在我国,邮电局电报编码和译码直到很晚(大概是上个世纪八十年代初)还在使用这种手工方法。
手工编码的方式给使用密码的一方带来很多的不便。首先,这使得发送信息的效率极其低下。明文(就是没有经过加密的原始文本)必须由加密员人工一个一个字母地转换为密文。
考虑到不能多次重复同一种明文到密文的转换方式(这很容易使敌人猜出这种转换方式),和民用的电报编码解码不同,加密人员并不能把转换方式牢记于心。转换通常是采用查表的方法,所查表又每日不同,所以解码速度极慢。
而接收密码一方又要用同样的方式将密文转为明文。其次,这种效率的低下的手工操作也使得许多复杂的保密性能更好的加密方法不能被实际应用,而简单的加密方法根本不能抵挡解密学的威力。
解密一方当时正值春风得意之时,几百年来被认为坚不可破的维吉耐尔(Vigenere)密码和它的变种也被破解。而无线电报的发明,使得截获密文易如反掌。无论是军事方面还是民用商业方面都需要一种可靠而又有效的方法来保证通讯的安全。
1918年,德国发明家亚瑟.谢尔比乌斯(ArthurScherbius)和他的朋友理查德.里特(RichardRitter)创办了谢尔比乌斯和里特公司。这是一家专营把新技术转化为应用方面的企业,很象现在的高新技术公司,利润不小,可是风险也很大。
谢尔比乌斯负责研究和开发方面,紧追当时的新潮流。他曾在汉诺威和慕尼黑研究过电气应用,他的一个想法就是要用二十世纪的电气技术来取代那种过时的铅笔加纸的加密方法。
亚瑟.谢尔比乌斯谢尔比乌斯发明的加密电子机械名叫ENIGMA,在以后的年代里,它将被证明是有史以来最为可K的加密系统之一,而对这种可K性的盲目乐观,又使它的使用者遭到了灭顶之灾。
参考资料来源:百度百科——恩格尼码
维吉尼亚密码加密解密对照表
采用替代密码算法中的维吉尼亚密码方法,密文C=“HEADVIGENERE”,密钥K=KEY,求明文P
将密文HEADVIGENERE用密钥替换后为KEYKEYKEYKEY
替换前:HEADVIGENERE
替换后:KEYKEYKEYKEY
解密求明文:
按替换后的内容找到第一行的K所在位置向下寻找,找到H的位置,当前行最左侧第一列对应的就为明文X
加密求密文:
按明文找到第一列对应的H,在从第一行中找到对应的密钥K,两个位置相交的值就为密文.
答案:
HEA DVI GEN ERE
KEY? KEY KEY? KEY
XAC?TRK?WAP?UNG
恺撒移位密码的破解方法
字母频度分析
尽管我们不知道是谁发现了字母频度的差异可以用于破解密码。但是9世纪的科学家阿尔·金迪在《关于破译加密信息的手稿》对该技术做了最早的描述。
“如果我们知道一条加密信息所使用的语言,那么破译这条加密信息的方法就是找出同样的语言写的一篇其他文章,大约一页纸长,然后我们计算其中每个字母的出现频率。我们将频率最高的字母标为1号,频率排第2的标为2号,第三标为3号,依次类推,直到数完样品文章中所有字母。然后我们观察需要破译的密文,同样分类出所有的字母,找出频率最高的字母,并全部用样本文章中最高频率的字母替换。第二高频的字母用样本中2号代替,第三则用3号替换,直到密文中所有字母均已被样本中的字母替换。”
以英文为例,首先我们以一篇或几篇一定长度的普通文章,建立字母表中每个字母的频度表。
在分析密文中的字母频率,将其对照即可破解。
虽然设密者后来针对频率分析技术对以前的设密方法做了些改进,比如说引进空符号等,目的是为了打破正常的字母出现频率。但是小的改进已经无法掩盖单字母替换法的巨大缺陷了。到16世纪,最好的密码破译师已经能够破译当时大多数的加密信息。 短文可能严重偏离标准频率,加入文章少于100个字母,那么对它的解密就会比较困难。
而且不是所有文章都适用标准频度:
1969年,法国作家乔治斯·佩雷克写了一部200页的小说《逃亡》,其中没有一个含有字母e的单词。更令人称奇的是英国小说家和评论家吉尔伯特·阿代尔成功地将《逃亡》翻译成英文,而且其中也没有一个字母e。阿代尔将这部译著命名为《真空》。如果这本书用单密码表进行加密,那么频度分析破解它会受到很大的困难。
一套新的密码系统由维热纳尔(Blaise de Vigenere)于16世纪末确立。其密码不再用一个密码表来加密,而是使用了26个不同的密码表。这种密码表最大的优点在于能够克制频度分析,从而提供更好的安全保障。
“恺撒密码”据传是古罗马恺撒大帝用来保护重要军情的加密系统。它是一种替代密码,通过将字母按顺序推后起3位起到加密作用,如将字母A换作字母D,将字母B换作字母E。据说恺撒是率先使用加密函的古代将领之一,因此这种加密方法被称为恺撒密码。
假如有这样一条指令:
RETURN TO ROME
用恺撒密码加密后就成为:
UHWXUA WR URPH
如果这份指令被敌方截获,也将不会泄密,因为字面上看不出任何意义。
这种加密方法还可以依据移位的不同产生新的变化,如将每个字母左19位,就产生这样一个明密对照表:
明:A B C D E F G H I J K L M N O P Q R S T U V W X Y Z
密:T U V W X Y Z A B C D E F G H I J K L M N O P Q R S
在这个加密表下,明文与密文的对照关系就变成:
明文:THE FAULT, DEAR BRUTUS, LIES NOT IN OUR STARS BUT IN OURSELVES.
密文:MAX YTNEM, WXTK UKNMNL, EBXL GHM BG HNK LMTKL UNM BG HNKLXEOXL.
维吉尼亚密码(Vigenere)(一)
维吉尼亚密码的原理与凯撒密码类似,其实是凯撒的一种强化和变形,通过使加密相同明文的秘钥不同,来掩盖字符的频率。
但也不是找不到字符频率,我们可以发现,将用"h"字符加密的明文取出之后,就变成了普通的凯撒加密,这是可以通过字符频率分析来破解的。
用到的数学公式:重合指数
1.破解秘钥长度N。
2.将密文分成N组,逐个破解秘钥。
其中fi为每个字符在英文当中的频率。fi^2则表示连续取出两个相连的字符,它们相同的概率。英文中对26种情况求和的统计结果约为0.065。
Ni/N为密文中某个字符占密文的比例,假设秘钥长度为key_len,如果key_len组密文中的重合指数IC1也都与0.065接近,那么就可以推测key_len是秘钥长度了。
当秘钥长度key_len知道以后,我们将密文分成key_len个组,计算每个分组的IC2。
举个栗子:如果第一个分组都是用b字符进行加密,那么a字符的频率会转移到b字符上,c字符的频率会转移到d字符上......我们也做这种相应的转移,让b字符在密文的频率(N1/L)和a字符在英文的频率f0相乘,当然这只是其中一种猜测。我们将这26种字符可能都列出来,最接近IC的一定是用b字符加密的那一组。
Vigenere密码单表代换加密
#include stdio.h
#include string.h
#include stdlib.h
#define NUM 100
int main()
{
int p[27][27];
int i,j;
for(i=1;i=26;i++)
{
for(j=1;j=26;j++)
{
p[i][j]=63+i+j;
if(p[i][j]90)
{
p[i][j]=p[i][j]-26;
}
}
}
i=0;
char key[NUM],word[NUM],*temp;
int k1,k2;
printf("密钥: ");
scanf("%s",key);
printf("明文: ");
scanf("%s",word);
printf("\n");
k1=strlen(key);
k2=strlen(word);
temp=(char*)calloc(k2,sizeof(char));
int k=0;
if(k1k2)
{
while(ik2)
{
key[i]=key[k];
i+=1;
k+=1;
if(k%k1==0)
{
k=0;
}
}
}
/*for(i=0;ik2;i++)
{
printf("%c",word[i]);
}*/
for(i=0;ik2;i++)
{
temp[i]=p[key[i]-96][word[i]-96];
}
printf("密文: ");
for(i=0;ik2;i++)
{
printf("%c ",temp[i]);
}
printf("\n");
system("pause");
return 0;
}
Vigenere加密算法用C++实现,在线等,紧急
这是我以前在博客里写的一篇文章
Vigenere加密的原理:
假设有一Vigenere密钥为(2,4,8,12,7),欲对明文helloworld加密
将明文helloworld的第一个字母移动2个位置,第二个位置移动4个位置,…,第5个字母移动7个位置,然后再从密钥的头部开始循环,直到将明文hellowrold全部转换为密文
#include iostream
#include ctime
#define KEYLEN 10 //密钥的长度
using namespace std;
void Encipher(char* plain,char* cipher,int key[]);
void Cipher(char* cipher,int key[]);
int main()
{
char* cipher=new char[27];
srand((unsigned)time(0));
int key[KEYLEN]; //密钥
for(int i=0;iKEYLEN;i++) key[i]=rand()%15+5; //生成密钥
Encipher("hellowrold!iamleukotrichia",cipher,key); //生成密文并存储在cipher中
cout "密文: " cipher endl;
Cipher(cipher,key);
system("pause");
return 0;
}
void Encipher(char* plain,char* cipher,int key[])//生成密文
{
int i=0;
while(*plain)
{
if(i=KEYLEN) i=0;
*cipher=(*plain++)+key[i];
cipher++;
i++;
}
*cipher='\0';
return;
}
void Cipher(char* cipher,int key[]) //解密
{
int i=0;
cout "明文: ";
while(*cipher)
{
if(i=KEYLEN) i=0;
cout (char)((*cipher++)-key[i]);
i++;
}
cout endl;
return;
}