S: S 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 T: 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 U 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 T 很明显,这种密码的密度是很低的,只需简单地统计字频就可以破译。于是人们在单一凯撒密码的基础上扩展出多表密码,称为“维吉尼亚”密码。它是由16世纪法国亨利三世王朝的布莱瑟·维吉尼亚发明的,其特点是将26个凯撒密表合成一个,见下表: 原: 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 J: J K L M N O P Q R S T U V W X Y Z A B C D E F G H I K: K L M N O P Q R S T U V W X Y Z A B C D E F G H I J L: L M N O P Q R S T U V W X Y Z A B C D E F G H I J K 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 int k; //后(右)移位数,相当于密钥 void getPlainText() //获得明文字符串 { printf("请输入明文:"); scanf("%s",plaintext); printf("\n"); } void getLength() //获取后(右)移位数(密钥) { printf("请输入后移的位数:"); G: G H I J K L M N O P Q R S T U V W X Y Z A B C D E F H: H I J K L M N O P Q R S T U V W X Y Z A B C D E F G I: I J K L M N O P Q R S T U V W X Y Z A B C D E F G H M: M N O P Q R S T U V W X Y Z A B C D E F G H I J K L N: N O P Q R S T U V W X Y Z A B C D E F G H I J K L M O: O P Q R S T U V W X Y Z A B C D E F G H I J K L M N 通过本次实验,我认识到自己的不足,以后会多加练习,将理论与实践结合起来,在实验过程中,通过老师的指导,学会了凯撒加密算法的编写思路,扩充了思维,学到了更多的知识。 Y Y Z A B C D E F G H I J K L M N O P Q R S T U V W X Z Z 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 维吉尼亚密码引入了“密钥”的概念,即根据密钥来决定用哪一行的密表来进行替换,以此来对抗字频统计。假如以上面第一行代表明文字母,左面第一列代表密钥字母,对如下明文加密: P: P Q R S T U V W X Y Z A B C D E F G H I J K L M N O Q: Q R S T U V W X Y Z A B C D E F G H I J K L M N O P R: R S T U V W X Y Z A B C D E F G H I J K L M N O P Q unsigned int i; printf("\n加密后的密文是:"); for(i=0;i<strlen(plaintext);i++) //把参与计算后是整数强制转换成对应的字符 printf("%c",(char)ciphertext[i]); printf("\n"); } void main() { getPlainText(); //明文 密: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. getLength(); //后(右)移位数 Caesar_cipher(); //凯撒加密 printCipherText(); //密文 } 2.记录调试及进行情况 3.程序结构说明 用C语言实现任意字符串的加密,其中,字母用凯撒加密方法加密,非字母不变。可加密字符串最大长度是80。先输入明文字符,再输入密钥,即字母后移几位,输出密文。应当注意的是,因为字母只有26个,所以密钥最大不能超过26,否则即使重复了。本程序中对非字母字符不作处理,原样保存。 4.程序使用说明 使用此程序时,先输入明文,就是要加密的内容,按一下回车键,输入密钥,注意密钥0<K<26。 按一下回车键,出现的就是凯撒加密算法加密后的密文。按任意键即可退出程序。 5.实验总结与体会 在这次试验中,我通过对凯撒加密的理解,知道了凯撒加密的本质:将字母后移K位,K既是密钥。根据本质编写代码,在编写代码的时候遇到了一些问题,通过查阅课本,问题一一解决,程序运行较为顺利。 if(ciphertext[i]>(int)'z'){ //保证是循环后(右)移 ciphertext[i]-=26; } } else //非字母字符,不做处理,原样保存 ciphertext[i]=(int)plaintext[i]; } } void printCipherText() //输出加密后的密文 { TO BE OR NOT TO BE THAT IS THE QUESTION 当选定RELATIONS作为密钥时,加密过程是:明文一个字母为T,第一个密钥字母为R,因此可以找到在R行中代替T的为K,依此类推,得出对应关系如下: 密钥:RELAT IONSR ELATI ONSRE LATIO NSREL V V W X Y Z A B C D E F G H I J K L M N O P Q R S T U W W X Y Z A B C D E F G H I J K L M N O P Q R S T U V X X Y Z A B C D E F G H I J K L M N O P Q R S T U V W //用C语言实现任意字符串的加密,其中,字母用凯撒加密方法加密,非字母不变 #include<stdio.h> #include<string.h> #define N 80 //可加密字符串最大长度 char plaintext[N]={0}; //明文,输入时输入字符,参与运算时强制转换成整数 int ciphertext[N]={0}; //密文,保存成整数,输出时强制转换成字符 明文:TOBEO RNOTT OBETH ATIST HEQUE STION 密文:KSMEH ZBBLK SMEMP OGAJX SEJCS FLZSY 历史上以维吉尼亚密表为基础又演变出很多种加密方法,其基本元素无非是密表与密钥,并一直沿用到二战以后的初级电子密码机上。 二、凯撒加密算法的实验 1.编写程序 A :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 B :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 A C: C D E F G H I J K L M N O P Q R S T U V W X Y Z A B scanf("%d",&k); k%=26; //因为字母只有26个,所以超过26相当于重复 } void Caesar_cipher() //凯撒加密,本程序采用的是字母循环后(右)移 { unsigned int i; for(i=0;i<strlen(plaintext);i++) { //两个bool类型的变量是为了判断字符是否是字母(包括大写和小写) D: D E F G H I J K L M N O P Q R S T U V W X Y Z A B C E: E F G H I J K L M N O P Q R S T U V W X Y Z A B C D F: F G H I J K L M N O P Q R S T U V W X Y Z A B C D E bool flag1=plaintext[i]>='a'&&plaintext[i]<='z'; bool flag2=plaintext[i]>='A'&&plaintext[i]<='Z'; if(fl百度文库g1||flag2){ //如果是字母,加密 ciphertext[i]=(int)plaintext[i]+k; //字母在字母表中后(右)移K位 用C语言实现凯撒加密算法 一、凯撒加密算法的来源与简介 “凯撒密码”据传是古罗马凯撒大帝用来保护重要军情的加密系统。它是一种替代密码,通过将字母按顺序推后起3位起到加密作用,如将字母A换作字母D,将字母B换作字母E。据说凯撒是率先使用加密函的古代将领之一,因此这种加密方法被称为凯撒密码。 假如有这样一条指令: