古典密码学(替换、置换加密)C程序
信息安全 实验五 古典密码算法

} else{}; } strcpy(str1,str); for(i=0;i<len;i++) { for(j=0;j<len-i-1;j++) {
if(str1[j]>str1[j+1])
实验五 古典密码算法
实验目的:
通过编程实现替代密码算法和置换密码算法,加深对古典密码体制的了解,为深入学 习 密码学奠定基础。
实验环境:
运行 Windows 或 Linux 操作系统的 PC 机,具有 gcc(Linux)、VC(Windows)等 C 语言编 译环境。
实验原理:
古典密码算法曾被广泛应用,大都比较简单,使用手工和机械操作来实现加密和解密。 它的主要应用对象是文字信息,利用密码算法进行文字信息的加密和解密。下面介绍两种常 见的具有代表性的古典密码算法,以帮助读者对密码算法建立一个初步的印象。 1. 替代密码
c[x][i]=b[x][j]; } } } } for(i=0;i<len;i++) { for(j=0;j<len;j++) { if(str[i]==str1[j]) { for(x=0;x<j1;x++) {
d[x][i]=c[x][j]; } } } } cout<<"加密后的密文为:"<<endl; for(i=0;i<len;i++) { for(j=0;j<j1;j++) cout<<d[j][i]<<" "; } cout<<endl;
古典替换密码

♦ OK!
♦ 加密算法: ♦ Ek: i -> i + k (mod 26)
♦ 解密算法: ♦ Dk: i -> i - k (mod 26)
1.古典加密技术
♦ 两个基本组成部分:
替换与置换 (substitution and transposition)
3.密码分析(Cryptanalysis of Caesar ciphers)
Plaintext: IFWEWISHTOREPLACELETTERS Ciphertext: WIRFRWAJUHYFTSDVFSFUUFYA
9。打乱的密码代换的ຫໍສະໝຸດ 全性♦ 密钥总数:26! ♦ 如此多的密钥,可以认为安全吗? ♦ !!!NO!!! ♦ 仍然有语言统计规律 ♦ 需要其它方法隐藏这种规律性 ♦
♦ 熵(Entropy,定义为事件集X中事件出现 的信息的统计平均值
∑ H (X ) =
i
1 p(xi) loga p(xi)
≥0
它表示X中出现一个事件平均给出的信息量,
或事件的平均不确定性
Exercises
♦ encrypt and then decrypt by hand, the text below using a general monoalphabetic cipher with a key of "NIFTY":
equivalents
11. 一般单码替换密码 举例
♦ 给定密钥字 "STARWARS" ♦ 去掉重复字母得到 "STARW" ♦ 填写剩余字母:
STARW BCDEF GHIJK LMNOP QUVXY Z ♦ 按列读取字母得到密文 ♦ Plain: ABCDEFGHIJKLMNOPQRSTUVWXYZ Cipher: SBGLQZTCHMUADINVREJOXWFKPY ♦ 可以用这个密钥加密、解密 ♦ 例如 Plaintext: I KNOW ONLY THAT I KNOW NOTHING ♦ Ciphertext: H UINF NIAP OCSO H UINF INOCHIT ♦
古典密码简介

古典密码简介从密码学发展历程来看,可分为古典密码(以字符为基本加密单元的密码)以及现代密码(以信息块为基本加密单元的密码)两类。
⽽古典密码有着悠久的历史,从古代⼀直到计算机出现以前,古典密码学主要有两⼤基本⽅法:①置换密码(⼜称易位密码):明⽂的字母保持相同,但顺序被打乱了。
②代替密码:就是将明⽂的字符替换为密⽂中的另⼀种的字符,接收者只要对密⽂做反向替换就可以恢复出明⽂。
古典密码是密码学的根源,虽然都⽐较简单⽽且容易破译,但研究古典密码的设计原理和分析⽅法对于理解、分析以及设计现代密码技术是⼗分有益滴^_^⼀.置换密码1.列置换密码(矩阵置换密码)明⽂:ming chen jiu dian fa dong fan gong密钥:yu lan hua去掉密钥重复字母:yulanh,得出距阵列数为6;将明⽂按⾏填充距阵。
得到密钥字母顺序: 653142;按列(依顺序)写出距阵中的字母。
密⽂:giffg hddn0 njngn cuaa0 inano meiog解密:加密的逆过程;2.周期置换密码 周期置换密码是将明⽂串P按固定长度m分组,然后对每组中的⼦串按1,2,...,m的某个置换重排位置从⽽得到密⽂C。
其中密钥σ包含分组长度信息。
解密时同样对密⽂C按长度m分组,并按σ的逆置换σ-1把每组⼦串重新排列位置从⽽得到明⽂P。
明⽂:State Key Laboratory of Networking and Switching加密密钥:σ=(15623)明⽂分为七组:(StateK)(eyLabo)(ratory)(ofNetw)(orking)(andSwi)(tching)加密变换:密钥⾥没有4,则第4位保持不变,然后对应的第1位换到第5位,第5位换到第6位,第6位换到第2位....密⽂:(aKttSe)(Loyaeb)(tyaorr)(Nwfeot)(kgrion)(dinSaw)(hgcitn)解密密钥:σ-1 = (13265)3.栅栏密码此密码⼀般适⽤于较短的密码,原理是字母的错位。
实验一 古典密码—单表代换

实验一古典密码—单表代换【实验目的】理解代换密码的基本思想理解移位密码、仿射密码等算法的原理掌握上述各个算法的输入输出格式和密钥格式掌握上述各个算法的加解密过程和实现方法【实验原理】代换密码体制的一般定义为M=C=K=Z26,其中M为明文空间、C为密文空间、K为密钥空间、Z26为26个整数(对应26个英文字母)组成的空间;要求26个字母与模26的剩余类集合{0,1,2,…,25}建立一一对应的关系。
一、移位密码移位密码的加密实现上就是将26个英文字母向后循环移动k位,其加解密可分别表示为:c=E k(m)=m+k(mod 26)m=D k(c)=c-k(mod 26)其中,m、c、k是满足0≤m,c,k≤25的整数。
二、乘法密码乘法密码是通过对字母等间隔抽取以获得密文,其加解密可分别表示如下:-1c=mk(mod 26)m=ck(mod26)其中,m、c、k是满足0≤m,c,k≤25,且gcd(k,26)=1的整数。
三、仿射密码仿射密码的加密是一个线性变换,将移位密码和乘法密码相结合,其加解密可分别表示为:C=E a,b(m)=am+b(mod 26)M=D a,b(C)=a-1(c-b)(mod 26)其中:a、b是密钥,是满足0≤a,b≤25和gcd(a,26)=1的整数,即a和26互素;a-1的逆元,即a•a-1≡1 mod 2【实验环境】ISES客户端Microsoft CLR Debugger 2005或其它调试器【实验内容】通过运算器工具实现移位密码、乘法密码、仿射密码对各个算法的加解密进行扩展实验和算法跟踪【实验步骤】此处以移位密码为例说明,乘法密码、仿射密码可参照完成。
一、加解密计算(一) 加密(1) 参照实验原理,在明文栏输入所要加密的明文,在密钥栏输入相应的密钥,如下图1.1-2所示。
图 1.1-2(2) 点击“加密”按钮,在密文文本框内就会出现加密后的密文,如图1.1-3所示。
替代密码和置换密码地C语言实现

实验一一、实验名称:替代密码和置换密码的实现二、实验目的:通过编程实现替代密码算法和置换密码算法,加深对古典密码体系的了解,为以后深入学习密码学奠定基础。
三、实验内容:A:替代密码1、实验原理:使用替代法进行加密,将明文中的字符用其他字符替代后形成密文。
最早的替代密码是由Julius Caesar 发明的Caesar (恺撒)密码,又叫循环移位密码。
它的加密过程可表示为: E(m) = (m+k ) mod n其中,m为明文字母在字母表中的位置数;n为字母表中的字母个数;k为密钥;E(m)为密文字母在字母表中对应的位置数。
解密算法是:m = D(L) =(L-k)mod 26;2、算法设计:使用两个函数分别进行加密和解密的过程,在主程序中通过选择加密还是解密来调用不同函数进行替代密码的加密和解密过程实现;3、函数接口:加密:int encrypt(){printf("输入明文:\n");scanf("%s",a);for(i=0;a[i]!='\0';i++){b[i]=a[i]-64;}printf("输入一位密钥\n");scanf("%d",&k);printf("\n");for(i=0;b[i]!='\0';i++){m[i]=(b[i]+k)%26+64;}printf("%s",&m);return 0;}解密:int decode(){printf("输入密文:\n");scanf("%s",a);for(i=0;a[i]!='\0';i++){b[i]=a[i]-64;}printf("输入一位密钥\n"); scanf("%d",&k);printf("\n");for(i=0;b[i]!='\0';i++){n[i]=(b[i]-k)%26+64;}printf("%s",n);return 0;}4、程序流程图:5、测试结果截图:加密:解密:B:1、实验原理:不改变明文字符,但是把字符在明文中的排列顺序改变,来实现明文信息的加密。
列置换密码C语言实现

while (key[i]!=0)
{
key_len++;
i++;
}
//处理密钥,得出列置换的顺序
for (i=0;i<key_len;i++)
{
number[i]=0;
for (j=0;j<key_len;j++)
{
if (key[j]<key[i])
{
for (j=0;j<row;j++)
{
ptext1[number1[i]+key_len*j]=ctext1[i*row+j];
}
}
for (i=0;i<key_len;i++)
{
for (j=0;j<row;j++)
{
printf("%c",ptext1[i*row+j]);
//计算行数
if (text_len%key_len==0)
row=text_len/key_len;
else
row=text_len/key_len+1;
//列置换
for (i=0;i<key_len;i++)
{
for (j=0;j<row;j++)
{
}
}
return 0;
}
{
number1[i]=0;
for (j=0;j<key_len;j++)
{
c语言实现置换密码

//单置换密码的编程实现(C++)//作者信息:////本程序使用方法:需要在本程序所在的文件夹创建一个"密码学.txt"文档,//该程序所需要的数据全部由该文档提供,然后运行即可得到结果,如需要修改数据,必须从文档中人工修改//文档格式的要求:文档总共包含两行。
第一行由一个1或2的数字和一个字符串组成,数字1代表加密,2代表解密,字符串表示密钥//第二行仅包含一个字符串,这个字符串是需要加密或解密的内容。
//该程序运行结果直接由控制台输出运行结果:#include<iostream>#include<string>#include<fstream>using namespace std;ifstream in("密码学.txt");void JiaMi(char ZhiHuan[]); //加密函数void JieMi(char ZhiHuan[]); //解密函数void setZhiHuan(char ZhiHuan[],char fanZhiHuanBiao[]); //设置置换表函数int main(){int m; //确定是加密或解密?加密为1,解密为2char ZhiHuanBiao['z'+1]; //正向置换表,加密时用char fanZhiHuanBiao['Z'+1]; //反向置换表,解密时用cout<<"加密按输入1,解密输入2"<<endl;in>>m; //读入msetZhiHuan(ZhiHuanBiao, fanZhiHuanBiao); //设置置换表switch(m) //判断m值,执行相应的功能{case 1: JiaMi(ZhiHuanBiao);break;case 2: JieMi(fanZhiHuanBiao);break;default:break;}return 0;}void JiaMi(char ZhiHuan[]) //加密{string MingWen; //保存明文cout<<endl<<"请输入明文:";getline(in,MingWen); //读入明文cout<<MingWen<<endl;cout<<"加密后的密文为:"<<endl;for(int i=0; i<MingWen.length(); i++) //直接利用置换表输出密文{if(MingWen[i]>='a' && MingWen[i]<='z')cout<<ZhiHuan[ MingWen[i] ];else cout<<MingWen[i];}cout<<endl;}void JieMi(char fanZhiHuan[]){string MiWen; //保存密文cout<<endl<<"请输入密文:";getline(in,MiWen); //读入密文cout<<MiWen<<endl;cout<<"解密后的明文为:"<<endl;for(int i=0; i<MiWen.length(); i++) //直接利用反置换表输出明文{if(MiWen[i]>='A' && MiWen[i]<='Z')cout<<fanZhiHuan[ MiWen[i] ];else cout<<MiWen[i];}cout<<endl;}void setZhiHuan(char ZhiHuanBiao[],char fanZhiHuanBiao[]){int i; //i和j是循环变量,除此之外没有任何意义char j;string s; //密钥cout<<"请输入密钥(大写):";getline(in,s); //读入密钥cout<<s<<endl; //输出密钥cout<<"置换表为:"<<endl;string s1;for(i = 0 ; i < s.length();i++) //对密钥进行处理(去掉空格和重复的字符){bool sign =0; //标志变量if(s[i] >= 'A' && s[i] <='Z'){for(int j = 0; j < s1.length();j++){if(s[i] == s1[j]){sign = 1;break;}}if(sign == 0) s1 = s1 + s[i];else sign = 0;}}for( j ='a';j<='z';j++)cout<<j<<" ";cout<<endl; //输出小写字母从a到zchar ch='A';for( i = 'a' ;i <= 'z'; i++) //该循环利用密钥得到置换表{if(i < 'a' + s1.length()) //前面直接用s1代替{ZhiHuanBiao[i] = s1[i-'a'];}else //后面将剩下的"贴"上去{for(int j = 'a'; j < 'a' + s1.length(); j++){if(ch == ZhiHuanBiao[j]){ch++;j= 'a'; //每次都从头开始搜索continue;}}ZhiHuanBiao[i] = ch;ch++;}cout<<ZhiHuanBiao[i]<<" "; //同时输出置换表}cout<<endl;for( i='a'; i<= 'z'; i++) //该循环利用置换表得到反置换表{fanZhiHuanBiao[ ZhiHuanBiao[i] ] = i;}for( i='A'; i<= 'Z'; i++) //输出反置换表{cout<< fanZhiHuanBiao[i] <<" ";}cout<<endl;}宣传组♂逆天<*******************>12:26:39我想问问念哥准备怎么重写?重写的话剧情能否写得更紧凑,会不会坚持写下去?烦劳楼主帮我问问!谢谢!念哥考率过写双线没?如果可以能不能双线写呢?我想问念哥什么时候准备去其他网站,去哪个网站。
使用C语言实现古典加密

实训一古典加密算法一、实训目的熟悉古典数据加密的工作原理,并且能够利用相关加密算法进行加解密。
二、实训环境一台安装有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。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
替换:#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;}。