凯撒密码 C语言实现
合集下载
相关主题
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
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) /*解密*/ {
printf("\nEncrypt is over!\n"); fclose(in); fclose(out); sleep(1); }
if(ch0=='2') {
clrscr(); printf("\nPlease input the infile:");
scanf("%s",infile);/*输入需要解密的文件名*/
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++) {
printf("The Ciphertext is :\n%s\n",C);/*输出密文*/ getch(); return 0; }
1、程序结构化,用函数分别实现
2、对文件的加密,解密输出到文件
#include<stdio.h> #include<conio.h>
void menu()/*菜单,1.加密 2.解密 3.退出*/ {
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 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);
/**凯撒密码实现 要求,将明文字母变成它后面第三个字母,后面的循环到前面! 公式为 f(a)=(f(a)+3)%26
*/ #include <stdio.h> int main() {
char P[100];/*定义明文长度*/ char C[100];/*定义密文长度*/ int K=3,i; printf("Please input Plaintext:\n"); /*输入明文*/ gets(P); /* 接受明文*/
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') {
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; }
getch();
} }
--------------------------------------------------------------------------------------------------------------------------------------------
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);
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; }
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') {
凯撒密码是一种非常古老的加密方法,相传当年凯撒大地行军打仗时为了保证自己的命令不 被敌军知道,就使用这种特殊的方法进行通信,以确保信息传递的安全。他的原理很简单, 说到底就是字母于字母之间的替换。下面让我们看一个简单的例子:“baidu”用凯撒密码法 加密后字符串变为“edlgx”,它的原理是什么呢?把“baidu”中的每一个字母按字母表顺序 向后移 3 位,所得的结果就是刚才我们所看到的密文。
if((in=fopen(infile,"r"))==NULL) {
printf("Can not open the infile!\n"); printf("Press any key to exit!\n"); getch(); exit(0); }
prwenku.baidu.comntf("Please input the key:"); scanf("%d",&n);/*输入解密密码(可以为加密时候的密码)*/
printf("The Ciphertext is:"); printf("%s\n",Encrypt(pwd,key)); }
-----------------------------------------------------------------/*替换法:*/ #include <stdio.h> #include <stdlib.h> #include <string.h> void table(char *keyword) /*筛选密钥(去重复去空格)*/ {
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);
printf("Please input the key:"); scanf("%d",&n);/*输入加密密码*/
printf("Please input the outfile:"); scanf("%s",outfile);/*输入加密后文件的文件名*/
if((out=fopen(outfile,"w"))==NULL) {
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("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); }
/*移位法:*/ #include <stdio.h> #include <stdlib.h> 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';
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); }
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); }
} } }
void newTab(char *keyword) /*生成密钥表*/ {
char ch;
int i; 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++) {
if(*(Plaintext+i)==ch) {
*(Plaintext+i)=*(keyword+j); break; } } } return Plaintext; }
char *Decrypt(char *keyword,char *Plaintext) /*解密*/ {
printf("\nEncrypt is over!\n"); fclose(in); fclose(out); sleep(1); }
if(ch0=='2') {
clrscr(); printf("\nPlease input the infile:");
scanf("%s",infile);/*输入需要解密的文件名*/
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++) {
printf("The Ciphertext is :\n%s\n",C);/*输出密文*/ getch(); return 0; }
1、程序结构化,用函数分别实现
2、对文件的加密,解密输出到文件
#include<stdio.h> #include<conio.h>
void menu()/*菜单,1.加密 2.解密 3.退出*/ {
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 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);
/**凯撒密码实现 要求,将明文字母变成它后面第三个字母,后面的循环到前面! 公式为 f(a)=(f(a)+3)%26
*/ #include <stdio.h> int main() {
char P[100];/*定义明文长度*/ char C[100];/*定义密文长度*/ int K=3,i; printf("Please input Plaintext:\n"); /*输入明文*/ gets(P); /* 接受明文*/
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') {
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; }
getch();
} }
--------------------------------------------------------------------------------------------------------------------------------------------
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);
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; }
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') {
凯撒密码是一种非常古老的加密方法,相传当年凯撒大地行军打仗时为了保证自己的命令不 被敌军知道,就使用这种特殊的方法进行通信,以确保信息传递的安全。他的原理很简单, 说到底就是字母于字母之间的替换。下面让我们看一个简单的例子:“baidu”用凯撒密码法 加密后字符串变为“edlgx”,它的原理是什么呢?把“baidu”中的每一个字母按字母表顺序 向后移 3 位,所得的结果就是刚才我们所看到的密文。
if((in=fopen(infile,"r"))==NULL) {
printf("Can not open the infile!\n"); printf("Press any key to exit!\n"); getch(); exit(0); }
prwenku.baidu.comntf("Please input the key:"); scanf("%d",&n);/*输入解密密码(可以为加密时候的密码)*/
printf("The Ciphertext is:"); printf("%s\n",Encrypt(pwd,key)); }
-----------------------------------------------------------------/*替换法:*/ #include <stdio.h> #include <stdlib.h> #include <string.h> void table(char *keyword) /*筛选密钥(去重复去空格)*/ {
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);
printf("Please input the key:"); scanf("%d",&n);/*输入加密密码*/
printf("Please input the outfile:"); scanf("%s",outfile);/*输入加密后文件的文件名*/
if((out=fopen(outfile,"w"))==NULL) {
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("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); }
/*移位法:*/ #include <stdio.h> #include <stdlib.h> 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';
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); }
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); }
} } }
void newTab(char *keyword) /*生成密钥表*/ {
char ch;
int i; 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++) {