搜档网
当前位置:搜档网 › 凯撒密码--C语言实现

凯撒密码--C语言实现

凯撒密码--C语言实现
凯撒密码--C语言实现

凯撒密码是一种非常古老的加密方法,相传当年凯撒大地行军打仗时为了保证自己的命令不被敌军知道,就使用这种特殊的方法进行通信,以确保信息传递的安全。他的原理很简单,说到底就是字母于字母之间的替换。下面让我们看一个简单的例子:“baidu”用凯撒密码法加密后字符串变为“edlgx”,它的原理是什么呢?把“baidu”中的每一个字母按字母表顺序向后移3位,所得的结果就是刚才我们所看到的密文。

/**凯撒密码实现

要求,将明文字母变成它后面第三个字母,后面的循环到前面!

公式为f(a)=(f(a)+3)%26

*/

#include

int main()

{

char P[100];/*定义明文长度*/

char C[100];/*定义密文长度*/

int K=3,i;

printf("Please input Plaintext:\n"); /*输入明文*/

gets(P); /* 接受明文*/

for(i=0;P[i]!='\0';i++) { /*逐个判断字母的大小*/

if(P[i]>='a'&&P[i]<='z') /*小写字母*/

C[i]=(P[i]-'a'+K)%26+'a';

else if(P[i]>='A'&&P[i]<='Z')/*大写字母*/

C[i]=(P[i]-'A'+K)%26+'A';

else C[i]=' ';/*如果不是字母,转换为空格*/

}

printf("The Ciphertext is :\n%s\n",C);/*输出密文*/

getch();

return 0;

}

1、程序结构化,用函数分别实现

2、对文件的加密,解密输出到文件

#include

#include

void menu()/*菜单,1.加密2.解密3.退出*/

{

clrscr();

printf("\n=============================================================== ================");

printf("\n1.Encrypt the file");

printf("\n2.Decrypt the file");

printf("\n3.Quit\n");

printf("================================================================ ===============\n");

printf("Please select a item:");

return;

}

char encrypt(char ch,int n)/*加密函数,把字符向右循环移位n*/

{

while(ch>='A'&&ch<='Z')

{

return ('A'+(ch-'A'+n)%26);

}

while(ch>='a'&&ch<='z')

{

return ('a'+(ch-'a'+n)%26);

}

return ch;

}

main()

{

int i,n;

char ch0,ch1;

FILE *in,*out;

char infile[10],outfile[10];

textbackground(RED);

textcolor(LIGHTGREEN);

clrscr();

menu();

ch0=getch();

while(ch0!='3')

{

if(ch0=='1')

{

clrscr();

printf("\nPlease input the infile:");

scanf("%s",infile);/*输入需要加密的文件名*/

if((in=fopen(infile,"r"))==NULL)

{

printf("Can not open the infile!\n");

printf("Press any key to exit!\n");

getch();

exit(0);

}

printf("Please input the key:");

scanf("%d",&n);/*输入加密密码*/

printf("Please input the outfile:");

scanf("%s",outfile);/*输入加密后文件的文件名*/

if((out=fopen(outfile,"w"))==NULL)

{

printf("Can not open the outfile!\n");

printf("Press any key to exit!\n");

fclose(in);

getch();

exit(0);

}

while(!feof(in))/*加密*/

{

fputc(encrypt(fgetc(in),n),out);

}

printf("\nEncrypt is over!\n");

fclose(in);

fclose(out);

sleep(1);

}

if(ch0=='2')

{

clrscr();

printf("\nPlease input the infile:");

scanf("%s",infile);/*输入需要解密的文件名*/

if((in=fopen(infile,"r"))==NULL) {

printf("Can not open the infile!\n");

printf("Press any key to exit!\n");

getch();

exit(0);

}

printf("Please input the key:");

scanf("%d",&n);/*输入解密密码(可以为加密时候的密码)*/ n=26-n;

printf("Please input the outfile:");

scanf("%s",outfile);/*输入解密后文件的文件名*/

if((out=fopen(outfile,"w"))==NULL)

{

printf("Can not open the outfile!\n");

printf("Press any key to exit!\n");

fclose(in);

getch();

exit(0);

}

while(!feof(in))

{

fputc(encrypt(fgetc(in),n),out);

}

printf("\nDecrypt is over!\n");

fclose(in);

fclose(out);

sleep(1);

}

clrscr();

printf("\nGood Bye!\n");

sleep(3);

getch();

}

}

---------------------------------------------------------------------------------------------------------------------------------------------

/*移位法:*/

#include

#include

char *Encrypt(char *pwd,int key) /*加密*/

{

for(int i=0;*(pwd+i)!='\0';i++)

{

if(*(pwd+i)>='a'&&*(pwd+i)<='z')

*(pwd+i)=(*(pwd+i)-'a'+key)%26+'a';

else if(*(pwd+i)>='A'&&*(pwd+i)<='Z')

*(pwd+i)=(*(pwd+i)-'A'+key)%26+'A';

}

return pwd;

}

char *Decrypt(char *pwd,int key) /*解密*/

{

for(int i=0;*(pwd+i)!='\0';i++)

{

if(*(pwd+i)>='a'&&*(pwd+i)<='z')

{

if(*(pwd+i)-'a'>=key%26)

*(pwd+i)=*(pwd+i)-key%26;

else *(pwd+i)='z'-(key%26-(*(pwd+i)-'a'))-1;

}

else if(*(pwd+i)>='A'&&*(pwd+i)<='Z')

{

if(*(pwd+i)-'A'>=key%26)

*(pwd+i)=*(pwd+i)-key%26;

else *(pwd+i)='Z'-(key%26-(*(pwd+i)-'A'))-1;

}

return pwd;

}

void main()

{

char *pwd;

int key;

pwd=(char*)malloc(sizeof(char));

printf("Input your password:");

gets(pwd);

printf("Input a key:");

scanf("%d",&key);

printf("The Ciphertext is:");

printf("%s\n",Encrypt(pwd,key));

}

------------------------------------------------------------------

/*替换法:*/

#include

#include

#include

void table(char *keyword) /*筛选密钥(去重复去空格)*/

{

int i,j,k;

for(i=0;*(keyword+i)!='\0';i++)

{

for(j=i;*(keyword+j)!='\0';j++)

{

if(i!=j)

if(*(keyword+i)==*(keyword+j)||*(keyword+j)==' ')

{

for(k=j;*(keyword+k)!='\0';k++)

*(keyword+k)=*(keyword+k+1);

j--;

}

}

}

}

void newTab(char *keyword) /*生成密钥表*/

{

char ch;

int t;

for(t=0;*(keyword+t)!='\0';t++);

for(ch='a';ch<='z';ch++)

{

for(i=0;*(keyword+i)!=ch;i++)

{

if(*(keyword+i)=='\0')

{

*(keyword+t)=ch;

t++;

break;

}

}

}

*(keyword+t)='\0';

}

char *Ciphertext(char *keyword,char *Plaintext) /*按密码表加密*/ {

char ch;

int i,j;

for(i=0;*(Plaintext+i)!='\0';i++)

{

for(ch='a',j=0;ch<='z';ch++,j++)

{

if(*(Plaintext+i)==ch)

{

*(Plaintext+i)=*(keyword+j);

break;

}

}

}

return Plaintext;

}

char *Decrypt(char *keyword,char *Plaintext) /*解密*/

{

char ch;

int i,j;

for(i=0;*(Plaintext+i)!='\0';i++)

{

for(ch='a',j=0;*(keyword+j)!='\0';ch++,j++)

{

if(*(Plaintext+i)==*(keyword+j))

{

*(Plaintext+i)=ch;

break;

}

}

}

return Plaintext;

}

void main()

{

char *keyword,*Plaintext,*tmp=NULL;

keyword=(char*)malloc(sizeof(char));

Plaintext=(char*)malloc(sizeof(char));

printf("Input key word:"); /*输入欲用密钥*/

gets(keyword);

printf("Input Plaintext:"); /*输入要转换的明文*/

gets(Plaintext);

table(keyword); /*去空格去重复*/

newTab(keyword); /*生成密码表*/

tmp=Ciphertext(keyword,Plaintext); /*对应着密码表生成密文*/ puts(tmp); /*输出密文*/

puts(Decrypt(keyword,tmp)); /*解密输出*/

}

java凯撒密码实现----完美版

代码: package ning.hao; import java.io.BufferedReader; import java.io.IOException; import java.io.InputStreamReader; import java.util.Scanner; public class Cryptology { char ciphertext[];//密文 int key; char plaintext[];//明文 StringBuffer plaintextStr; StringBuffer ciphertextStr; final int max=500; Cryptology(){ key=0; plaintextStr=new StringBuffer(""); ciphertextStr=new StringBuffer(""); } int setKey(){ System.out.println("请输入一个Caesar密钥"); Scanner sc=new Scanner(System.in); try{ key=sc.nextInt()%26; } catch(Exception e){ System.out.println("需要输入整数!"); } return key; } void getPlaintext(){//获得明文 plaintext=new char[max]; for(int j=0;j

char ch=' '; BufferedReader bf=new BufferedReader(new InputStreamReader(System.in)); System.out.println("请输入明文"); try { ch=(char) bf.read();//获得字符 while(ch!='\r'&&ch!='\n'){ if(ch>='a'&&ch<='z'||ch>='A'&&ch<='Z'||ch==' '||ch==','||ch=='.'||ch=='!'){ plaintext[i]=ch; i++; } else{ System.out.println("输入不支持!!"); break; } try{ ch=(char) bf.read(); } catch(IOException e1){ } } } catch(IOException e){} } void encryption(){//加密 int temp=0; ciphertext=new char[max]; for(int j=0;j='a'&&plaintext[i]<='z'){ if(temp>122) ciphertext[i]=(char) (97+temp-123); else{

凯撒算法的加密和解密过程 C

加密过程源代码: #include int main() { int key,i,n; char mingma[888],mima[888]; cout<<"王小宁"<>mingma; cout<<"请输入KEY:"<>key; for( i=0;mingma[i]!='\0';i++) { if((mingma[i]>='A')&&(mingma[i]<='Z')) mima[i]='A'+(mingma[i]-'A'+key)%26; if((mingma[i]>='a')&&(mingma[i]<='z')) mima[i]='a'+(mingma[i]-'a'+key)%26; n=i; } cout<<"改密后的密码为:"<

解密过程源代码: #include int main() { int key,i,n; char mingma[888],mima[888]; cout<<"王小宁"<>mima; cout<<"请输入KEY:"<>key; for( i=0;mima[i]!='\0';i++) { if((mima[i]>='A')&&(mima[i]<='Z')) mingma[i]='A'+(mima[i]-'A'+26-key)%26; if((mima[i]>='a')&&(mima[i]<='z')) mingma[i]='a'+(mima[i]-'a'+26-key)%26; n=i; } cout<<"解密后的明码为:"<

凯撒密码

南通大学网络安全实验课 实验报告 学生姓名 所在院系 专业 学号 指导教师 南通大学 2014年 5 月

凯撒密码 一、概念与原理 它是一种代换密码。据说恺撒是率先使用加密函的古代将领之一,因此这种加密方法被称为恺撒密码。 凯撒密码作为一种最为古老的对称加密体制,在古罗马的时候都已经很流行,他的基本思想是:通过把字母移动一定的位数来实现加密和解密。明文中的所有字母都在字母表上向后(或向前)按照一个固定数目进行偏移后被替换成密文。例如,当偏移量是3的时候,所有的字母A将被替换成D,B变成E,以此类推X将变成A,Y变成B,Z变成C。由此可见,位数就是凯撒密码加密和解密的密钥。 如恺撒使用过的偏移量为3的这种密码,若明文为: M=Casesar cipher is a shift substitution 则密文为 C=Fdvhvdu flskhu lv d vkliw vxevwlwxwlrq 二、实验内容与步骤 1、手动完成Caesar密码 (1)在实验原理部分我们已经了解了Caesar密码的基本原理,那么我们先写出当密钥k=3时,对应明文:data security has evolved rapidly的密文。 (2)进入实验平台,单击工具栏中的“密码工具”按钮,启动密码工具,在向导区点击“Caesar密码”。在明文输入区输入明文:data security has evolved rapidly。将密钥k调节到3,查看相应的密文,并与你手动加密的密文进行比较。 请根据密钥验证密文与明文对应关系是否正确。 2、Caesar加密 (1)进入“加密解密”|“Caesar密码”视图,在明文输入区输入明文(明文应为英文),单击“加密”按钮进行加密。 (2)调节密钥k的微调按钮或者对照表的移位按钮,选择合适的密钥k值,并记下该密钥k值用于同组主机的解密。加密工作完成后,单击“导出”按钮将密文默认导出到Caesar 共享文件夹(D:\Work\Encryption\Caesar\)中,默认文件名为Caesar密文.txt。 (3)通知同组主机接收密文,并将密钥k通告给同组主机。 (4)单击“导入”按钮,进入同组主机Work\Encryption\Caesar目录(\\同组主机IP\Work\Encryption\Caesar),打开Caesar密文.txt。 (5)调节密钥k的微调按钮或对照表的移位按钮,将k设为同组主机加密时的密钥k 值,这时解密已经成功。 (6)将解密后的明文与同组主机记录的明文比较,请对比明文是否相同。 3、Caesar密码分析 (1)本机进入“密码工具”|“加密解密”|“Caesar密码”,在明文输入区输入明文(要求明文有一定的意义以便让同组主机分析)。 (2)调节密钥k的微调按钮或者对照表的移位按钮,选择合适的密钥k值完成Caesar 加密,单击“导出”按钮,将密文默认导出到Caesar共享文件夹中。 (3)通告同组主机(不要通告密钥值k)密文已经放在共享文件夹中,让同组主机获

凯撒密码实验

一、实验目的 通过实验熟练掌握凯撒密码算法,学会凯撒密码算法程序设计。 二、实验环境 软件工具:Visual C++ 6.0 操作系统:windows xp 三、实验思想 在密码学中存在着各种各样的置换方式,但所有不同的置换方式都包含2 个相同的元素。密钥和协议(算法)。凯撒密码的密钥是3,算法是将普通字母表中的字母用密钥对应的字母替换。置换加密的优点就在于它易于实施却难于破解. 发送方和接收方很容易事先商量好一个密钥,然后通过密钥从明文中生成密文,即是敌人若获取密文,通过密文直接猜测其代表的意义,在实践中是不可能的。凯撒密码的加密算法极其简单。其加密过程如下: 在这里,我们做此约定:明文记为m,密文记为c,加密变换记为E(k1,m)(其中k1为密钥),解密变换记为D(k2,m)(k2为解密密钥)(在这里不妨假设 k1=k2,记为k)。凯撒密码的加密过程可记为如下一个变换: c≡m+k mod n (其中n为基本字符个数)同样,解密过程可表示为: m≡c+k mod n (其中n为基本字符个数) 四、实验数据(源代码) #include #include #include void table(char *keyword) //筛选密钥(去重复去空格) { int i,j,k; for(i=0;*(keyword+i)!='\0';i++) { for(j=i;*(keyword+j)!='\0';j++) { if(i!=j) if(*(keyword+i)==*(keyword+j)||*(keyword+j)==' ') { for(k=j;*(keyword+k)!='\0';k++) *(keyword+k)=*(keyword+k+1); j--; } } } } void newTab(char *keyword) //生成密钥表 { char ch;

信息加密与解密实验1-1 经典密码——凯撒密码

上机实验报告 一、实验目的: 本次上机实践所涉及并要求掌握的知识点。 1、理解凯撒密码的加密、解密过程 二、实验环境 PC机一台 三、实验内容 实验一移动3位的凯撒密码: 1.(1)用移动3位的凯撒密码加密“keep this secret” (2)用移动3位的凯撒密码加密你的某位老师的名字 2.破译下列谜语的答案。这些答案是用移动3位的凯撒密码来加密的。 (1)谜语:What do you call a sleeping bull?(你怎么称呼一只 睡着的公牛?) 答案: D EXOOGRCHU (2)谜语:What is the different between a teacher and a train? (老师与火车的区别是什么?) 答案:WKH WHDFKHU VDBV “QR JXP DOORZHG” WKH WUDLQ VDBV “FKHZ FKHZ” 实验二移动4位的凯撒密码: 1.请解密下面伊薇写给艾比的便条,她使用的是移动4位的凯撒密码 WSVVC PIX’W YWI GMTLIVW JVSQ RSA SR

2.谜语:What do you call a dog at the beach ?(你怎么称呼一只在海滩 上的狗?) 答案(移动4位密码):E LSX HSK 实验三凯撒密码破解: 1.凯撒密码破解 密文:NGBKGMUUJZOSK 实验四用数传递信息的方法破译以下的谜语: 1.谜语:What kind of cookies do birds like?(鸟儿喜欢什么种类的饼干?) 答案:2,7,14,2,14,11,0,19,4 2,7,8,17,15 2.谜语:What always ends everything?(什么总是能终结所有事情?) 答案:19,7,4 11,4,19,19,4,17 四、实验总结 通过上机实践,对所学内容的某个知识点有了更深入的理解,写出一些体会、学习心得,甚至是改进意见。 也可以写对界面设计、算法设计、代码编写、程序调试、程序改进等相关的收获、感悟。 五、附录(源程序清单,包含适当的注释)

java凯撒密码课程设计论文

攀枝花学院课程设计 题目: 院(系): 年级专业: 姓名: 学号: 指导教师: 二〇XX年XX月XX日 攀枝花学院教务处制

攀枝花学院本科学生课程设计任务书

摘要 计算机与网络技术的发展将人类带入信息化社会,随之而来的是倍受关注的信息安全问题。现代密码学已成为信息安全技术的核心技术。加解密算法,成为重要的信息安全防护技术,正是现代密码学的主要应用研究成果。 其中,凯撒密码作为一种最为古老的对称加密体制,他的基本思想是:通过把字母移动一定的位数来实现加密和解密。凯撒密码加解密是一种典型的对称加密算法,就是加密密钥能够从解密密钥中推算出来,反过来也成立。大多数对称算法中,加、解密的密钥是相同的,这些算法也称为秘密密钥算法或单密钥算法。它要求发送者和接收者在安全通信之前,商定一个密钥。在加解密时密钥的保护尤为重要,如果第三方知道就会造成信息失窃,所以,在算法设计时要做详细的分析。此外,文章中还说明了凯撒密码产生的背景,如何完成加解密,并分析了凯撒密码加解密的优缺点。 关键词:凯撒密码,文件加密,防护技术

1前言 1.1背景 由于信息的安全保护问题已经显得十分突出,信息保护的现实需要,使得数据加密算法和技术迅速进入了现代社会,了解并有效使用数据加密算法技术已成为计算机技术和通信领域的专业技术人员和广大用户的迫切需求,这是信息化社会发展阶段的重要标志,数据库加密也是信息安全必不可少的安全手段。而密码则可以有效而且可行的保护信息安全的办法,有效是指密码能够做到使信息不被非法窃取,不被篡改或破坏,可行是说它需要付出的代价是可以接受的。如今数据的加密解密技术已随着计算机技术的迅猛发展,由早期的军事和外交领域,逐步伸展到交通、工业经济、科学技术、社会安全和公共生活的各个领域,成为现代社会中保护信息的重要手段和工具。因此密码学的研究就成为一个重要的来解决信息安全问题的一种手段了,而且有着重要的地位。 在信息时代,信息可以帮助团体或个人,使他们受益,同样,信息也可以用来对他们构成威胁,造成破坏。在竞争激烈的大公司中,工业间谍经常会获取对方的情报。密码技术是保护信息安全的主要手段之一。密码技术世界和数学,计算机科学,电子与通信等诸多学科于一身的交叉学科。他不仅具有信息加密功能,而且具有数字签名,身份验证,秘密分存,系统安全等功能。所以使用密码技术不仅可以保证信息的机密性,而且可以保证信息的完整信和正确性,防止信息被篡改,伪造或假冒。随着我国愈来愈现代化,使用密码的频率会愈来愈多,这就促使了数据加密技术的发展。 1.2开发工具 此次课程设计采用的开发环境是JRE,所选用的开发语言是java。这种开发工具和开发语言都是当今比较流行的。 Eclipse 是一个十分优秀的用于开发Java,,Eclipse的功能非常强大,支持也十分广泛,尤其是对各种开元产品的支持十分不错。Eclipse目前支持Java Servlet,AJAX, JSP, JSF, Struts,Spring, Hibernate,EJB3,JDBC数据库链接工具等多项功能。可以说Eclipse几乎囊括了目前所有主流开元产品的专属eclipse开发工具。

置换密码与凯撒密码加解密程序实现

昆明理工大学城市学院学生实验报告 (2012 —2013 学年第 2 学期) 课程名称:信息安全开课实验室:德信楼308 2013 年5月 8日、5月15日

一、实验目的及内容 学会置换密码、凯撒密码加解密算法的编程实现 二、实验原理及基本技术路线 欲加密的数据称为明文,明文经过某种加密算法后转换成密文,加密算法中使用的参数称之为加密密钥;密文经解密算法作用后形成明文,解密算法也有一个密钥,这两个密钥可以相同也可以不相同。密文在网络传输中可能会被窃听,特别是在无线通信中,所有传输信息是外露的,但是由于窃听者不知道解密的方法,安全可得到相对保护。 密码通信的一条基本原则是,必须假定破译知道通用的加密方法,也就是说加密算法E 是公开的。这种假设是合理的也是必要的,因为事实上任何一种加密算法都不可能做到完全的保密,其次一个加密算法在被公开之后仍要能经得起攻击才能称得上是一个合格的、强壮加密算法。另外只有在对加密算法进行不断的研究、攻击和改进中,密码学才能得到发展。既然加密算法是可能公开的,那么真正的秘密就在于密钥了,也就是说,密钥是必须保密的,它通常是一个字符串,并且可以按需要进行频繁的更换,因此以下将讨论是模型是加密算法是公开的且相对稳定,而作为参数的密钥是保密的,并且是易于更换的。在这里密钥的长度很重要,因为找到了解密密钥也就破译了密码,而密钥长度越长,密钥空间就越大,破译密钥所花的时间就越长,破译的可能性就越小。 从破译者的角度来看,密码分析所面对的问题有三种主要的变型:当仅有密文而无明文时,我们称之为“只有密文”问题;当已有了一批相匹配的明文与密文时,称之为“已知明文”问题;当能够加密自已所选的明文时,称为“选择明文”。从这三种角度来看,如密码系统仅能经得起“只有密文”的攻击还不能算是真正的安全,因为破译者完全可能从统计学的角度与一般的通信规律中猜测出一部分的明文,从而就会拥有一些相匹配的明文与密文,从而全部解密。因此,真安全的密码通信系统应是,即使破译者拥有了一些匹配的明文与密文,也无从破译其它密文。 通常情况下,加密公式C=EK(P)表示明文经加密算法E和加密钥K作用后转换成密文C,并有关系: P=DK(EK(P))。

凯撒密码的加密和解密

关于凯撒密码的实现原理 班级:姓名:学号:指导老师: 一、设计要求说明 1、设计一个凯撒密码的加密和解密的程序,要求输入一段字符和密码,输出相应的密文,完成加密过程; 若输入被加密的密文及解密密钥,能还原出原文,完成解密。 2、语言不限,工具不限,独立完成,参加答辩。 3、严格按照格式的要求完成文档,在第六部分的运行结果分析中,要求抓图说明。 二、基础知识介绍 凯撒密码的历史 凯撒密码(caeser)是罗马扩张时期朱利斯?凯撒(Julius Caesar)创造的,用于加密通过信使传递的作战命令。它将字母表中的字母移动一定位置而实现加密。 古罗马随笔作家修托尼厄斯在他的作品中披露,凯撒常用一种“密表”给他的朋友写信。这里所说的密表,在密码学上称为“凯撒密表”。用现代的眼光看,凯撒密表是一种相当简单的加密变换,就是把明文中的每一个字母用它在字母表上位置后面的第三个字母代替。古罗马文字就是现在所称的拉丁文,其字母就是我们从英语中熟知的那26个拉丁字母。因此,凯撒密表就是用d代a,用e代b,……,用z代w。这些代替规则也可用一张表格来表示,所以叫“密表”。 基本原理 在密码学中存在着各种各样的置换方式,但所有不同的置换方式都包含2个相同的元素。密钥和协议(算法)。凯撒密码的密钥是3,算法是将普通字母表中的字母用密钥对应的字母替换。置换加密的优点就在于它易于实施却难于破解. 发送方和接收方很容易事先商量好一个密钥,然后通过密钥从明文中生成密文,即是敌人若获取密文,通过密文直接猜测其代表的意义,在实践中是不可能的。 凯撒密码的加密算法极其简单。其加密过程如下: 在这里,我们做此约定:明文记为m,密文记为c,加密变换记为E(k1,m)(其中k1为密钥),解密变换记为D(k2,m)(k2为解密密钥)(在这里k1=k2,不妨记为k)。凯撒密码的加密过程可记为如下一个变换:c≡m+k mod n (其中n为基本字符个数) 同样,解密过程可表示为: m≡c+k mod n (其中n为基本字符个数) 对于计算机而言,n可取256或128,m、k、c均为一个8bit的二进制数。显然,这种加密算法极不安全,即使采用穷举法,最多也只要255次即可破译。当然,究其本身而言,仍然是一个单表置换,因此,频率分析法对其仍是有效的。 加密解密算法 恺撒密码的替换方法是通过排列明文和密文字母表,密文字母表示通过将明文字母表向左或向右移动一个固定数目的位置。例如,当偏移量是左移3的时候(解密时的密钥就是3): 明文字母表:ABCDEFGHIJKLMNOPQRSTUVWXYZ 密文字母表:DEFGHIJKLMNOPQRSTUVWXYZABC 使用时,加密者查找明文字母表中需要加密的消息中的每一个字母所在位置,并且写下密文字母表中对应的字母。需要解密的人则根据事先已知的密钥反过来操作,得到原来的明文。例如: 明文:THE QUICK BROWN FOX JUMPS OVER THE LAZY DOG 密文:WKH TXLFN EURZQ IRA MXPSV RYHU WKH ODCB GRJ 恺撒密码的加密、解密方法还能够通过同余数的数学方法进行计算。首先将字母用数字代替,A=0,B=1,...,Z=25。此时偏移量为n的加密方法即为:

凯撒密码 置换密码(1)

凯撒密码 #include #include int main() { char save[10][30]; int a,b,i,j; printf("\n请输入您要加密明文的条数:"); scanf("%d",&a); for(i=0;i='A'&&save[i][j]<='Z')||(save[i][j]>='a'&&save[i][j]<='z')) { save[i][j]+=b; if(((save[i][j]>='A'&&save[i][j]<='Z')||(save[i][j]>='a'&&save[i][j]<='z'))==0) save[i][j]-=26; } } printf("\n输出的密文为:"); puts(save[i]); } return(0); }

置换密码 1.#include 2.#include https://www.sodocs.net/doc/ce16243067.html,ing namespace std; 4.void jiami()

5.{ 6.char str[100]; 7.char str1[100]; 8.char a[100]; 9.cout<<"请输入您的密钥:"<

凯撒密码加密算法

package com.caesar; public class Crypto { // 初始化一个26*26的char类型数组,存放密码原本 public char[][] crypto = new char[26][26]; // 初始化crypto和计算原始message各个字符的位置的初始信息。 public char[] initWord = new char[] { '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' }; public static void main(String[] args) { // 初始换偏移量,最大值不能大于25(可以自定义修改) int[] offsets = new int[] { 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25 }; Crypto c = new Crypto(offsets); String message = "I have lots of swag"; String res1 = c.encrypt(message, 5); String res2 = c.doubleEncrypt(message, 5); System.out.println("加密前的字符串:"+message); System.out.println("行加密后的字符串:"+res1); System.out.println("列加密后的字符串:"+res2); } // 构造方法初始化密码原本,对crypto赋值,offsets数组是指在初始化时每行的偏移量public Crypto(int[] offsets) { // 第一种初始化方式,利用unicode编码转换,A-Z对应数字65-90 // 外层循环,表示数组行数 for (int row = 0; row < 26; row++) { // 每一行的偏移量 int offset = offsets[row]; for (int col = 0; col < 26; col++) { int c = 65 + offset + col; // 如果大于90,说明超出Z的范围,应从A在开始 if (c > 90) { c = c - 90 + 64; } crypto[row][col] = (char) (c); } } // 第二种初始化方法,利用initWord进行初始化

凯撒密码乘法加解密

乘法加解密程序: #include #include int sa[100]; int G=0; int H=0; char encrypt(char ch,int n)/*加密函数,把字符向右循环移位n*/ {while(ch>='A'&&ch<='Z') { sa[G++]=((ch-'A')*n)/26; return ('A'+((ch-'A')*n)%26); } while(ch>='a'&&ch<='z') { sa[G++]=((ch-'A')*n)/26; return ('a'+((ch-'a')*n)%26); } return ch; } char outcrypt(char ch,int n)/*解密函数*/ { while(ch>='A'&&ch<='Z') { return ((sa[H++]*26+ch-2*'A')/n+'A'); } while(ch>='a'&&ch<='z') { return ((sa[H++]*26+ch-2*'a')/n+'a'); } return ch; } void menu()/*菜单,1.加密*/ { clrscr(); printf("\n========================================================="); printf("\n1.Encrypt the file"); printf("\n2.Outcrypt the file"); printf("\n0.Quit\n"); printf("=========================================================\n"); printf("Please select a item:"); return;

密码学实验之凯撒密码和维吉尼亚密码的加解密

1.凯撒密码的加解密 源代码: #include #include #include int main() { char s[100],c; int i,p,d,e; printf("请选择: A.加密B.解密Q.退出\n"); scanf("%c",&c); if(c=='a'||c=='A') { printf("输入明文:"); scanf("%s",&s); p=strlen(s); printf("请设置偏移量:"); scanf("%d",&d); for(i=0;i='a' && s[i]<='z') s[i]=(s[i]-'a'+d)%26+'a'; else if(s[i]>='A' && s[i]<='Z') s[i]=(s[i]-'A'+d)%26+'A'; else s[i]=s[i]+d; } printf("%s",s); printf("\n\n\n"); } if(c=='b'||c=='B') { printf("请输入密文:"); scanf("%s",&s); p=strlen(s); printf("请输入加密的偏移变量:"); scanf("%d",&d); for(i=0;i='a' && s[i]<='z') { e=s[i]-'a'-d;

if(e<=0) s[i]=(e+26)%26+'a'; else s[i]=e%26+'a'; } else if(s[i]>='A' && s[i]<='Z') { e=s[i]-'A'-d; if(e<0) s[i]=(e+26)%26+'A'; else s[i]=e%26+'A'; } else s[i]=s[i]-d; } printf("%s",s); printf("\n\n"); } if(c=='q'||c=='Q') return 0; return 0; } 运行结果是: 2.维吉尼亚密码的加解密 源代码: #include "stdafx.h"

实验一 凯撒加密解密

计算机安全基础上机实验报告 学院年级 专业班 学生姓名 学生学号

实验一凯撒加密解密 凯撒密码简介:恺撒密码的替换方法是通过排列明文和密文字母表,密文字母表示通过将 明文字母表向左或向右移动一个固定数目的位置。例如,当偏移量是左移3的时候(解密时 的密钥就是3): 明文字母表:ABCDEFGHIJKLMNOPQRSTUVWXYZ 密文字母表:DEFGHIJKLMNOPQRSTUVWXYZABC 使用时,加密者查找明文字母表中需要加密的消息中的每一个字母所在位置,并且写下密文字母表中对应的字母。需要解密的人则根据事先已知的密钥反过来操作,得到原来的明文。 例如: 明文:THE QUICK BROWN FOX JUMPS OVER THE LAZY DOG 密文:WKH TXLFN EURZQ IRA MXPSV RYHU WKH ODCB GRJ 源代码: #include "kaisa.h" using namespace std; void Kaisa::setI() { cout << "\n请输入加密密码:"; cin >> i; } void Kaisa::jiami() { char a, b, c; cout << "\n请输入明文:\t"; cin >> a; b = char('z' - i%26); c = char('Z' - i%26); cout << "\n密文是:\t"; while(a != '\n') { if((a <= 'z' && a >= 'a') || ( a <= 'Z' && a >='A')) { if((a <= b && a >= 'a') || ( a <= c && a >='A')) cout << char(a + i%26); if(a > c && a <= 'Z') cout << char(a + i%26 - 26); if(a > b && a <= 'z') cout << char(a + i%26 - 26); if(a == ' ') cout << " "; } else

凯撒密码算法

它是一种代换密码。据说恺撒是率先使用加密函的古代将领之一,因此这种加密方法被称为恺撒密码。 凯撒密码作为一种最为古老的对称加密体制,在古罗马的时候都已经很流行,他的基本思想是:通过把字母移动一定的位数来实现加密和解密。明文中的所有字母都在字母表上向后(或向前)按照一个固定数目进行偏移后被替换成密文。例如,当偏移量是3的时候,所有的字母A 将被替换成D,B变成E,以此类推X将变成A,Y变成B,Z变成C。由此可见,位数就是凯撒密码加密和解密的密钥。 1概念 在密码学中,恺撒密码(或称恺撒加密、恺撒变换、变换加密)是一种最简单且最广为人知的加密技术。它是一种替换加密的技术。这个加密方法是以恺撒的名字命名的,当年恺撒曾用此方法与其将军们进行联系。恺撒密码通常被作为其他更复杂的加密方法中的一个步骤,例如维吉尼亚密码。恺撒密码还在现代的ROT13系统中被应用。但是和所有的利用字母表进行替换的加密技术一样,恺撒密码非常容易被破解,而且在实际应用中也无法保证通信安全。 2原理 密码的使用最早可以追溯到古罗马时期,《高卢战记》有描述恺撒曾经使用密码来传递信息,即所谓的“恺撒密码”,它是一种替代密码,通过将字母按顺序推后起3位起到加密作用,如将字母A换作字母D,将字母B换作字母E。因据说恺撒是率先使用加密函的古代将领之一,因此这种加密方法被称为恺撒密码。这是一种简单的加密方法,这种密码的密度是很低的,只需简单地统计字频就可以破译。现今又叫“移位密码”,只不过移动的位数不一定是3位而已。 密码术可以大致分为两种,即移位和替换,当然也有两者结合的更复杂的方法。在移位中字母不变,位置改变;替换中字母改变,位置不变。 将替换密码用于军事用途的第一个文件记载是恺撒著的《高卢记》。恺撒描述了他如何将密信送到正处在被围困、濒临投降的西塞罗。其中罗马字母被替换成希腊字母使得敌人根本无法看懂信息。 苏托尼厄斯在公元二世纪写的《恺撒传》中对恺撒用过的其中一种替换密码作了详细的描写。恺撒只是简单地把信息中的每一个字母用字母表中的该字母后的第三个字母代替。这种密码替换通常叫做恺撒移位密码,或简单的说,恺撒密码。 尽管苏托尼厄斯仅提到三个位置的恺撒移位,但显然从1到25个位置的移位我们都可以使用,因此,为了使密码有更高的安全性,单字母替换密码就出现了。 如: 明码表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 明文T H E F A U L T, D EAR BRUTUS, L I ES N OT I N OUR ST ARS B UT I N OURSELVES.

凯撒密码实验步骤

实验步骤: 本练习将主机A和B作为一组,主机C和D作为一组,主机E和F作为一组。 首先使用“快照X”恢复Windows系统环境。 一.手动完成Kaiser密码 (1)在实验原理部分我们已经了解了Kaiser密码的基本原理,那么请同学们写出当密钥k=3时,对应明文:data security has evolved rapidly的密文:_____________________________。 (2)进入实验平台,单击工具栏中的“工具箱”按钮,打开实验工具箱,在向导区点击“Kaiser密码”。在明文输入区输入明文:data security has evolved rapidly。将密钥k调节到3,查看相应的密文,并与你手动加密的密文进行比较。 请根据密钥验证密文与明文对应关系是否正确。 二.Kaiser加密 (1)本机进入“工具箱”|“加密解密”|“Kaiser密码”,在明文输入区输入明文(明文应为英文),单击“加密”按钮进行加密。 请将明文记录在这里:_____________________________。 (2)调节密钥k的微调按钮或者对照表的移位按钮,选择合适的密钥k值,并记下该密钥k值以用于同组主机的解密。加密工作完成后,单击“导出”按钮将密文默认导出到Kaiser共享文件夹 (D:\Work\Encryption\Kaiser\)中,默认文件名为Kaiser密文.txt。 (3)通知同组主机接收密文,并将密钥k通告给同组主机。 (4)单击“导入”按钮,从共享文件夹中将同组主机的密文导入(即在文件名输入框中填写:\\同组主机IP\Work\Encryption\Kaiser\Kaiser密文.txt)。 (5)调节密钥k的微调按钮或者对照表的移位按钮将k设为同组主机加密时的密钥k值,这时解密已经成功。请将明文写出:_________。

凯撒加密解密实验报告

《C语言课程设计》任务书 所属学期:10-11-2 下达时间:2011年8月28日 完成班级: D软件101 【设计目的】 本课程设计是计算机科学与技术专业重要的实践性环节之一,是在学生学习完《C语言程序设计》课程后进行的一次全面的综合练习。本课程设计的目的和任务:(1)巩固和加深学生对C语言的基本知识的理解和掌握;(2)掌握C语言编程和程序调试的基本技能;(3)利用C语言进行简单软件设计的基本思路和方法;(4)提高运用C语言解决实际问题的能力;(5)掌握书写程序设计说明文档的能力。 【设计内容与任务】 每个学生在教师提供的课程设计题目中任意选择一题,独立完成,题目选定后不可更换。 1、以本班同学的具体数据为背景,设计一个本班同学通讯录。 实现功能: 1) 通讯录编辑(添加、删除)。 2) 按不同的项进行查找。 3) 对已存在的通讯录按不同的项排序。 4) 将通讯录写入文件 5) 从文件读入通讯录 备注:通讯录至少应该有以下数据项:姓名,地址,电话,邮编,E-mail,QQ。 2、设计一个学生成绩排名系统,该系统的主要功能如下: 1) 具备对成绩的管理功能(添加、删除、排序) 2) 具备对成绩的统计功能(最高分,最低分,平均分,及格率等) 3) 具备按学号、姓名、或课程名查询成绩的功能。 备注:成绩记录以下信息:班级,学号,姓名,课程名,成绩(百分制)。可以用能表示学生成绩的结构体数组存储数据。 3、设计一个文件加密/解密程序,主要功能是支持简单的替换加密/解密,支持凯撒加密法(参见百度百科词条:凯撒加密法https://www.sodocs.net/doc/ce16243067.html,/view/4107346.htm)和ROT13加密两种加密方法。 4、设计一个简单的文件压缩/解压缩程序,例如:未压缩前的字符为"aaaccccddddd666666",则压缩以后的字符为:"3a4c5d66"。压缩文件时需要输出压缩比,如20%。 5、设计一个万年历程序。主要功能是能够输出任意年份或月份的日历,程序的输出的月

凯撒密码程序

#include<> char JFjiami(char ch,int n) { while(ch>='A'&&ch<='Z') { n=n%26; return ('A'+(ch-'A'+n)%26); } while(ch>='a'&&ch<='z') { n=n%26; return ('a'+(ch-'a'+n)%26); } while(ch>='0'&&ch<='9') { n=n%10; return ('0'+(ch-'0'+n)%10); } return ch; } char JFjiemi(char ch,int n) { static int k; while(ch>='A'&&ch<='Z') { k=n%26; n=26-k; return ('A'+(ch-'A'+n)%26); } while(ch>='a'&&ch<='z') { k=n%26; n=26-k; return ('a'+(ch-'a'+n)%26); } while(ch>='0'&&ch<='9') { k=n%10; n=10-k; return ('0'+(ch-'0'+n)%10); } return ch; } char CFjiami(char ch,int n) { if(n%2==0) n=n%10+1;

if(n%5==0) n=n+2; else n=n; while(ch>='A'&&ch<='Z') { return ('A'+((ch-'A')*n)%26); } while(ch>='a'&&ch<='z') { return ('a'+((ch-'a')*n)%26); } while(ch>='0'&&ch<='9') { return ('0'+((ch-'0')*n)%10); } return ch; } char CFjiemi(char ch,int n) { int i; int k,h; if(n%2==0) n=n%10+1; else n=n%10; if(n%5==0) n=n+2; else n=n; while(ch>='A'&&ch<='Z') { for(i=0;i<100;i++) { k=((ch-'A')+i*26)%n; if(k==0) h=((ch-'A')+i*26)/n; if(h>=0&&h<=26) return ('A'+h); } } while(ch>='a'&&ch<='z') { for(i=0;i

信息安全古典密码之凯撒密码

《网络攻击与防御》 实验报告 计算机科学与技术学院 计算机系网络教研室制

一、实验目的 (1)编程实现凯撒加密、解密算法,理解密码学基础知识,初步建立密码学思维方式。 (2)通过不断增加凯撒解密难度,理解唯密文解密,提高解密性能。 二、实验环境 操作系统:Windows 10操作系统 软件工具:C++语言编译环境 三、实验内容与实验要求 (1)在允许输入密码条件下,编程实现凯撒密码加解密解密。要求: ①从一文本文件读入英文文章(明文或密文)。 ②对读入内容加密或解密后写入另一文本文件。 (2)在不允许输入密码条件下,编程实现解密凯撒密码加密密文。要求绘制三种情况下解密程序流程图,说明不同解密程序存在的不足。程序需要计算、显示解密使用时间(单位:ms)。 ①已知c1 =wklv lv d errn,求p1。(初级解密) 问:两次使用凯撒,能否正确解密?(字符串用凯撒加密后的结果再用凯撒加密一次。) ②已知c1 =go kbo cdenoxdc,或c1 =zh duh vwxghqwv,求p1。(中级解密) ③已知c1 =rxwvlgh wkh eleoh, wkhvh vla zrugv duh wkh prvw idprxv lq doo wkh olwhudwxuh ri wkh zruog. wkhb zhuh vsrnhq eb kdpohw zkhq kh zdv wklqnlqj dorxg, dqg wkhb duh wkh prvw idprxv zrugv lq vkdnhvshduh ehfdxvh kdpohw zdv vshdnlqj qrw rqob iru klpvhoi exw dovr iru hyhub wklqnlqj pdq dqg zrpdq. wr eh ru qrw wr eh, wr olyh ru qrw wr olyh, wr olyh ulfkob dqg dexqgdqwob dqg hdjhuob, ru wr olyh gxoob dqg phdqob dqg vfdufhob. d sklorvrskhu rqfh zdqwhg wr nqrz zkhwkhu kh zdv dolyh ru qrw, zklfk lv d jrrg txhvwlrq iru hyhubrqh wr sxw wr klpvhoi rffdvlrqdoob. kh dqvzhuhg lw eb vdblqj: "l wklqn, wkhuhiruh dp." ,求p1。(高级解密)对给定较长密文文件进行解密测试,测试结果填入表。 要求密文的内容不少于1000个英文单词,使用凯撒密码加密,加密密码保密。正确率=正确单词数/单词总数,智能程度:优秀(解密结果正确与否不需要人工判断)、一般。 表 四、实验过程与分析 (1)在允许输入密码条件下的实验结果。

相关主题