加密算法

  • 格式:doc
  • 大小:117.00 KB
  • 文档页数:5

下载文档原格式

  / 10
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
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。据说凯撒是率先使用加密函的古代将领之一,因此这种加密方法被称为凯撒密码。
假如有这样一条指令: