古典密码学(替换、置换加密)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。
C语言编程练习题之古典密码之旅
请编写一个程序,可以通过用户输入密码(一个字符串)生成密码表 (即上面的那个表),然后可以对用户输入的明文进行加密,对输入 的密文进行解密
第三题(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语言凯撒密码,又称偏移密码,是一种最简单的替换加密法手段,它是把字母表中的所有字母都向后(或前)按照一个固定的数目进行偏移后形成的新字母表构成的密码字母表,其基本原理是把明文中的每个字母都替换成字母表中其他的字母,以达到加密的目的。
凯撒密码的历史凯撒密码最早出现在公元前50年左右,当时古罗马政治家凯撒通过使用该密码来通信,以抵御敌人的侵略。
这种密码可以被称为凯撒密码,也可以被称为凯撒替换加密,它被认为是有史以来最古老的加密术之一。
凯撒密码的加密方法凯撒密码的加密方法很简单,它是把明文中的每个字母都替换成字母表中其他的字母,以达到加密的目的。
我们可以使用以下步骤进行加密:(1)首先,找出两个字母表,一个是原始明文中所使用的字母表,另一个是要加密的替换字母表,并确定上述两个字母表之间的偏移量。
(2)然后,根据以上设定的偏移量,把每个明文字母都替换成字母表中其它字母,以达到加密的目的。
(3)最后,用密文替换的字母表中的字母替换原始明文中的字母,就可以得到加密后的密文了。
凯撒密码的原理学习用C语言实现凯撒密码,首先要熟悉凯撒密码的加密原理。
把原来的明文变成密文,可以利用以下步骤:(1)首先要确定一个偏移量n,可以编写一段程序,让用户输入一个 0-25数值,用来表示要偏移的距离:int n;printf(Please enter an integer 0-25: );scanf(%d &n);(2)然后,编写一段程序来读取原文:char c;char text[100];printf(Please enter the text: );scanf(%s text);(3)把字母表中的每一个字母都向后(或前)偏移n个字母,把偏移后的字母替换原文中的字母:for (int i = 0; i < strlen(text); i++){c = text[i];if (c >= a && c <= zc = (c - a + n) % 26 + aelse if (c >= A && c <= Zc = (c - A + n) % 26 + Atext[i] = c;}(4)最后,输出密文:printf(Encrypted Text: %stext);小结本文主要介绍了凯撒密码及其历史、加密方法及原理,以及如何使用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程序
替换:#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;}。
换位密码c语言编程实现
换位密码c语言编程实现换位密码是一种简单的加密算法,可以将明文中的字母进行重新排列,从而生成密文。
在解密过程中,只需要恢复字母的原始位置即可还原明文。
本文将通过C语言编程实现换位密码的加密和解密过程,展示这一算法的原理和实际应用。
换位密码的加密过程可以分为以下几个步骤:1. 首先需要确定转换规则。
在本文中,我们采用按照字母表的顺序进行换位,即将第一个字母移动到最后一个位置,第二个字母移动到倒数第二个位置,以此类推。
2. 然后,需要获取明文字符串。
在C语言中,可以使用字符数组来表示字符串。
我们可以通过标准输入函数 "scanf" 来获取用户输入的明文。
```cchar plaintext[100];printf("请输入明文:");scanf("%s", plaintext);```3. 接下来,需要对明文进行加密。
为了方便起见,我们可以使用一个与明文字符串等长的临时字符数组来存储加密后的密文。
```cchar ciphertext[100];int length = strlen(plaintext);for (int i = 0; i < length; i++) {ciphertext[i] = plaintext[(i+1) % length];}ciphertext[length] = '\0'; // 添加字符串结束符```以上代码通过循环遍历明文字符串,并依据转换规则,将各个字母放入密文字符串的对应位置。
需要注意的是,最后还需要在密文字符串的末尾添加一个特殊字符'\0',以表示字符串的结束。
4. 最后,我们可以输出密文字符串,将其展示给用户。
```cprintf("密文为:%s\n", ciphertext);```至此,我们已经成功的使用换位密码对明文进行加密。
下面我们将展示如何使用相同的方法对密文进行解密,以恢复原始的明文。
4[2].古典替换密码cont
Decryption is done using
3. Vigenè Example re
write the plaintext out under it write the keyword repeated then using each key letter in turn as a caesar cipher key encrypt the corresponding plaintext letter Plaintext THISPROCESSCANALSOBEEXPRESSED Keyword CIPHERCIPHERCIPHERCIPHERCIPHE Plaintext VPXZTIQKTZWTCVPSWFDMTETIGAHLH
2. Vigenè Cipher re
最简单的多字母替换密码(Vigenè Cipher ) re ——多重 caesar ciphers 密钥是多字母长度 K = k1 k2 ... kd
数学表示: Encryption is done using
a + ki (mod 26) Dki(a): a -> a - ki (mod 26)
eg. if using a single key letter of 'd' have translation alphabet Plain: ABCDEFGHIJKLMNOPQRSTUVWXYZ Cipher: DCBAZYXWVUTSRQPONMLKJIHGFE
5. Variant-Beauford Cipher
Decryption is done using
古典密码技术
替代密码(代换密码)替代密码就是明文中每一个字符被替换成密文中的另外一个字符。
接收者对密文进行逆替换就恢复出明文来。
替代法加密是用另一个字母表中的字母替代明文中的字母。
加密算法Ek(m)是一个代换函数,将每一个m∈M代换为相应的c ∈C,代换函数的参数是秘钥k;解密算法Dk(c)只是逆代换。
在替代法加密体制中,使用了密钥字母表。
它可以由单个字母表构成,也可以由多个字母表构成。
如果是由一个字母表构成的替代密码,称为单表密码。
其替代过程是在明文和密码字符之间进行一对一的映射。
如果是由多个字母表构成的替代密码,称为多表密码。
1.单表替代密码单表替代密码的一种典型方法是凯撒(Caesar)密码,又叫循环移位密码。
它的加密方法就是把明文中所有字母都用它右边的第k个字母替代,并认为Z后边又是A。
这种映射关系表示为如下函数:F(a)=(a+k) mod n其中:a表示明文字母;n为字符集中字母个数;k为密钥。
凯撒(Caesar)密码k=3.映射表中,明文字母中在字母表中的相应位置数为C,(如A=1,B=2,…Y=25,Z=0)形式如下:设k=3;对于明文P=COMPUTE SYSTEMS则f(C)=(3+3)mod 26=6=Ff(O)=(15+3)mod 26=18=Rf(M)=(13+3)mod 26=16=P┆f(S)=(19+3)mod 26=22=V密文C= Ek(P)=FRPSXRWHUVBVWHPV。
除了凯撒密码,在其他的单表替代法中,有的字母表被打乱。
比如,在字母表中首先排列出密钥中出现的字母,然后在密钥后面填上剩余的字母。
如密钥是HOW,那么新的字母表就是:HOWABCDEFGIJKLMNPQRSTUVXYZ这个密钥很短,多数明文字母离开其密文等价字母,仅有一个或几个位置。
若用长的密钥字,则距离变大,因而便难于判断是何文字密钥。
2.多表替代密码周期替代密码,又称为维吉尼亚(Vigenere)密码。
古典密码算法的实现
古典密码算法的实现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、熟悉java平台的开发环境2、理解常见古典加密算法:凯撒密码、多字母替代密码、多表替代密码3、理解古典加密技术中的替换技术、置换技术。
二、实习内容1、问题描述凯撒密码是把字母表中的每个字母用该字母后的某个字母进行代替。
凯撒密码的通用加密算法是:C=E(p)=(P+K)mod26 0<k<26凯撒密码的通用解密算法是:C=E(p)=(P-K)mod26 0<k<262、基本要求实现凯撒密码的加密、解密算法,能够根据用户选择密钥和明文进行加解密。
3、实现提示若用户输入错误信息则可进行提示。
三、程序设计1、用户可以通过键盘输入一行字符串和所要移动的位数,作为所要实现加密的明文。
2、由于字母表中共有26个字符,因此,移位前应先将移动的位数和26取模。
Java平台中可以实现字符和证书的自动转换,因此将字符加上一个正整数代表在字母表中右移位数。
如果移动的位数为负值,则代表在字母中的左移位。
3、移位后仍要判断是否超界,如果超界,则应该做相应的运算,如果c<’a’,则应该加上26,如果c>’z’,则应该减去26,同理c<’A’,则应该加上26,如果c>’Z’,则应该减去26.四、实现测试运行界面如下:测试一:输入一串字符sdfasdfsd,输入一个正整数5,运行结果如下:测试二:输入同测试一相同的一串字符sdfasdfsd,输入一个负整数-5,运行结果如下:测试三:输入一串字符xyzxxxy,输入一个正整数5,此时已经超界,运行结果如下:测试四:当输入的字符中有数字等非字母字符时例如sdf323,此时加密内容不合理,运行结果如下:经过以上测试结果可知,程序正确五、实习总结:通过这次实习,我加深了对对凯撒密码的定义的理解,即是把字母表中的每个字母用该字母后的某个字母进行代替,在对程序设计时,改开始没有考虑周全,没有考虑到移动位数为负值的情况,从而出现当输入值不正确时程序会报错,其中越界情况比较麻烦,既要考虑到要将输入的数字取模,防止越界,又要考虑到将字母右移后要判断是否越界,其次还要考虑所输入字符是否符合标准,总之这次实习也告诉我缜密的思维在程序设计中也是比不可少的。
替代密码和置换密码的C语言实现精编版
scanf("%s", ctext1);
while(ctext1[i] != 0)
{
text_len++;
i++;
}
printf("输入密钥");
scanf("%s", key1);
i = 0;
while(key1[i] != 0)
{
key_len++;
i++;
}
{
inti = 0, j = 0, key_len = 0, text_len = 0, row = 0;
charkey1[LENGTH] = { 0 };
charptext1[LENGTH* 10] = { 0 };
charctext1[LENGTH* 10] = { 0 };
charnumber1[LENGTH] = { 0 };
实验一
一、实验名称:替代密码和置换密码的实现
二、实验目的:通过编程实现替代密码算法和置换密码算法,加深对古典密码体系的了解,为以后深入学习密码学奠定基础。
三、实验内容:
A:替代密码
1、实验原理:使用替代法进行加密,将明文中的字符用其他字符替代后形成密文。最早的替代密码是由Julius Caesar 发明的Caesar (恺撒)密码,又叫循环移位密码。它的加密过程可表示为: E(m) = (m+k ) mod n
printf("输入明文:\n");
scanf("%s", ptext);
i = 0;
while(ptext[i] != 0)
古典密码算法
实验一古典密码算法古典密码算法曾经被广泛应用,大都比较简单,使用手工和机械操作来实现加密和解密。
它的主要对象是文字信息,利用密码算法实现文字信息的加密和解密。
古典密码学可以分为代替密码(也叫做移位密码)和置换密码(也叫做换位密码)两种,其中代替密码典型的有Caesar密码,数乘密码和仿射变换等,置换密码有单表置换和多表置换等。
一、实验目的1.理解代替密码学加密过程2.理解置换密码学加密过程二、实验环境Windows,交换网络结构,每组2人,VC++6.0,密码工具三、实验原理1.Caesar(恺撒)密码Caesar密码是传统的代替加密法,当没有发生加密(即没有发生移位)之前,其置换表如1-1所示。
加密时每一个字母向前推移k位,例如当k=5时,置换表如1-2所示。
于是对于明文:data security has evolved rapidly经过加密后就可以得到密文:IFYF XJHZWNYD MFX JATQAJI WFUNIQD若令26个字母分别对应整数0~25,如表1-3所示。
则Caesar加密变换实际上是:c=(m+k)mod26其中m是明文对应的数据,c是与明文对应的密文数据,k是加密用的参数,也称为密钥。
很容易得到相应的Caesar解密变换是:m=D(c)=(c–k)mod26例如明文:data security对应的数据序列:301901842201781924当k=5时经过加密变换得到密文序列:852452397252213243对应的密文为:I F Y F X J H Z W N Y D2.单表置换密码单表置换密码也是一种传统的代替密码算法,在算法中维护着一个置换表,这个置换表记录了明文和密文的对照关系。
当没有发生加密(即没有发生置换)之前,其置换表如1-4所示。
在单表置换算法中,密钥是由一组英文字符和空格组成的,称之为密钥词组,例如当输入密钥词组:I LOVE MY COUNTRY后,对应的置换表如表1-5所示。
第4章 古典密码学[zhuzhuzhuzhu]
第4章 古典密码学 章
2、多表代换密码 、 以一系列(两个以上) 以一系列 ( 两个以上 ) 代换表依次对明 文消息的字母进行代换的加密方法 Vigenère 密码 例:m: data security
3 0 19 0 18 4 2 20 17 8 19 24
k: best
1 4 18 19 1 4 18 19 1 4 18 19
第4章 古典密码学 章
二、置换密码
置换 逆置换
6
5
2
4
假定给出明文:shesellsseashellsbytheseashore 假定给出明文: 个字母一组: 明文分为 6 个字母一组:
Shesel lsseas hellsb ythese ashore
重排,得密文: 重排,得密文:
EESLSH SALSES LSHBLE HSYEET HRAEOS
1、单表代换密码 、 (2)替换密码 –—密钥词组 )
Tsinghua university
a b c d e f g h i j k l mn o p q r s t u v w x y z
T S I N G H U A V E R Y B C D F J K L M O P Q W X Z
success----LOIIGLL
E,H,K(各 5 次) , , ( F,S,V(各 4 次) , , (
第4章 古典密码学 章
1、单表代换密码 、 (3)仿射密码 ) 明文为: 明文为: Algorithms are quite general definitions of arithmetic processes
a b c d e f g h i j k l mn o p q r s t u v w x y z
- 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;}。