使用C语言实现古典加密

合集下载

凯撒密码--C语言实现

凯撒密码--C语言实现

凯撒密码是一种非常古老的加密方法,相传当年凯撒大地行军打仗时为了保证自己的命令不被敌军知道,就使用这种特殊的方法进行通信,以确保信息传递的安全。

他的原理很简单,说到底就是字母于字母之间的替换。

下面让我们看一个简单的例子:“baidu”用凯撒密码法加密后字符串变为“edlgx”,它的原理是什么呢?把“baidu”中的每一个字母按字母表顺序向后移3位,所得的结果就是刚才我们所看到的密文。

/**凯撒密码实现要求,将明文字母变成它后面第三个字母,后面的循环到前面!公式为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); /* 接受明文*/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<stdio.h>#include<conio.h>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 <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';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 <stdio.h>#include <stdlib.h>#include <string.h>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)); /*解密输出*/}。

四种古典密码的C++实现(3)-----Playfair密码

四种古典密码的C++实现(3)-----Playfair密码

四种古典密码的C++实现(3)-----Playfair密码 1//Playfair密码2/*理解算法最重要,最好⾃⼰动⼿实现试试看,可以使⽤MFC写⼀个简单的交互界⾯*/3 #include<iostream>4 #include<cstring>56using namespace std;7void encrypt()8 {9const int N=100;10char letters[26]="ABCDEFGHIKLMNOPQRSTUVWXYZ";//⽤于填充矩阵11int flag[25]={0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0};//字母是否已在矩阵中,与letters数组对应12char ch[5][5];//5X5矩阵13char ch1[N];//密钥14char ch2[N];//明⽂15char ch4;//⽆关字符16int len='a'-'A';17 cout<<"输⼊密钥:";18 cin>>ch1;19int flg=1;20while(flg==1)21 {22for(int i=0;i<strlen(ch1);i++)//把所输⼊的密钥转化为⼤写字母23 {24if(ch1[i]>'z'||ch1[i]<'a')25 {26 cout<<"请重新选择操作:"<<endl;27 flg=0;break;28 }29else30 ch1[i]=ch1[i]-len;31 }32if(flg==1)33 { for(int i=0;i<strlen(ch1);i++)//把密钥中的J都变为I34 {35if(ch1[i]=='J')ch1[i]='I';36 }37int i=0;int j=0;38//把密钥中的字母填⼊到矩阵中,并把该字母标记为已⽤39for(int k=0;k<strlen(ch1);k++)40 {41for(int t=0;t<25;t++)42 {43if(ch1[k]==letters[t]&&flag[t]==0)44 {45 ch[i][j]=letters[t];46 flag[t]=1;47if(j<4)j++;48else {i++;j=0;}49 }50 }51 }52for( int k=0;k<25;k++)//按字母表顺序把未⽤字母依次填⼊到矩阵中53 {54if(flag[k]==0)55 {56 ch[i][j]=letters[k];57 flag[k]=1;58if(j<4)j++;59else{i++;j=0;}60 }61 }62 cout<<"密钥填充后的矩阵为: "<<endl;63for(i=0;i<5;i++)64for(j=0;j<5;j++)65 {66 cout<<ch[i][j];67 cout<<"";68if(j==4)69 cout<<endl;70 }71 cout<<endl;72 cout<<"请输⼊明⽂(请输⼊英⽂字符):";73 cin>>ch2;74 cout<<"输⼊⼀个⽆关字符:";75 cin>>ch4;76if(ch4>='a')77 ch4=ch4-len;78for(int k=0;k<strlen(ch2);k++)//把所输⼊的明⽂转化为⼤写字母79 {80if(ch2[k]>='a')81 ch2[k]=ch2[k]-len;82 }83for(int k=0;k<strlen(ch2);k++)//把明⽂中的J都变为I84 {85if(ch2[k]=='J')86 ch2[k]='I';87 }88//为明⽂添加必要的⽆关字符以防⽌同⼀组的两个字符相同89for( int k=0;k<strlen(ch2);k+=2)90 {91if(ch2[k]==ch2[k+1])92 {93for(int t=strlen(ch2);t>k;t--)94 ch2[t+1]=ch2[t];95 ch2[k+1]=ch4;96 }97 }98//若明⽂有奇数个字符,则添加⼀个⽆关字符以凑够偶数个99if(strlen(ch2)%2!=0)100 {101 ch2[strlen(ch2)+1]=ch2[strlen(ch2)];//字符串结尾赋'\0'102 ch2[strlen(ch2)]=ch4;//明⽂串尾插⼊⽆关字符103 }104 cout<<"经过处理后的明⽂为:";105for(int k=0;k<strlen(ch2);k+=2)106 cout<<ch2[k]<<ch2[k+1]<<"";107 cout<<endl;108 cout<<"其最终长度为:"<<strlen(ch2)<<endl;109//////////////////明⽂输⼊并整理完毕///////////////////////////////110for(int k=0;k<strlen(ch2);k+=2)111 {112int m1,m2,n1,n2;113for(m1=0;m1<=4;m1++)114 {for(n1=0;n1<=4;n1++)115 {116if(ch2[k]==ch[m1][n1])break;117 }118if(ch2[k]==ch[m1][n1])break;119 }120for(m2=0;m2<=4;m2++)121 {122for(n2=0;n2<=4;n2++)123 {124if(ch2[k+1]==ch[m2][n2])break;125 }126if(ch2[k+1]==ch[m2][n2])break;127 }128 m1=m1%5;129 m2=m2%5;130if(n1>4){n1=n1%5;m1=m1+1;}131if(n2>4){n2=n2%5;m2=m2+1;}132if(m1==m2)133 {134 ch2[k]=ch[m1][(n1+1)%5];135 ch2[k+1]=ch[m2][(n2+1)%5];136 }137else138 {139if(n1==n2)140 {141 ch2[k]=ch[(m1+1)%5][n1];142 ch2[k+1]=ch[(m2+1)%5][n2];143 }144else145 {ch2[k]=ch[m1][n2];146 ch2[k+1]=ch[m2][n1];147 }148 }149 }150 cout<<"加密后所得到的密⽂是:";151for(int k=0;k<strlen(ch2);k+=2)152 cout<<ch2[k]<<ch2[k+1]<<"";153 cout<<endl;154 }else break;155 }156157 }158159//解密算法160void decrypt()161 {162const int N=100;163char letters[26]="ABCDEFGHIKLMNOPQRSTUVWXYZ";//⽤于填充矩阵164int flag[25]={0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0};165//标记字母是否已在矩阵中,与letters数组对应166char ch[5][5];//5X5矩阵167char ch1[N];//密钥168char ch2[N];//密⽂169int len='a'-'A';170int flg=1;171 cout<<"输⼊密钥:";172 cin>>ch1;173while(flg==1)174 {175for(int i=0;i<strlen(ch1);i++)//把所输⼊的密钥转化为⼤写字母176 {if(ch1[i]>'z'||ch1[i]<'a')177 {178 cout<<"请重新选择操作:"<<endl;179 flg=0;break;180 }181else182 ch1[i]=ch1[i]-len;183 }184if(flg==1)185 { for(int i=0;i<strlen(ch1);i++)//把密钥中的J都变为I186 {187if(ch1[i]=='J')ch1[i]='I';188 }189int i=0;int j=0;190//把密钥中的字母填⼊到矩阵中,并把该字母标记为已⽤191for(int k=0;k<strlen(ch1);k++)192 {193for( int t=0;t<25;t++)194 {195if(ch1[k]==letters[t]&&flag[t]==0)196 {197 ch[i][j]=letters[t];198 flag[t]=1;199if(j<4)j++;200else {i++;j=0;}201 }202 }203 }204for( int k=0;k<25;k++)//按字母表顺序把未⽤字母依次填⼊到矩阵中205 {206if(flag[k]==0)207 {208 ch[i][j]=letters[k];209 flag[k]=1;210if(j<4)j++;211else{i++;j=0;}212 }213 }214 cout<<"密钥填充后的矩阵为: "<<endl;215for(i=0;i<5;i++)216217for(j=0;j<5;j++)218 {219 cout<<ch[i][j];220 cout<<"";221if(j==4)222 cout<<endl;223 }224 cout<<endl;225/////////////////////矩阵⽣成完毕////////////////////////////226int f=0;227do{228 cout<<"请输⼊密⽂(英⽂字符):";229 cin>>ch2;230for(int k=0;k<strlen(ch2);k++)//把所输⼊的密⽂转化为⼤写字母231 {232if(ch2[k]>='a')233 ch2[k]=ch2[k]-len;234 }235for( int k=0;k<strlen(ch2);k++)//把密⽂中的J都变为I236 {237if(ch2[k]=='J')ch2[k]='I';238 }239for( int k=0;k<strlen(ch2);k+=2)240 {241if(ch2[k]==ch2[k+1])242 {243 cout<<"同⼀分组中不能出现相同字符!请重新输⼊。

AESECB加密算法C语言代码实现

AESECB加密算法C语言代码实现

AESECB加密算法C语言代码实现要实现AESECB加密算法的C语言代码,需要先了解AES算法的基本原理和步骤。

以下是一个使用C语言实现AESECB加密算法的示例代码:```c#include <stdio.h>#include <stdlib.h>#include <string.h>#include <openssl/aes.h>//定义密钥长度#define KEY_LENGTH 16//ECBAES加密函数void AESEncrypt_ECB(const unsigned char* plainText, int plainTextLength, unsigned char* cipherText,const unsigned char* key)//创建AES密钥结构体AES_KEY aesKey;//设置加密密码AES_set_encrypt_key(key, KEY_LENGTH * 8, &aesKey);//加密数据AES_ecb_encrypt(plainText, cipherText, &aesKey, AES_ENCRYPT);//ECBAES解密函数void AESDecrypt_ECB(const unsigned char* cipherText, int cipherTextLength, unsigned char* plainText,const unsigned char* key)//创建AES密钥结构体AES_KEY aesKey;//设置解密密码AES_set_decrypt_key(key, KEY_LENGTH * 8, &aesKey);//解密数据AES_ecb_encrypt(cipherText, plainText, &aesKey, AES_DECRYPT);int mai//指定原始明文和密钥unsigned char plainText[] = "Hello, World!";unsigned char key[] = "secretkey";//计算明文长度int plainTextLength = strlen(plainText);//计算加密后的数据长度int cipherTextLength = ((plainTextLength / KEY_LENGTH) + 1) * KEY_LENGTH;//分配加密后数据的内存unsigned char* cipherText = (unsignedchar*)malloc(cipherTextLength);//加密数据AESEncrypt_ECB(plainText, plainTextLength, cipherText, key);//打印加密后的结果printf("Cipher text: ");for (int i = 0; i < cipherTextLength; i++)printf("%02x ", cipherText[i]);}printf("\n");//分配解密后数据的内存unsigned char* decryptedText = (unsignedchar*)malloc(cipherTextLength);//解密数据AESDecrypt_ECB(cipherText, cipherTextLength, decryptedText, key);//打印解密后的结果printf("Decrypted text: %s\n", decryptedText);//释放已分配的内存free(cipherText);free(decryptedText);return 0;```上述代码使用了OpenSSL库提供的AES函数来实现ECB模式的AES加密和解密操作。

单表古典密码的加密运算精品文档7页

单表古典密码的加密运算精品文档7页

单表古典密码的加密运算实验目的:1. 熟练掌握单表古典密码加密算法原理及实现;2. 掌握单表古典密码加密算法的应用;实验内容:1、写出单表古典密码的加法加密运算的算法、程序设计;2、写出意表古典密码的乘法加密运算的算法、程序设计;3、输入模q(=12)及加密密钥k(=5)对下列明文进行加法加密和乘法加密:A graph is finite if both its vertex set and edge set are finite.In this book we study only finite graphs, and so the term ‘graph’always means ‘finite graph’.(注:标点符号及空格也算一个符号,忽略大小)4、求出相对应于上述q和k的解密密钥。

实验结果:1.(1)写出单表古典密码的加法加密运算的算法设X=Y=Z q,K=Z q。

对任意m∈X,k∈K,密文q=k(,c K k+=)mm mod)(加法密码的密钥量为q。

Step1:确定k和q的值;Step2:输入相应的密文;Step3:作变换 c=(m+k) mod q,字母用ASCII码变为数字后计算;Step4:得到相对应的明文;Step5:逐一输出明文;(2)单表古典密码的加法加密运算的程序设计如下:#include<iostream.h>void main()int jiami(int q,int k,int i);char m[100],c[100];int i,j,q,k;cout<<"输入模q:";cin>>q;cout<<"输入密钥k:";cin>>k;cout<<"输入"<<q<<"个明文:"<<endl;for(i=0;i<q;i++)cin>>m[i];for(i=0;i<q;i++)j=jiami(q,k,i);c[i]=m[j];cout<<"加密后的密文为:"<<endl;for(i=0;i<q;i++)cout<<m[i];cout<<endl;int jiami(int q,int k,int i)return (i+k)%q;单表古典密码的加法加密运算运行结果如下:2.(1)写出意表古典密码的乘法加密运算的算法:设X=Y=Z q,K=Z*q。

实验一古典加密算法的实现

实验一古典加密算法的实现

凯撒密码映射表
明 A B C D E 文 密 D E F G H 文 F G H I J K L M I J K L M N O P
明 N O P Q R 文
S T U V W X Y Z
密 Q R S T U V W X Y Z撒密码的算法,对”Thisisanew term”进行加密 • 要求:(1)
要求
• 以密钥为:m*n=3 * 4,以及f= ((1234)(2413))对” ENGINEERING” 进行: • 要求:(1)
– 输入: ENGINEERING – 输出:(密文)
• (2)
– 输入:密文 – 输出: ENGINEERING
实验一 古典加密算法的实现
• 实验目的:
– 通过编程实现凯撒密码算法和矩阵换位密码算 法,加深对古典密码体制的了解。
• 实验原理:
– 古典加密算法的实验原理(详见下文ppt)
• 实验环境:
– 运行Windows操作系统的PC,TC编译环境
(1)凯撒密码加密算法
• 典型的单表代替密码是凯撒密码。 • 凯撒密码是最古老的代替密码,以英文26个字母 为例,它用D表示A,用E表示B,用F表示C,…, 用C表示Z,即:密文字母是明文字母后面的第三 个位置上的字母。这种映射关系表示为如下函数: • F(a)=(a十k)mod n • 其中:a表示明文字母,n为字符集中字母 个数,k=3为密钥。(移位密码、加法密码)
– 输入:Thisisanewterm – 输出:(密文)
• (2)
– 输入:密文 – 输出:Thisisanewterm
思考题:矩阵换位密码算法的实现
• 把明文中的字母按给定的顺序安排在一矩阵中,然 后用另一种顺序选出矩阵的字母来产生密文。 • 例:明文ENGINEERING按行排在3 × 4矩阵中,最 后一行不全用ABC…填充。 • E N G I 给置换f=((1234)(2413)) NIEG • N E E R ERNE • I NG A NAIG • 得到密文:NIEGERNENAIG • 密钥为:m*n=3 * 4,以及f= ((1234)(2413)) • 即:k=(m * n,f)

C++实现古典密码学

C++实现古典密码学

实验一实现一个多表古典加密和解密程序实验目的:掌握多表古典加密方法。

实验要求:能用高级语言实现古典加密方法。

实验内容:多表古典加密方法主要有Playfair体制、Vigenere体制、Beaufor 体制、Vernam体制和Hill体制,用高级语言实现其中一种体制的加密和解密算法。

内容:Vigenere加密解密:#include <iostream>#include <string>using namespace std;const int N=26;charv[N][N]={{'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 number(char x)//把行号字母对应到数字{char y='a';for(int i=0;i<N;i++){if(x==(y+i)) return i;}}void encryption(string m,string k)//加密{cout<<"明文:";cin>>m;cout<<"密钥:";cin>>k;int mlen,klen;mlen=m.length();klen=k.length();char *p,*q,*t;//明文,初始密钥,密钥串。

C语言编程练习题之古典密码之旅

C语言编程练习题之古典密码之旅
H A P Y N E W R B C D F G I J K L M O Q S T U V X Z 按照这个表 明文:ILoveHuiwen 密文:BFjtnRsbuni
请编写一个程序,可以通过用户输入密码(一个字符串)生成密码表 (即上面的那个表),然后可以对用户输入的明文进行加密,对输入 的密文进行解密
第三题(Playfair密码)(续):
解密描述:Playfair解密算法首先将密钥填写在一个5*5的矩阵中(去出重复字母 和字母j),矩阵中其它未用到的字母按顺序填在矩阵剩余位置中,根据替换矩 阵由密文得到明文。 对密文解密规则如下: 1 若c1 c2在同一行,对应明文p1 p2分别是紧靠c1 c2 左端的字母。其中最后 一列被看做是第一列的左方。 2 若c1 c2在同一列,对应明文p1 p2分别是紧靠c1 c2 上方的字母。其中最后 一行被看做是第一行的上方。 3 若c1 c2不在同一行,不在同一列,则p1 p2是由c1 c2确定的矩形的其他两 角的字母。 其实就是反其道而行之。
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
按照这个表 明文:ILoveHuiwen 密文:LOryhKxlzhq
请编写一个程序,可以通过用户输入密码(一个小于26的正整数)生 成密码表(即上面的那个表),然后可以对用户输入的明文进行加密, 对输入的密文进行解密
第三题(Playfair密码):
前面两题的密码表都是一维的,一维密码强度并不够,因此出现了二维密码。 Playfair密码是二维密码的一个典型例子。Playfair密码出现于1854年,它依据一 个5*5的正方形组成的密码表来编写,密码表里排列有25个字母。如果一种语言 字母超过25个,可以去掉使用频率最少的一个。如,法语一般去掉w或k,德语 则是把i和j合起来当成一个字母看待。英语中z使用最少,可以去掉它。 加密描述:第一步是编制密码表。在这个5*5的密码表中,共有5行5列字母。第 一列(或第一行)是密钥,其余按照字母顺序。密钥是一个单词或词组,若有重 复字母,可将后面重复的字母去掉。当然也要把使用频率最少的字母去掉。如: 密钥是Live and learn,去掉后则为liveandr。如果密钥过长可占用第二列或行。

信息安全 实验一 古典密码算法C语言

信息安全 实验一 古典密码算法C语言

信息安全实验报告课程名称: _ 专业:计算机科学与技术 _2010_级_02班实验编号:实验项目_ 指导教师_ _姓名:闫斌学号: 2010012854 实验成绩:___实验一古典密码算法实验名称:古典密码算法实验类型: 设计性实验学时:4适用对象: 信息安全1.实验原理古典密码算法历史上曾被广泛应用,大都比较简单,使用手工和机械操作来实现加密和解密。

它的主要应用对象是文字信息,利用密码算法实现文字信息的加密和解密。

下面介绍两种常见的具有代表性的古典密码算法,以帮助读者对密码算法建立一个初步的印象。

2.实验目的通过变成实现替代密码算法和置换密码算法,加深对古典密码体质的了解,为深入学习密码学奠定基础。

3.实验环境运行windows或linux操作系统的pc机,具有gcc(linux)、VC(Windows)等C语言编译环境。

4.实验内容4.1替代密码算法4.1.1根据实验远离部分对替代密码算法的介绍,创建明文信息,并选择一个密钥k,编写替代密码算法的实现程序,实现加密和解密操作。

替代密码包括多种类型,如单表替代密码、多明码替代密码、多字母替代密码、多表替代密码等。

4.1.2替代密码算法的远离是使用替代法进行加密,就是将明文的字符用其他字符替代后形成密文。

例如字母a、b、c、d,用D、E、F、G做对应替换后形成密文。

4.1.3 代码#include<stdio.h>#include<math.h>#include<string.h>#define N 500int main(){/*--------------------------------*/int i=0,k,m,n,l;char str1[N],str2[N]; /*C=M+K...K is key...*/clrscr();/*--------------------------------*/printf("This is a code password program......\n");printf("Please input proclaimed in writing(M)::\n");gets(str1);/*输入要加密的明文M*/printf("Please input the key(K)(int)::\n");scanf("%d",&k);/*输入密钥K*/m=strlen(str1);/*测试明文的长度*/printf("The M length is %d\n",m);printf("\n *\n *\n *\n***\n *\n");printf("ciphertext(C) is ::\n\n");for(i=0;i<m;i++)/*加密的过程*/{n=(int)str1[i];/*将字符转换成ASCII*/if(str1[i]==' ')/*如果字符串中出现空格返回空格*/{printf(" ");str2[i]=str1[i];}else if(n>96&&n<123)/*对小写进行加密*/{n=(n-97+k)%26;if(n<0)n=26+n;l=(char)(n+97);printf("%c",l);str2[i]=l;}else if(n>64&&n<91)/*对大写进行加密*/{n=(n-65+k)%26;if(n<0)n=26+n;l=(char)(n+97);printf("%c",l);str2[i]=l;}}str2[i]='\0';/*--------------------------------*/printf("\n\nThe C length is %d",strlen(str2));printf("\n\n *\n *\n *\n***\n *\n");printf("When the ciphertext is '%s',\nThe password program is...::\n\n",str2);m=strlen(str2);for(i=0;i<m;i++)/*解密过程*/{n=(int)str2[i];/*将字符转换成ASCII*/if(str2[i]==' ')/*如果是空格,返回的也是空格*/{printf(" ");}else if(n>96&&n<123)/*对小写进行解密*/{n=(n-97-k)%26;if(n<0)n=26+n;l=(char)(n+97);printf("%c",l);}else if(n>64&&n<91)/*对大写进行解密*/{n=(n-65-k)%26;if(n<0)n=26+n;l=(char)(n+97);printf("%c",l);}}str1[i]='\0';getch();return 0;}4.1.4 运行结果4.2 置换密码4.2.1根据实验原理部分对置换密码算法的介绍,自己创建明文信息,并选择一个密钥,编写置换密码算法的实现程序,实现加密和解密操作。

古典密码学(替换、置换加密)C程序

古典密码学(替换、置换加密)C程序

替换:#include <stdio.h>int encrypt( ){char STR[27]= {'X','N','Y','A','H','P','O','G','Z','Q','W','B','T','S','F','L','R','C','V','M','U','E','K','J','D','I'};char str[27]={'d','l','r','y','v','o','h','e','z','x','w','p','t','b','g','f','j','q','n','m','u','s','k','a','c','i'};int x,i=0;char code[80],string[80];printf("请输入你的明文(80字符内的小写字符串):");scanf("%s",string);printf("The code is:");for(i=0;string[i];i++){x=string[i]-97;code[i]=STR[x];printf("%c",STR[x]);}printf("\n");return 0;}int decrypt( ){char STR[27]= {'X','N','Y','A','H','P','O','G','Z','Q','W','B','T','S','F','L','R','C','V','M','U','E','K','J','D','I'};char str[27]={'d','l','r','y','v','o','h','e','z','x','w','p','t','b','g','f','j','q','n','m','u','s','k','a','c','i'};int x,i=0;char decode[80],STRING[80];printf("请输入你的密文(80字符内的大写字符串):");scanf("%s",STRING);printf("The decode is:");for(i=0;STRING[i];i++){x=STRING[i]-65;decode[i]=str[x];printf("%c",str[x]);}printf("\n");return 0;}int main(){char STR[27]= {'X','N','Y','A','H','P','O','G','Z','Q','W','B','T','S','F','L','R','C','V','M','U','E','K','J','D','I'};char str[27]={'d','l','r','y','v','o','h','e','z','x','w','p','t','b','g','f','j','q','n','m','u','s','k','a','c','i'};int t,x,y=0,i=0;char code[80],string[80];char decode[80],STRING[80];printf("加密请输入1,解密请输入0:");scanf("%d",&t);printf("\n");if(t==1){encrypt();for(i=0;code[i];i++){x=code[i]-65;decode[i]=str[x];if(decode[i]==string[i])y++;else y=y;}if(y==i-1)printf("CRYPT_OK!\n");else printf("CRYPT_ERROR!\n");}else if(t==0){decrypt();for(i=0;decode[i];i++){x=decode[i]-65;code[i]=STR[x];if(code[i]==STRING[i])y++;else y=y;}if(y==i-125)printf("CRYPT_OK!\n");else printf("CRYPT_ERROR!\n");}elseprintf("ERROR!\n");return 0;}置换:#include<stdio.h>#include<string.h>#include<stdlib.h>char *encrypt(char *str,int n){int i,j,k,l,d;char *c,*s1,*c1;l=strlen(str);if((d=l%n)!=0) l=l+n-d;if((s1=(char *)malloc(l*sizeof(char)+1))==NULL) {printf("Memory error!\n");exit(l);}if((c=(char *)malloc(l*sizeof(char)+1))==NULL){printf("Memory error!\n");exit(l);}c1=c;strcpy(s1,str);for(i=strlen(str);i<l;i++)s1[i]=32;s1[l]='\0';for(k=0;k<n;k++){for(j=0;j<l/n;j++){*c1=s1[k+j*n];c1++;}}*c1='\0';free(s1);return c;}char *decrypt(char *str,int n){int i,j,k,l,d;char *c,*s1,*c1;l=strlen(str);if((d=l%n)!=0) l=l+n-d;n=l/n;if((s1=(char *)malloc(l*sizeof(char)+1))==NULL) {printf("Memory error!\n");exit(l);}if((c=(char *)malloc(l*sizeof(char)+1))==NULL){printf("Memory error!\n");getch();exit(l);}c1=c;strcpy(s1,str);for(i=strlen(str);i<l;i++)s1[i]=32;s1[l]='\0';for(k=0;k<n;k++){for(j=0;j<l/n;j++){*c1=s1[k+j*n];c1++;}}while(*(--c1)==32);c1++;*c1='\0';free(s1);return c;}int main(){int n,t,i=0,y=0;char str[80];char *c,*s;printf("加密请输入1,解密请输入0:");scanf("%d",&t);if(t==1){printf("请输入明文:");scanf("%s",str);printf("请输入密钥:n=");scanf("%d",&n);c=encrypt(str,n);printf("加密后的密文c=%s$\n",c);s=decrypt(c,n);for(i=0;str[i];i++){if(str[i]==s[i])y++;else y=y;}//printf("%d%d",i,y);if(y==i)printf("CRYPT_OK!\n");else printf("CRYPT_ERROR!\n");}else if(t==0){printf("请输入密文:");scanf("%s",str);printf("请输入密钥:n=");scanf("%d",&n);c=decrypt(str,n);printf("解密后的明文c=%s$\n",c);s=encrypt(c,n);for(i=0;str[i];i++){if(str[i]==s[i])y++;else y=y;}if(y==i)printf("CRYPT_OK!\n");else printf("CRYPT_ERROR!\n");}else printf("ERROR!");return 0;}。

古典密码之仿射密码

古典密码之仿射密码

古典密码之仿射密码熟练掌握多表古典密码仿射密码加密算法原理及实现根据仿射密码及其加解密算法,创建⼀个明⽂信息,再确定k1,k2,编写实现程序,实现加密和解密操作。

实验流程图:找到桌⾯上的Microsoft Visual C++ 6.0,双击打开。

新建⼀个C++ Source File,⽂件名为fangshe。

将下⾯的代码输⼊。

图4#include#include#includeint gcd(int a, int b) /*辗转相除法求a,b的最⼤公因数*/{int k=0;do{k=a%b;a=b;b=k;}while(k!=0);return a;}int Ni(int a, int b) /*求a相对于b的逆*/{int i=0;while(a*(++i)%b!=1);return i;}void Affine() /*仿射密码*/{char c[100];int length, i=0, ka=0, kb=0;system('cls');printf('********仿射密码*********\n请输⼊最初的明⽂: '); gets(c);length = strlen(c);printf('请输⼊密钥(两数字):');scanf('%d%d', &ka, &kb);getchar();while(gcd(ka,26)!=1){printf('密钥输⼊错误,请重新输⼊');scanf('%d%d', &ka, &kb);getchar();}for(i=0; i{if(c[i]>96&&c[i]<>c[i]=(ka*(c[i]-97)+kb)%26+97;else if(c[i]>64&&c[i]<>c[i]=(ka*(c[i]-65)+kb)%26+65;}printf('\n密⽂为:\n%s\n', c);printf('按任何键返回……');getch();}void exAffine() /*仿射解密*/{char c[100];int length, i=0, ka=0, kb=0, tmp;system('cls');printf('********仿射密码********\n请输⼊最初的密⽂:'); gets(c);length = strlen(c);printf('请输⼊密钥(两数字): '); scanf('%d%d', &ka, &kb); getchar();while(gcd(ka,26)!=1){printf('密钥输⼊错误,请重新输⼊'); scanf('%d%d', &ka, &kb); getchar();}for(i=0; i{if(c[i]>64&&c[i]<>{tmp= Ni(ka, 26)*((c[i]-65)-kb);if(tmp<>c[i]= tmp%26+26+65;elsec[i]= tmp%26+65;}else if(c[i]>96&&c[i]<>{tmp= Ni(ka, 26)*((c[i]-97)-kb);if(tmp<>c[i]= tmp%26+26+97;elsec[i]= tmp%26+97;}}printf('\n明⽂为:\n%s\n', c);printf('按任何键返回……');getch();}int main(){char i= '0';printf('********请按1~3选择:********\n');printf('1.仿射加密\n2.仿射解密\n3.退出\n');i= getch();while(i!='3'){if(i=='1')Affine();else if(i=='2')exAffine();i=getch();}return 0;}Compile和Build之后发现没有错误,这个程序是正确的,然后点击F5运⾏。

应用密码学第2章古典密码体制参考答案

应用密码学第2章古典密码体制参考答案

第2章 古典密码体制1.当k=5,b=3时,用仿射密码加密这些字符:WO SHI XUESHENG 解:加密公式:c=e(p)=5p+3(mod26)首先转化把这些字母转换成数字:22,14,18,7,8,23,20,4,18,7,4,13,6 然后加密;)26(mod 716231215232514171215219)26(mod 3333333333333613471842023871814225⎥⎥⎥⎥⎥⎥⎥⎥⎥⎥⎥⎥⎥⎥⎥⎥⎥⎦⎤⎢⎢⎢⎢⎢⎢⎢⎢⎢⎢⎢⎢⎢⎢⎢⎢⎢⎣⎡=⎥⎥⎥⎥⎥⎥⎥⎥⎥⎥⎥⎥⎥⎥⎥⎥⎥⎦⎤⎢⎢⎢⎢⎢⎢⎢⎢⎢⎢⎢⎢⎢⎢⎢⎢⎢⎣⎡=⎥⎥⎥⎥⎥⎥⎥⎥⎥⎥⎥⎥⎥⎥⎥⎥⎥⎦⎤⎢⎢⎢⎢⎢⎢⎢⎢⎢⎢⎢⎢⎢⎢⎢⎢⎢⎣⎡+⎥⎥⎥⎥⎥⎥⎥⎥⎥⎥⎥⎥⎥⎥⎥⎥⎥⎦⎤⎢⎢⎢⎢⎢⎢⎢⎢⎢⎢⎢⎢⎢⎢⎢⎢⎢⎣⎡H Q X M P X Z O R M P V G 所以,加密后为:GV PMR OZXPMXQH 。

2.使用Vigenere 方案,给出密文:ZICVTWQNGRZGVTW A VZHCQYGLMGJ ,找出对应下列明文的密钥:W earediscoveredsaveyourself 。

解:明文:W e a r e d i s c o v e r e d s a v e y o u r s e l f 密文:Z IC VTWQNGR ZGVTWAVZH CQ YGLMGJ 将字幕转化成数字,再计算。

结果密钥为:3 4 2 4 15 19 8 21 43.分析Vigenere 密码体制的安全性,并编程实现Vigenere 密码算法。

解:Vigenere 密码的强度在于对每个明文字母有多个密文字母对应,因此该字母的频率信息是模糊的。

实际上,维吉尼亚(Vigenere )密码是一种多表加密算法,在密文的不同位置出现的字符通常不是以同样的方式加密的,但它是一种周期密码,如果两个同样的字符出现的间隔固定,并且为密钥长度的倍数,则它们将以同样的方法进行加密。

古典密码源代码shi

古典密码源代码shi

1:移位密码#include <stdio.h>#include <stdlib.h>void jiami(void);void jiemi(void);int main(void){int n;loop:printf("1:加密\n2:解密\n0:退出\n\n");scanf("%d",&n);getchar();if(n==1){jiami();goto loop;}if(n==2){jiemi();goto loop;}elseexit(0);return 0;}void jiami(void){int a[26],i,j,k,m,n;char b[100]={0},c[100]={0};for(i=97;i<123;i++)a[i-97]=i;printf("请输入明文\n");gets(b);printf("请输入密钥\n");scanf("%d",&k);printf("加密后:");for(j=0;b[j]!='\0';j++){if(b[j]!=' '){m=(b[j]+k-97)%26;printf("%c",a[m]);}}printf("\n");}void jiemi(void){int a[26],i,j,k,m,n;char b[100]={0},c[100]={0};for(i=97;i<123;i++)a[i-97]=i;printf("请输入密文\n");gets(c);printf("请输入密钥\n");scanf("%d",&k);printf("解密后:");for(i=0;c[i]!='\0';i++){if(c[i]-k-97<0)m=(c[i]-k-71)%26;elsem=(c[i]-k-97)%26;printf("%c",a[m]);}printf("\n");}2:仿射密码#include <ctype.h>#include<stdio.h>#include<stdlib.h>void jiami(void);void jiemi(void);int main(void){int oo;loop:printf("加密请输入---- 1\n");printf("解密请输入---- 2\n");printf("退出请输入---- 0\n\n");printf("请输入您的选择:");scanf("%d",&oo);putchar('\n');switch(oo){case 1: jiami();putchar('\n');goto loop;case 2: jiemi();putchar('\n');goto loop;default: exit(0);}return 0;}void jiami(void){char answer,message[1000],ecry[1000];int i,j,k1,k2,k=0,e,r=0;//输入密钥printf("请输入26以内非13的奇数k1以及26以内的任一整数k2\n");scanf("%d%d",&k1,&k2);//输入信息注:信息以'#'结尾printf("请输入要加密的信息,注:信息以'#'结尾\n");for(i=0;(message[i]=getchar())!='#';i++)message[i+1]='\0';message[i]='\0';//加密信息,两种方式(是否保留原非字母字符)printf("加密时是否要保留原信息非字母字符(y/n):");getchar();answer=getchar();if(answer == 'y'){for(i=0;message[i]!='\0';i++){if(!isalpha(message[i])){ecry[i]=message[i];continue;}if(islower(message[i]))e=message[i]-'a';elsee=message[i]-'A';ecry[i] = (e*k1+k2) % 26 + 'a';ecry[i+1]='\0';}}else{for(j=0;message[j]!='\0';j++){if(!isalpha(message[j]))continue;if(islower(message[j]))e=message[j]-'a';elsee=message[j]-'A';ecry[k++] = (e*k1+k2) % 26 + 'a';ecry[k]='\0';}}//输出原信息与加密的信息printf("原信息为:%s",message);putchar('\n');printf("加密后的信息为:%c%s",(answer=='y')? '\0':'\n',ecry);putchar('\n');}void jiemi(void){char answer,ecry[1000],recover[1000];int i,j,k1,k2,kt,k=0,e,r=0;printf("请输入密钥\n");scanf("%d%d",&k1,&k2);getchar();printf("请输入加密后的信息,注:信息以'#'结尾\n");for(i=0;(ecry[i]=getchar())!='#';i++)ecry[i+1]='\0';ecry[i]='\0';getchar();//解密for(i=1;(k1 * i - 1) % 26 != 0;i++);kt = i;printf("加密时是否有保留原信息非字母字符(y/n):"); getchar();answer=getchar();if(answer=='y'){for(i=0;ecry[i]!='\0';i++){if(!isalpha(ecry[i])){recover[i]=ecry[i];continue;}else{ e = ecry[i] - 'a';recover[i]=(e - k2)*kt % 26 +'a';if(recover[i] < 'a')recover[i] +=26;}}recover[i + 1] = '\0';}else{for(i=0;ecry[i]!='\0';i++){e = ecry[i]-'a';recover[i]=(e-k2)*kt % 26 +r +'a';if(recover[i] < 'a')recover[i] +=26;recover[i + 1] = '\0';}}//输出解密信息printf("解密后的信息为:");printf("%c%s",(answer=='y')? '\0':'\n',recover); putchar('\n');}3:Vigenere密码#include <stdio.h>#include <stdlib.h>void jiami(void);void jiemi(void);#include <string.h>#include <ctype.h>int main(){int i;loop:printf("加密请输入---- 1\n");printf("解密请输入---- 2\n");printf("退出请输入---- 0\n\n");printf("请输入您的选择:");scanf("%d",&i);getchar();switch(i){case 1: jiami();goto loop;case 2: jiemi();goto loop;default: exit(0);}return 0;}void jiami(void){ //加密函数char info[2000],code_info[2000];int i,k,j;printf("请输入要加密的信息!\n");gets(info);for(i = 0,k = 0;info[i] != '\0';i ++){ //过滤所有非字母字符if(!isalpha(info[i]))continue;if(isupper(info[i]))info[i] -= 'A' - 'a';info[k ++] = info[i];}info[k] = '\0';char mima[1000]; //得到密码,及密码长度printf("请输入密钥!\n");gets(mima);int mima_long = strlen(mima);for(i = 0;;i += mima_long){ //每mima_long位infomation进行移位加密if(strlen(info + i) > mima_long)for(j = 0;j < mima_long;j ++){code_info[i +j] = (info[i + j] - 'a' + mima[j] - 'a') % 26 + 'a';}else{for(k = i;info[k] != '\0';k ++)code_info[k] = (info[k] - 'a' + mima[k - i] - 'a') % 26 + 'a';code_info[k] = '\0';break;}}printf("加密后的信息为:\n");puts(code_info);putchar('\n');}void jiemi(void){ //解密函数char code_info[2000];char mima[1000];char recover[2000];int i,j,k;printf("请输入加密后的信息!\n");gets(code_info);printf("请输入密钥!\n");gets(mima);int mima_long = strlen(mima);for(i = 0;;i += mima_long){ //对每mima_long位加密信息进行反移位解密if(strlen(code_info + i) > mima_long)for(j = 0;j < mima_long;j ++){recover[i +j] = (code_info[i + j] - mima[j] + 26) % 26 + 'a';}else{for(k = i;code_info[k] != '\0';k ++){recover[k] = (code_info[k] - mima[k - i] + 26) % 26 + 'a';}recover[k] = '\0';break;}}printf("解密后的信息为:\n");puts(recover);putchar('\n');}break;}}return miyao;}int jiami(void){char info[info_max];char c_info[info_max];char miyao[1000];puts("请输入要加密的信息!");gets(info);putchar('\n');puts("请输入密钥!");gets(miyao);putchar('\n');char *mima;mima = yy(miyao); //把密钥转换为终极密码int i;for(i = 0;info[i] != '\0';i ++){if(isupper(info[i]))info[i] -= 'A' - 'a';if(isalpha(info[i]))c_info[i] = mima[info[i] - 'a'];elsec_info[i] = info[i];}c_info[i] = '\0';puts("加密后的信息为:");puts(c_info);putchar('\n');return 0;}int jiemi(){char c_info[info_max];char miyao[1000];char info[info_max];puts("请输入密钥:");gets(miyao);putchar('\n');char *mima;mima = yy(miyao);puts("请输入密文!");gets(c_info);putchar('\n');int i,j;for(i = 0;c_info[i] != '\0';i ++){if(isalpha(c_info[i])){for(j = 0;c_info[i] != *(mima + j);j ++)continue;info[i] = j + 'a';}elseinfo[i] = c_info[i];}info[i] = '\0';puts("原信息为:");puts(info);putchar('\n');return 0;}。

aes算法c语言实现

aes算法c语言实现

aes算法c语言实现AES(Advanced Encryption Standard)是一种广泛应用于数据加密的算法。

以下是一个使用C语言实现的AES加密算法示例,用于对字符串进行加密和解密。

这个实现是基于ECB模式的,这是一种常用的加密模式,因为它简单且易于实现。

注意:这个实现是为了教学目的而提供的,可能不适合用于生产环境。

生产环境中的加密实现通常需要更复杂和安全的方法。

```c #include <stdio.h> #include <string.h> #include <stdint.h> #include <openssl/aes.h>void AES_encrypt(const uint8_t *key, const uint8_t*plaintext, uint8_t *ciphertext) { AES_KEY aesKey; AES_set_encrypt_key(key, 128, &aesKey);AES_encrypt(plaintext, ciphertext, &aesKey); }void AES_decrypt(const uint8_t *key, const uint8_t*ciphertext, uint8_t *plaintext) { AES_KEY aesKey; AES_set_decrypt_key(key, 128, &aesKey);AES_decrypt(ciphertext, plaintext, &aesKey); }int main() { // 定义密钥和明文/密文缓冲区uint8_t key[AES_BLOCK_SIZE]; // AES_BLOCK_SIZE是AES算法的块大小,通常是16字节(128位) uint8_tplaintext[AES_BLOCK_SIZE], ciphertext[AES_BLOCK_SIZE];// 填充密钥和明文/密文缓冲区 // 这里省略了填充代码,因为在实际应用中,你应该使用合适的填充方案来保护数据的完整性。

C语言中的加密与解密算法

C语言中的加密与解密算法

C语言中的加密与解密算法在计算机科学和信息安全领域,加密和解密算法起着至关重要的作用。

加密是将原始数据转化为不可读的形式,以保护其机密性和安全性。

而解密则是将加密后的数据恢复为原始数据的过程。

在C语言中,我们可以使用不同的加密和解密算法来保护数据的安全。

本文将介绍几种常见的C语言中的加密与解密算法。

一、凯撒密码(Caesar Cipher)凯撒密码是一种最古老且最简单的加密算法之一。

它通过将每个字符按照固定的偏移量向右或向左进行替换来实现加密和解密过程。

例如,偏移量为3的凯撒密码将'A'替换为'D','B'替换为'E',以此类推。

以下是一个示例的C语言代码,实现了凯撒密码的加密和解密:```c#include <stdio.h>void caesar_encrypt(char* message, int shift) {int i = 0;while(message[i] != '\0') {if (message[i] >= 'A' && message[i] <= 'Z') {message[i] = (message[i] - 'A' + shift) % 26 + 'A';}if (message[i] >= 'a' && message[i] <= 'z') {message[i] = (message[i] - 'a' + shift) % 26 + 'a';}i++;}}void caesar_decrypt(char* message, int shift) {int i = 0;while(message[i] != '\0') {if (message[i] >= 'A' && message[i] <= 'Z') {message[i] = (message[i] - 'A' - shift + 26) % 26 + 'A'; }if (message[i] >= 'a' && message[i] <= 'z') {message[i] = (message[i] - 'a' - shift + 26) % 26 + 'a'; }i++;}}int main() {char message[] = "Hello, World!";int shift = 3;caesar_encrypt(message, shift);printf("加密后的消息:%s\n", message);caesar_decrypt(message, shift);printf("解密后的消息:%s\n", message);return 0;}```该示例代码演示了如何使用凯撒密码对消息进行加密和解密。

古典加密算法文档及代码

古典加密算法文档及代码

古典加密算法⽂档及代码信息安全程序设计⼀⼀、实验⽬的:学习并掌握密码学基础中古典加密体制的⼀些主要⽅法。

⼆、设计要求:编程实现移位密码、仿射密码、维吉尼亚密码和置换密码,要求如下:1、程序输⼊为明⽂和密钥(对于仿射密码应该检查密钥的合法性);2、执⾏加密和解密过程;3、输出加密的密⽂和解密恢复的明⽂,并和开始输⼊的明⽂进⾏⽐较。

三、设计步骤:程序在JA V A环境中实现,由于编程基础不够扎实可能程序没有明显的体现出⾯向对象的风格,期望⽼师见谅。

1:⾸先构造基本的古典加密界⾯2:然后添加界⾯所⽤到的组件和注册监听器。

3:编写各个算法的加密和解密函数进⾏加密解密时的调⽤。

四、以下分别是构造界⾯,添加组件及监听器和各个算法实现代码,分别都有标注import java.awt.*;import javax.swing.*;import java.awt.event.*;/*构造古典加密算法界⾯*/public class JMJM extends WindowAdapter implements ActionListener,ItemListener{Label l1=new Label("输⼊:"),l2=new Label("加密:"),l3=new Label("解密:"),l4=new Label("密钥:");JFrame f;TextField t1=new TextField(55),t2=new TextField(55),t3=new TextField(55),t4=new TextField(20);Button b1=new Button("加密"),b2=new Button("解密"),b3=new Button("清屏");Choice c1;Panel p1,p2,p3,p4,p5,p6,p7,p8,p9;public void display(){f=new JFrame("加密算法");f.setSize(480,200);f.setLocation(200,140);f.setBackground(Color.lightGray);f.setLayout(new BorderLayout());tiajiazujian();f.setV isible(true);}/*添加界⾯组件以及监听器*/public void tiajiazujian(){c1=new Choice();c1.add("移位算法");c1.add("仿射算法");c1.add("维吉尼亚算法");c1.add("置换算法"); c1.addItemListener(this);f.add(c1,"North");p1=new Panel();p3=new Panel();f.add(p3,"Center");p3.setLayout(new FlowLayout());p3.add(l1);p3.add(t1);p3.add(l2);p3.add(t2);p3.add(l3);p3.add(t3);p2=new Panel();f.add(p2,"South");p2.setLayout(new GridLayout(1,5));p2.add(l4);p2.add(t4);p2.add(b1);p2.add(b2);p2.add(b3);b1.addActionListener(this);b2.addActionListener(this);b3.addActionListener(this);}/*对应不同加密算法的按钮点击事件*/public void actionPerformed(ActionEvent e){if (e.getSource()==b3&&c1.getSelectedIndex()==0){t1.setText(" ");t2.setText(" ");t3.setText(" ");}if (e.getSource()==b1&&c1.getSelectedIndex()==0){ywjiami();}if(e.getSource()==b2&&c1.getSelectedIndex()==0){ywjiemi();}if(e.getSource()==b1&&c1.getSelectedIndex()==1){fcjiami();}if(e.getSource()==b2&&c1.getSelectedIndex()==1){fcjiemi();}if(e.getSource()==b1&&c1.getSelectedIndex()==2){ wjnyjiami();}if(e.getSource()==b2&&c1.getSelectedIndex()==2){ wjnyjiemi();}if(e.getSource()==b1&&c1.getSelectedIndex()==3){ zhjiami();}if(e.getSource()==b2&&c1.getSelectedIndex()==3){ zhjiemi();}}public void itemStateChanged(ItemEvent e){}/*移位加密算法*/public void ywjiami(){String s1;String s2;char zifu[];s1=t1.getText();s2=t4.getText();int a;a=Integer.parseInt(s2);zifu = s1.toCharArray();for (int i = 0;i{zifu[i]=(char)(((zifu[i]-97+a)%26)+97);}String s3=new String(zifu);s3=s3.toUpperCase();t2.setText(s3);}/*移位解密算法*/public void ywjiemi(){String s1;String s2;char zifu[];s1=t2.getText();s2=t4.getText();int a;a=Integer.parseInt(s2);zifu = s1.toCharArray();for (int i = 0;i{zifu[i]=(char)(((zifu[i]-97-a)%26)+97); }String s3=new String(zifu);s3=s3.toLowerCase();t3.setText(s3);}/*求最⼤公约数-辗转相除法*/int gcd(int a, int b){int k = 0;do{k = a%b;a = b;b = k;}while(k!=0);return a;}/*求模逆*/int Ni(int a, int b){int i = 0;while(a*(++i)%b!=1);return i;}/*仿射加密算法*/public void fcjiami(){int i=0, a=0, b=0, tmp;String s1;String s2;char zifu[];s1=t1.getText();s2=t4.getText();a=Integer.parseInt(s2)/10;b=Integer.parseInt(s2)%10;zifu = s1.toCharArray();/*如果输⼊密钥不合法则显⽰密钥错误*/ if(gcd(a,26)!=1) {String s3=new String();s3="密钥错误";t3.setText(s3);}for(i=0; i{if(zifu[i]>96&&zifu[i]<123)zifu[i] = (char)((a*(zifu[i]-97)+b)%26+65);else if(zifu[i]>64&&zifu[i]<91)zifu[i] = (char)((a*(zifu[i]-65)+b)%26+65);}String s4=new String(zifu);t2.setText(s4);}/*仿射解密算法*/public void fcjiemi(){int i=0, a=0, b=0, tmp;String s1;String s2;char zifu[];s1=t1.getText();s2=t4.getText();/*在密钥输⼊⽂本框中输⼊2位密钥⾸先转换成2位整数在利⽤‘/’和‘%’算法求出2个合法密钥在进⾏计算*/ a=Integer.parseInt(s2)/10;b=Integer.parseInt(s2)%10;zifu = s1.toCharArray();for(i=0; i{if(zifu[i]>64&&zifu[i]<91){tmp = Ni(a,26)*((zifu[i]-65)-b);if(tmp<0)zifu[i] = (char)(tmp%26+26+97);elsezifu[i] = (char)(tmp%26+97);}}String s4=new String(zifu);t3.setText(s4);}/*维吉尼亚加密算法*/public void wjnyjiami(){int i,j,s=0;int k=0 ;String s1;String s2;char zifu[],miyao[];s1=t1.getText();s2=t4.getText();miyao =s2.toCharArray();zifu = s1.toCharArray();for(i=0; i{zifu[i] = (char)((zifu[i]-97+(miyao[k%miyao.length]-97))%26+97);k++;}String s3=new String(zifu);s3=s3.toUpperCase();t2.setText(s3);}/*维吉尼亚解密算法*/public void wjnyjiemi(){int i,j,k=0,tmp;String s1;String s2;char zifu[],miyao[];s1=t2.getText();s2=t4.getText();s1=s1.toLowerCase();miyao =s2.toCharArray();zifu = s1.toCharArray();/*解密算法中会出现减出负数的状况如果出现负数加26解决问题*/ for (i =0;i {tmp = (zifu[i]-miyao[k%(miyao.length)]);zifu[i]=(char)(tmp+65);if (tmp<0)zifu[i] =(char)(tmp+65+26);k++;};String s3=new String(zifu);s3=s3.toLowerCase();t3.setText(s3);}/*置换加密算法*/public void zhjiami(){int i,k=0,tmp;String s1;s1=t1.getText();s2=t4.getText();zifu=s1.toCharArray();miyao =s2.toCharArray();char zifu1[]=new char[zifu.length];int j[]=new int[miyao.length];/*将输⼊的密钥的ASC码减去字符0对应的ASC码得数相应密钥对应的整形数值存取在整型数组j中*/ for(i=0;ij[i]=miyao[i]-48;};for(i=0; i{tmp = i/miyao.length;zifu1[i] =zifu[j[i%miyao.length]+(tmp*miyao.length)-1];};String s3=new String(zifu1);s3=s3.toUpperCase();t2.setText(s3);}/*置换解密算法*/public void zhjiemi(){int i,k=0,tmp;String s1;String s2;char zifu[],miyao[];s1=t2.getText();s2=t4.getText();zifu=s1.toCharArray();miyao =s2.toCharArray();char zifu1[]=new char[zifu.length];int j[]=new int[miyao.length];/*将输⼊的密钥的ASC码减去字符0对应的ASC码得数相应密钥对应的整形数值存取在整型数组j中*/};for(i=0; itmp = i/miyao.length;zifu1[j[i%miyao.length]+tmp*miyao.length-1] =zifu[i];};String s3=new String(zifu1);s3=s3.toLowerCase();t3.setText(s3);}public static void main(String arg[]){JMJM ob=new JMJM();ob.display();}}总结:通过这次的编程作业对古典加密的四种算法从刚开始的⽣涩到现在的熟悉并且扎实的掌握了算法的原理,在编程中遇到很多问题,⼤部分都不是因为算法本⾝的原理,都是因为⾃⼰的编程基础不够扎实造成的,总会遇到许多问题耗时间去学习去处理,还⽋缺⾯向对象编程的思想,在整个程序中致使⾯向对象的特点不明显,也由于⾃⼰编程基础的不扎实造成完成作业的时间有点长,给⽼师批改作业带来的不便请您见谅!但是经过⽐较长的作业时间,遇到了许多困难并⼀点⼀点解决,在理解算法和编程技术⽅⾯我都有了⼀定提⾼,最后看到⾃⼰完成的作业有很⼤的欣慰,我会在以后的学习中更加注重密码学的学习和锻炼⾃⼰的编程能⼒提⾼⾃⼰的编程技术。

古典密码算法的实现

古典密码算法的实现

古典密码算法的实现1、古典密码可以分为代替密码和置换密码两种,这⾥实现了代替密码中的仿射变换和置换密码中的换位变换。

2、仿射变换:加密过程:e(x) = ax + b (mod m)解密过程:d(e(x)) = a^(-1)*(e(x) - b) mod m参数要求:a,m互质;a,b互质;m是集合中元素的个数。

(例如当前取1~9和a~z中的所有元素作为集合,m为36)加密实现:1import java.util.Scanner;23public class Main {4public static void main(String []args) {5int m = 36, thisNum, index = 0; // m是集合中元素的个数(例如当前取1~9和a~z中的所有元素作为集合,m为36)6 Scanner s = new Scanner(System.in);7// 将输⼊的字符串转化为字符数组8char[] buff = s.nextLine().toCharArray();9// 参数a、b⼿动输⼊10int a = s.nextInt();11int b = s.nextInt();12// 参数要求:a,m互质;a,b互质13while (fun1(m, a) != 1 || fun1(Math.max(a, b), Math.min(a, b)) != 1) {14 System.out.println("参数不符合要求,请重新输⼊");15 a = s.nextInt();16 b = s.nextInt();17 }18for (char i : buff) {19// 由字符转换为数字20if (i > '9') thisNum = (int)i - 87;21else thisNum = (int)i - 48;22// 对该数字加密23 thisNum = (thisNum*a+b)%m;24// 加密后再将数字转换为字符25if (thisNum < 10) buff[index++] = (char)(thisNum+48);26else buff[index++] = (char)(thisNum+87);27 }28 System.out.println(buff);29 s.close();30 }3132// 欧⼏⾥得算法求两个数的最⼤公因数33public static int fun1(int a, int b) {34return b == 0 ? a : fun1(b, a%b);35 }36 }解密实现:1import java.util.Scanner;23public class Main {4public static void main(String []args) {5int m = 36, thisNum, index = 0, k;6 Scanner s = new Scanner(System.in);7char[] buff = s.nextLine().toCharArray();8int a = s.nextInt();9int b = s.nextInt();10while (fun1(m, a) != 1 || fun1(Math.max(a, b), Math.min(a, b)) != 1) {11 System.out.println("参数不符合要求,请重新输⼊");12 a = s.nextInt();13 b = s.nextInt();14 }15// k为a模m的逆元16 k = fun2(a, m);17for (char i : buff) {18// 将加密后的字符转换为数字19if (i > '9') thisNum = (int)i - 87;20else thisNum = (int)i - 48;21// 解密过程 D(E(x)) = a^(-1)*(E(x)-b) mod m22 thisNum = ((thisNum-b)*k)%m;23// 如果结果是负数,则转换为正数,原理为 a % b = (a % b + b) % b24if(thisNum < 0) thisNum += m;25// 最后将解密后的数字转换为字符26if (thisNum < 10) buff[index++] = (char)(thisNum+48);27else buff[index++] = (char)(thisNum+87);28 }29 System.out.println(buff);30 }3132public static int fun1(int a, int b) {33return b == 0 ? a : fun1(b, a%b);34 }3536// 循环求a模m的逆元37public static int fun2(int a, int m) {38for (int i = 0; i < m; i++) {39if (a*i%m == 1) {40 a = i;41break;42 }43 }44return a;45 }46 }3、换位密码加密过程:保持明⽂的所有字符不变,根据⼀定的规则重新排列明⽂。

古典密码-凯撒密码原理以及代码

古典密码-凯撒密码原理以及代码

古典密码-凯撒密码原理以及代码⽬录古典密码--->凯撒密码⼀⼂凯撒密码1.1 什么是凯撒密码凯撒密码,想必很多⼈听说过.没听说过的简单说⼀下.相传在很久很久以前,有⼀位皇帝,叫做尤利乌斯 · 凯撒为了缩短名字,我们称为凯撒⼤帝.是在公元前100年左右单⾝与古罗马,是⼀名著名的军事统帅.由它发明的密码.叫做凯撒密码1.2 凯撒密码的加密原理凯撒密码其实很简单. 需要我们理解平移概念 ,就是将⼀段数据平移多少位, 最后解密的时候进⾏反平移即可得出.以字母 a-z来说我们将a 进⾏平移3位得出密⽂如下图:将a 平移三位,得出 D b则是E 以此类推. 如果到达末尾,则从头开始. 例如Z 是字母的末尾.平移三位则是 C那么由此得出公式密⽂ = 函数(明⽂ + 平移位数(key) Mod 26;明⽂ = 函数(密⽂ - 平移位数(key) mod 26;其中密⽂明⽂函数平移位数等都是有英⽂含义的.所以我们很多时候都能看到如下写法c = E(p + k) mod 26p = D(c - k) mod 26C = Ciphertext 英⽂意思是密码密⽂的意思p = plainttext 英⽂意思是明⽂的意思,也就是未加密之前的数据E = encrypt 英⽂的意思是加密的意思. 放在我们编程中则可以理解为是⼀个⽅法.专门⽤于加密的⽅法D = Decrypt 英⽂意思是解密的意思同加密⼀样k = key 英⽂意思是钥匙的意思. 也就是解密的钥匙或者加密的钥匙mod 数学上取余数的意思 10 % 2 == 0 取得余数为0综上所述,⼤概是了解以下基本的术语密⽂ = 加密函数(明⽂ + key) % 26明⽂ = 解密函数(密⽂ - key) % 261.3 凯撒密码的破解其实凯撒密码是⾮常好破解的. 假设你不知道明⽂.只知道密⽂.那么总是可以尝试出来的. 总共是26次.依次破解. 我们常听的暴⼒破解就是这个意思. 也称为穷举那怎么知道凯撒密码破解出来是否正确. 是这样的. 明⽂⼀般都是有意义的.当你⽤密⽂破解的时候会出现很多⽆意义的数据.⽽有些数据是很有意义的.所以我可推断以下.假设不是.那么总过26组破解密码.⼀个⼀个尝试也能知道的.⼆⼂凯撒密码代码编写2.1 C/C++代码,编写加解密函数既然我们知道了公式c = e(p + k) % 26那么我们根据公式来即可代码void Entrypt(IN char* PlaintText, IN int PlaintTextSize, OUT char* CipText){//加密PlaintTextfor (auto i = 0; i < PlaintTextSize; i++){/*1.⾸先字符 - 字符'a'得出下标.2.下标 + 则是代表假⾯3.如果是加密,怎么下标不能超过26. 所以 % 264.计算完的结果加上'a' 就等于实际加密的密⽂了*/char ch = (PlaintText[i] - 'a' + 3); //得出下标char ch1 = ch % 26 + 'a'; //得出实际密⽂//接受的密⽂数组CipText[i] = ch1;}return;}//解密数据,与加密相反void Detrypt(IN char* CipText, IN int CipTextSize, OUT char* PlaintText){//加密PlaintTextfor (auto i = 0; i < CipTextSize; i++){/*1.⾸先字符 - 字符'a'得出下标.2.下标 - 则是代表解密3.如果是- 则会出现复数情况, 如 a的下标为0 a - 3 = 负数. 那么需要加26进⾏调整. 调整之后是绝对不会超过26的4.虽然不会超过.但是也要 % 26.因为如果是正数的情况,如果你加26那么还是会超过26*/char ch = (CipText[i] - 'a' - 3); //得出下标char ch1 = (ch + 26); //负数调整,char ch3 = ch1 % 26 + 'a'; //正数 % 26得出下标,下标 + 'a'//接受的密⽂数组PlaintText[i] = ch3;}return;}int main(){//c = entrypt(p + k) % 26//char szBuffer[] = "ibinary";char PlaintText[] = "ibinary";char CipText[8] = { 0 };char PlanitText1[8] = { 0 };Entrypt(PlaintText, strlen(PlaintText), CipText);printf("加密明⽂后的密⽂ = %s \r\n", CipText);Detrypt(CipText, strlen(CipText), PlanitText1);printf("解密密⽂后的明⽂ = %s \r\n", PlanitText1);system("pause");return 0;}。

C语言实现数据加密算法

C语言实现数据加密算法

C语言实现数据加密算法数据加密是对敏感信息进行转换的过程,以保护数据的机密性和完整性。

C语言提供了强大的工具和库来实现各种加密算法,包括对称加密和非对称加密等。

对称加密算法是一种使用相同密钥加密和解密数据的方法。

其中最常见的算法是DES(Data Encryption Standard)和AES(Advanced Encryption Standard)。

下面是一个实现AES算法的示例代码:```c#include <stdio.h>#include <stdlib.h>#include <string.h>#include <openssl/aes.h>void encrypt_data(const unsigned char *data, size_t len, const unsigned char *key, unsigned char *encrypted_data) AES_KEY aes_key;AES_set_encrypt_key(key, 128, &aes_key);AES_encrypt(data, encrypted_data, &aes_key);void decrypt_data(const unsigned char *encrypted_data,size_t len, const unsigned char *key, unsigned char *data) AES_KEY aes_key;AES_set_decrypt_key(key, 128, &aes_key);AES_decrypt(encrypted_data, data, &aes_key);int maiunsigned char data[AES_BLOCK_SIZE] = "hello world!";size_t len = sizeof(data);unsigned char encrypted_data[AES_BLOCK_SIZE];encrypt_data(data, len, key, encrypted_data);unsigned char decrypted_data[AES_BLOCK_SIZE];decrypt_data(encrypted_data, len, key, decrypted_data);printf("Original Data: %s\n", data);printf("Encrypted Data: ");for (int i = 0; i < len; i++)printf("%02x ", encrypted_data[i]);}printf("\nDecrypted Data: %s\n", decrypted_data);return 0;```以上代码使用了OpenSSL库中的AES加密算法。

  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

实训一古典加密算法一、实训目的熟悉古典数据加密的工作原理,并且能够利用相关加密算法进行加解密。

二、实训环境一台安装有Windows XP的计算机。

三、实训内容用C编写程序实现对某一文件内容用恺撒加密法进行加密,然后用解密程序进行解密。

四、实训步骤1、用C编写程序实现对某一文件内容用恺撒加密法进行加密。

2、用解密程序对密文进行解密。

五、实训效果检测上交加密程序、解密程序、原文(.txt文档)解:(1)使用的加密、解密程序代码如下:#include<stdio.h>#include<conio.h>#include<string.h>#include<malloc.h>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;}void menu()/*菜单,1.加密,2.解密,3.暴力破解,密码只能是数字*/{//clrscr();printf("\n========================================================="); printf("\n1.Encrypt the file");printf("\n2.Decrypt the file");printf("\n3.Force decrypt file");printf("\n4.Quit\n");printf("=========================================================\n"); printf("Please select a item:");return;}void main(){int i,n;char ch0,ch1;FILE *in,*out;char infile[20],outfile[20];//textbackground(BLACK);//textcolor(LIGHTGREEN);//clrscr();menu();ch0=getch();while(ch0!='4'){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();}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();}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);}if(ch0=='3'){// 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 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);}for(i=1;i<=25;i++)/*暴力破解过程,在察看信息正确后,可以按'Q'或者'q'退出*/ {rewind(in);rewind(out);// clrscr();printf("==========================================================\n"); printf("The outfile is:\n");printf("==========================================================\n"); while(!feof(in)){ch1=encrypt(fgetc(in),26-i);putch(ch1);fputc(ch1,out);}printf("\n========================================================\n");printf("The current key is: %d \n",i);/*显示当前破解所用密码*/printf("Press 'Q' to quit and other key to continue......\n");printf("==========================================================\n");ch1=getch();if(ch1=='q'||ch1=='Q')/*按'Q'或者'q'时退出*/{// clrscr();printf("\nGood Bye!\n");fclose(in);fclose(out);// sleep(3);// exit(0);}}printf("\nForce decrypt is over!\n");fclose(in);fclose(out);// sleep(1);}menu();ch0=getch();}//clrscr();printf("\nGood Bye!\n");(2)原文文件为whx.txt,其内容:ahhdhjshjdhjsdhj。

相关文档
最新文档