实验1-古典密码算法
- 格式:doc
- 大小:73.50 KB
- 文档页数:9
第1页 实验一 古典密码算法1、目的使学生认识理解古典密码算法:凯撒密码算法,维吉尼亚密码算法。
2、环境PC 1 PC 1 台、安装软件台、安装软件VC60VC60、、JBuilder8JBuilder8、、Delphi7Delphi7。
3、预备知识 1.凯撒密码的过程: 表1:字母编码表0 1 2 3 4 5 6 7 8 9 10 11 12a b c d e f g h i j k l m13 14 15 16 17 18 19 20 21 22 23 24 25 n o p q r s t u v w x y z 再用配对字母取代信息里的原始字母位移加密法(shift cipher):模数计算。
算。
E E k (x)=(x+k)mod 26(x)=(x+k)mod 26,,D k (y)=(y (y)=(y ––k)mod 26 如:如:k=5;k=5;k=5;““hello world hello world””加密为:加密为:mjqqt mjqqt ….2.维吉尼来密码维吉尼来方阵:(不区分大小写)数学表达式:[]([][])%26;C i P i K i =+ 验证:验证:V[0V[0V[0,,0]=00]=0;;V[25V[25,,25]=24 V[13V[13,,12]=25 0 1 2 3 4 5 6 7 8 9 10 11 12a b c d e f g h i j k l m 13 14 15 16 17 18 19 20 21 22 23 24 25 n o p q r s t u v w x y z 解密:[]([][])%26;P i C i K i =-如:如:k=k=k=””BEST BEST””;“HELLO WORLD WORLD”加密为:”加密为:”加密为:IIDE IIDE …. 4字符一组:字符一组: hell OWOR LDBEST BEST BEST 以第一行字母为列标,2行为行标(为行标(B B ,H )=I =I;; 解密:IIDEBEST BEST,,明文字母是B 行字母为I 的列号H ,或B 列=I 的行H 。
一、实验目的通过本次实验,掌握古典加密算法的基本原理和实现方法,加深对古典加密算法的理解,提高编程能力。
二、实验内容本次实验主要涉及以下古典加密算法:1. 仿射密码2. 单表代替密码3. 维吉尼亚密码三、实验原理1. 仿射密码仿射密码是一种单字母替换密码,其加密原理为将明文进行0~25字母编码,按照加密公式计算出密文对应位置的字母编码,最后从密文的字母编码还原出密文对应位置的字母。
解密原理与加密原理相反。
2. 单表代替密码单表代替密码的加密原理为利用代替表,将明文中的每个字符映射到密文。
解密原理为对代替表进行反向查找,由密文映射回明文。
3. 维吉尼亚密码维吉尼亚密码的加密原理为通过加密方程Ci = (pi k(i mod m)) mod 26,由明文得到密文。
解密原理为解密过程是加密过程的逆过程,通过解密方程pi = (Ci k(i mod m)) mod 26。
四、实验步骤1. 仿射密码(1)编写加密函数encrypt,输入明文和密钥a、b,输出密文。
(2)编写解密函数decrypt,输入密文和密钥a、b,输出明文。
(3)测试加密和解密函数,验证其正确性。
2. 单表代替密码(1)编写加密函数subencrypt,输入明文和代替表,输出密文。
(2)编写解密函数subdecrypt,输入密文和代替表,输出明文。
(3)测试加密和解密函数,验证其正确性。
3. 维吉尼亚密码(1)编写加密函数vigenereencrypt,输入明文和密钥,输出密文。
(2)编写解密函数vigeneredecrypt,输入密文和密钥,输出明文。
(3)测试加密和解密函数,验证其正确性。
五、实验结果与分析1. 仿射密码通过编写encrypt和解密函数,成功实现了仿射密码的加密和解密过程。
实验结果表明,加密和解密函数运行正常,能够正确转换明文和密文。
2. 单表代替密码通过编写subencrypt和解密函数,成功实现了单表代替密码的加密和解密过程。
哈尔滨工程大学实验报告实验名称:古典密码算法班级:学号:姓名:实验时间:2014年4月成绩:指导教师:实验室名称:哈尔滨工程大学实验室与资产管理处制一、实验名称古典密码算法二、实验目的通过编程实现经典的代替密码算法和置换密码,包括移位密码、维吉尼亚密码、周期置换密码、列置换密码,加深对代替技术的了解,为现代分组密码实验奠定基础。
三、实验环境(实验所使用的器件、仪器设备名称及规格)运行Windows 或Linux 操作系统的PC 机,具有gcc(Linux)、VC(Windows)等C 语言编译环境。
四、实验任务及其要求(1)根据实验原理部分对移位密码的介绍,自己创建明文信息,并选择一个密钥,编写移位密码的实现程序,实现加密和解密操作。
(2)根据实验原理部分对维吉尼亚密码的介绍,自己创建明文信息,并选择一个密钥,编写维吉尼亚密码的实现程序,实现加密和解密操作。
(3)根据实验原理部分对周期置换密码的介绍,自己创建明文信息,并选择一个密钥,编写周期置换密码的实现程序,实现加密和解密操作。
(4)根据实验原理部分对列置换密码的介绍,自己创建明文信息,并选择一个密钥,编写列置换密码的实现程序,实现加密和解密操作。
五、实验设计(包括原理图、真值表、分析及简化过程、卡诺图、源代码等)1.移位密码移位密码(Shift Cipher)是一种典型的单表替代密码,也称为加法密码。
移位密码的加密方法就是将明文中的每个字母用其在字母表后面的第k 个字母替代,它的加密过程可以表示为: c = (m + k) mod n其中,m 为明文字母在字母表中的位置数;n 为字母表中的字母总数;k 为密钥;c 为密文字母在字母表中对应的位置数。
相应的,移位密码的解密过程可以表示为:m = (c - k) mod n移位密码的一个典型代表就是凯撒密码(Ceaser Cipher),它是k=3 时的移位密码。
使用英文字母表的撒密码的加(解)密可以表示为:m = (c + 3) mod 26 m = (c - 3) mod 26,例如,明文:attacks at nine am密钥:3加密:将明文分组对每一个密文字母,依英文字母表,用其右的第 3 个字母代替密文:dwwdfnv dw qlqh dp另外,使用凯撒密码加密后的密文“dwwdfnvdwilyhsp”,其明文为“attacks at five pm”。
实验一古典密码加密算法【实验目的】一般的密码学实验要求学习者编写实现加密法或分析工具的程序,但这势必要占用学习者较多的时间去调试程序,减少真正学习密码学的时间。
分析加密程序CAP是一款密码加密与分析的软件,包含了古典密码学和现代密码学常用的密码算法和分析工具。
学习者可以利用CAP更好地学习加密和密码分析技术,而不必花费大量的时间调试程序。
b5E2RGbCAP【实验目的】1、理解代替密码学加密过程;2、掌握置换密码学加密过程;3、自行设计恺撒密码<Caesar Cipher )加密工具,并验证恺撒密码<Caesar Cipher )加密过程;p1EanqFDPw4、掌握经典加密分析软件CAP的使用并验证古典密码加密算法;【实验环境】1、基于Windows的PC机一台;设计设计恺撒密码<Caesar Cipher )加密工具时的软件环境根据学生自己选择的平台安装,本设计软件平台可以是C语言,Visual C++,Visual C#,Visual Basic均可,主要是实现恺撒密码<Caesar Cipher )算法即可。
DXDiTa9E3d2、CAP加密与分析软件【实验内容】1、以C#平台为例说明恺撒密码<Caesar Cipher )算法的实现。
程序主界面如图1所示:程序源码using System。
……(省略部分生成代码>namespace Encryption{publicpartialclassForm1 : Form{int key。
privatestring Encryption(int key,refstringInputString>RTCrpUDGiT{StringBuilder str = newStringBuilder(>。
char ch,chtemp。
int temp。
for(int i=0。
i<InputString.Length。
实训一古典加密算法一、实训目的熟悉古典数据加密的工作原理,并且能够利用相关加密算法进行加解密。
二、实训环境一台安装有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篇一、实验背景密码学是一门研究信息加密与解密的学科,它广泛应用于信息安全领域。
为了更好地理解密码学的基本原理和算法,我们选择了实验吧平台上的密码学实验进行学习。
本次实验旨在通过实际操作,加深对古典密码、对称密码和不对称密码等密码学基本概念的理解,提高密码学应用能力。
二、实验目的1. 理解并掌握古典密码的基本原理和算法;2. 掌握对称密码和不对称密码的基本原理和算法;3. 通过实验操作,提高密码学应用能力;4. 培养团队协作和解决问题的能力。
三、实验内容1. 古典密码实验(1)仿射密码原理:仿射密码是一种单字母替换密码,加密公式为:C = (aP + b) mod 26,其中C为密文字母,P为明文字母,a和b为密钥。
操作步骤:1)编写加密函数encrypt,实现仿射密码加密;2)编写解密函数decrypt,实现仿射密码解密;3)测试加密和解密函数,验证其正确性。
(2)单表代替密码原理:单表代替密码是一种将明文字符映射到密文字符的替换密码。
操作步骤:1)编写加密函数subencrypt,实现单表代替密码加密;2)编写解密函数subdecrypt,实现单表代替密码解密;3)测试加密和解密函数,验证其正确性。
(3)维吉尼亚密码原理:维吉尼亚密码是一种多字母替换密码,加密公式为:C = (P + K[i]) mod 26,其中C为密文字母,P为明文字母,K为密钥,i为索引。
操作步骤:1)编写加密函数vigenereencrypt,实现维吉尼亚密码加密;2)编写解密函数vigeneredecrypt,实现维吉尼亚密码解密;3)测试加密和解密函数,验证其正确性。
2. 对称密码实验(1)DES加密算法原理:DES(Data Encryption Standard)是一种分组加密算法,采用56位密钥,64位分组。
操作步骤:1)编写DES加密函数desencrypt,实现DES加密;2)编写DES解密函数desdecrypt,实现DES解密;3)测试加密和解密函数,验证其正确性。
实验1-古典密码算法一、实验目的通过编程实现替代密码算法和置换密码算法,加深对古典密码体系的了解,为以后深入学习密码学奠定基础。
二、实验原理古典密码算法曾被广泛应用,大都比较简单。
它的主要应用对象是文字信息,利用密码算法实现文字信息的加密和解密。
其中替代密码和置换密码是具有代表性的两种古典密码算法。
1、替代密码替代密码算法的原理是使用替代法进行加密,就是将明文中的字符用其他字符替代后形成密文。
例如,明文字母a、b、c、d,用D、E、F、G做对应替换后形成密文。
最早的替代密码是由Julius Caesar 发明的Caesar (恺撒)密码,又叫循环移位密码。
它的加密过程可以表示为下面的函数:E(m) = (m+k ) mod n其中,m为明文字母在字母表中的位置数;n为字母表中的字母个数;k为密钥;E(m)为密文字母在字母表中对应的位置数。
例如,对于明文字母H,其在字母表中的位置数为8,设k=4,则按照上式计算出来的密文为L,计算过程如下:E(8) = (m+k ) mod n = (8+4 ) mod 26 = 12 = L 解密算法是:m = D(L) =(L-k)mod 262、置换密码置换密码算法的原理是不改变明文字符,只将字符在明文中的排列顺序改变,从而实现明文信息的加密。
置换密码又称为换位密码。
矩阵换位法是实现置换密码的一种常用方法。
它将明文中的字母按照给定的顺序安排在一个矩阵中,然后又根据密钥提供的顺序重新组合矩阵中的字母,从而形成密文。
例如,明文为 attack begins at five ,密钥为 cipher ,将明文按照每行6个字母的形式排在矩阵中,形成如下形式:a t t a c kb e g i n sa t f i v e根据密钥 cipher 中各字母在字母表中出现的先后顺序,得到给定的一个置换:f = 1 4 5 3 2 6因此有:密钥: 1 4 5 3 2 6明文: a t t a c kb e g i n sa t f i v e根据上面的置换,将原有矩阵中的字母按照第1列、第4列、第5列、第3列、第2列、第6列的顺序排列、则有下面的形式:a a c t t kb i n g e sa i v f t e从而得到密文:abatgftetcnvaiikse其解密过程是根据密钥的字母数作为列数,将密文按照列、行的顺序写出,再根据由密钥给出的矩阵置换产生新的矩阵,从而恢复明文。
实验⼀古典加密算法实验⼀古典加密算法⼀、实习⽬的1、熟悉java平台的开发环境2、理解常见古典加密算法:凯撒密码、多字母替代密码、多表替代密码3、理解古典加密技术中的替换技术、置换技术。
⼆、实习内容1、问题描述凯撒密码是把字母表中的每个字母⽤该字母后的某个字母进⾏代替。
凯撒密码的通⽤加密算法是:C=E(p)=(P+K)mod26 0凯撒密码的通⽤解密算法是:C=E(p)=(P-K)mod26 02、基本要求实现凯撒密码的加密、解密算法,能够根据⽤户选择密钥和明⽂进⾏加解密。
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,此时加密内容不合理,运⾏结果如下:经过以上测试结果可知,程序正确五、实习总结:通过这次实习,我加深了对对凯撒密码的定义的理解,即是把字母表中的每个字母⽤该字母后的某个字母进⾏代替,在对程序设计时,改开始没有考虑周全,没有考虑到移动位数为负值的情况,从⽽出现当输⼊值不正确时程序会报错,其中越界情况⽐较⿇烦,既要考虑到要将输⼊的数字取模,防⽌越界,⼜要考虑到将字母右移后要判断是否越界,其次还要考虑所输⼊字符是否符合标准,总之这次实习也告诉我缜密的思维在程序设计中也是⽐不可少的。
实验1-古典密码算法一、实验目的通过编程实现替代密码算法和置换密码算法,加深对古典密码体系的了解,为以后深入学习密码学奠定基础。
二、实验原理古典密码算法曾被广泛应用,大都比较简单。
它的主要应用对象是文字信息,利用密码算法实现文字信息的加密和解密。
其中替代密码和置换密码是具有代表性的两种古典密码算法。
1、替代密码替代密码算法的原理是使用替代法进行加密,就是将明文中的字符用其他字符替代后形成密文。
例如,明文字母a、b、c、d,用D、E、F、G做对应替换后形成密文。
最早的替代密码是由Julius Caesar 发明的Caesar (恺撒)密码,又叫循环移位密码。
它的加密过程可以表示为下面的函数:E(m) = (m+k ) mod n其中,m为明文字母在字母表中的位置数;n为字母表中的字母个数;k为密钥;E(m)为密文字母在字母表中对应的位置数。
例如,对于明文字母H,其在字母表中的位置数为8,设k=4,则按照上式计算出来的密文为L,计算过程如下:E(8) = (m+k ) mod n = (8+4 ) mod 26 = 12 = L 解密算法是:m = D(L) =(L-k)mod 262、置换密码置换密码算法的原理是不改变明文字符,只将字符在明文中的排列顺序改变,从而实现明文信息的加密。
置换密码又称为换位密码。
矩阵换位法是实现置换密码的一种常用方法。
它将明文中的字母按照给定的顺序安排在一个矩阵中,然后又根据密钥提供的顺序重新组合矩阵中的字母,从而形成密文。
例如,明文为 attack begins at five ,密钥为 cipher ,将明文按照每行6个字母的形式排在矩阵中,形成如下形式:a t t a c kb e g i n sa t f i v e根据密钥 cipher 中各字母在字母表中出现的先后顺序,得到给定的一个置换:f = 1 4 5 3 2 6因此有:密钥: 1 4 5 3 2 6明文: a t t a c kb e g i n sa t f i v e根据上面的置换,将原有矩阵中的字母按照第1列、第4列、第5列、第3列、第2列、第6列的顺序排列、则有下面的形式:a a c t t kb i n g e sa i v f t e从而得到密文:abatgftetcnvaiikse其解密过程是根据密钥的字母数作为列数,将密文按照列、行的顺序写出,再根据由密钥给出的矩阵置换产生新的矩阵,从而恢复明文。
三、实验环境PC机,C或C++编译环境四、实验内容和步骤1、替代算法:(1)根据实验远离部分对替代密码算法的介绍,创建明文信息,并选择一个密钥k,编写替代密码算法的实现程序,实现加密和解密操作。
替代密码包括多种类型,如单表替代密码、多明码替代密码、多字母替代密码、多表替代密码等。
(2)结果截图:(3)流程图:2、置换算法(1)置换密码算法的原理是不改变明文字符,只将字符在明文中的排列顺序改变,从而实现明文信息的加密。
置换密码有时又称为换位密码。
矩阵换位法是实现置换密码的一种常用方法。
它将明文中的字母按照给的顺序安排在一个矩阵中,然后用根据密钥提供的顺序重新组合矩阵中字母,从而形成密文。
(2)实验截图:(3)1、回答问题:试分析两种密码算法的安全性,以及如何改进。
替代密码中使用特定的公式将结果加密并得到结果,以此并加以加密和解密,算法比较简单。
置换密码中使用二维数组对信息进行加密和解密,这中工作使信息安全性更好一些2、本次实验的体会总结。
了解古典密码算法并不代表能写出来程序,除了写程序要注意的各个细节,还要将脑海里的想法转化为流程图并用c语言实现。
感觉做出的程序并不是很好,替代算法简单一点,置换算法花费了大量的时间,还只是勉强成功。
意识到自己太弱,还需要付出更多的努力。
替代密码:#include<stdio.h>#include<math.h>#include<string.h>#include<conio.h>#define N 500int main(){int i=0,k,m,n,l;char str1[N],str2[N]; /*C=M+K...K is key...*/textbackground(RED);textcolor(LIGHTGREEN);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("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("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;}置换算法:#include<stdio.h>#include<math.h>#include<string.h>#include<conio.h>#define N 100int main(){ /*----------------------------*/int i,j,lenK,lenM,m,n,temp;int T[N];char K[N],M[N],C[N],Temp1[N],Temp2[N],Temp3[N];textbackground(GREEN);textcolor(RED);clrscr(); /*----------------------------*/printf("This is a substitution cipher...\n");printf("Please input the M::\n");/*输入明文M*/gets(M);printf("Please input the K::\n");/*输入密钥K*/gets(K);lenK=strlen(K);lenM=strlen(M);/*测设长度*/m=lenM/lenK;n=lenK;/*定义矩阵的长和宽*/for(i=0;i<lenK;i++)/*对密钥进行数字排序*/{temp=0;for(j=0;j<lenK;j++){if((int)K[i]<(int)K[j]){temp+=1;}}T[i]=lenK-temp;printf("%d ",T[i]);/*输出各字符对应的数字顺序*/ } /*--------------------------------*/printf("\n\nFirst........\n\n");for(i=0;i<m;i++)/*根据密钥将明文排列成矩阵*/{for(j=0;j<n;j++){Temp1[i*lenK+j]=M[i*lenK+j];printf("%c ",Temp1[i*lenK+j]);}printf("\n");}Temp1[lenM]='\0'; /*--------------------------------*/ printf("\nSecond........\n\n");/*进行第一次置换*/for(i=0;i<lenK;i++){for(j=0;j<m;j++){Temp2[j*lenK+i]=Temp1[j*lenK+T[i]-1];}}Temp2[lenM]='\0';for(i=0;i<m;i++){for(j=0;j<lenK;j++){printf("%c ",Temp2[i*lenK+j]);}printf("\n");} /*-------------------------------*/printf("\nThird.......\n\n");/*进行第二次置换*/for(i=0;i<lenK;i++){for(j=0;j<m;j++){Temp3[j*lenK+i]=Temp2[j*lenK+T[i]-1];}}Temp3[lenM]='\0';for(i=0;i<m;i++){for(j=0;j<lenK;j++){printf("%c ",Temp3[i*lenK+j]);}printf("\n");}/*-----------------------------*/printf("The substitution cipher is...\n");/*输出结果*/for(j=0;j<lenK;j++){for(i=0;i<m;i++){printf("%c",Temp3[i*lenK+j]);}}getch();return 0;}。