多表古典密码的乘法加密运算
- 格式:doc
- 大小:29.00 KB
- 文档页数:3
实验2 古典密码1.实验目的(1)了解古典密码中的基本加密运算。
(2)了解几种典型的古典密码体制。
(3)掌握古典密码的统计分析方法。
2.实验内容(1)古典密码体制①简单移位加密(单表代换)该加密方法中,加密时将明文中的每个字母向前推移K位。
经典恺撒密码加密变换就是这种变换,取k=3。
步骤1:打开CAP4软件,并加载实验一附带的“mw.txt”,如图2-1所示。
图2-1加载文件步骤2:采用恺撒加密方法手工加密“mw.txt”;打开CAP4菜单栏“Cipher”菜单项选择“simple shift”选项,并选择移位值“shift value”为3,加密步骤1中加载的文件,如图2-2所示。
图2-2 参数设置图2-3加密文件步骤3:比较二者的加密结果是否相同。
步骤4:点击CAP4软件中的“Simple analysis”下的“shift”键,观察恺撒加密法的可能密钥值,并分析其攻击的难度,如图2-4所示。
图2-4密钥分析②仿射密码加密(单表代换)在仿射密码加密(affine cipher)中,字母表中的字母被赋予一个数字,例如,a=0,b=1,c=2,…,z=25.仿射密码加密法的密钥为0~25之间的数字对(a,b)。
a与26的最大公约数必须为1,这就是说能整除a和26的数只有1.现在假设m为明文字母的数字,而c为密文字母的数字,那么,这两个数字之间有如下关系: c=(am+b)(mod 26)m=a-1(c-b)(mod 26)其中,(mod 26)的操作是:除以26,得其余数。
例如,选取密钥为(7,3)。
因为7与26互素,也就是只有公约数1,所以(7,3)可以作为仿射密码的加密钥。
将“hot”转换成数字7、14、19,利用仿射等式生成: c(H)=(7×7+3) mod 26=52 mod 26=0,即为字母“a“。
c(O)=(7×14+3) mod 26=101 mod 26=23,即为字母“x“.c(T)=(7×19+3) mod 26=136 mod 26=6,即为字母”g”. 这样,对于这个密钥,”hot”变成了“axg“.CAP4软件中实现仿射密码加密:步骤1:在CAP4软件中加载要加密地的明文“mw.txt“.步骤2:选取Cipher菜单下的Affine Cipher菜单项,弹出如下对话框,如图2-5所示。
实验报告实验五、Feistel网络实验目的:1. 熟练掌握Feistel网络结构原理及实现;2. 掌握Feistel网络结构的应用;实验内容:1、写出平衡Feistel网络结构加密运算的算法、程序设计。
在此假定(1)明文的长度为2mbit;(2)函数f(x,y)=x+y(布尔加);(3)子密钥不变,都等于密钥k,长度为mbit;(4)执行循环次数为r。
2、当m=16,r=3,k=11110000时给出下列明文的密文:(1)1111 1111 1111 1111(2)0000 0000 0000 0000(3)1111 0000 1111 0000(4)1010 1010 1010 1010(5)1101 0001 1111 0011实验结果:1平衡的Feistel网络设x是待加密的明文,长度为2m比特(bit)。
平衡的Feistel型分组密码的加密过程如下:(1)将明文x一分为二。
设x=L0R0,L0是左边的m比特,R0是右边的m比特。
(2)对于1<i<r,计算Li=Ri-1,Ri=Li-1+F(Ri-1,Ki),其中Li和Ri的长度都是m比特;F是一个加密函数,称为圈函数;Ki是由密钥k产生的长度为t比特的子密钥;+是按位模2加运算。
(3)密文为y=RrLr.平衡的Feistel型分组密码的解密过程是加密过程的逆运算。
实验程序如下:#include <stdio.h>#define max 100int i,m=8,r,j;int x[max],y1[max],y2[max],k[max],F[max];int f(int a,int b){if(a!=b) return 1;else return 0;}int w(int y1[],int y2[]){for (j=0;j<2*m;j++){if(j<m)x[j]=y1[j];else x[j+m]=y2[j];return x[j];}}int main(){printf("输入密钥k:\n");for (i=0;i<m;i++){scanf("%d",&k[i]);}printf("\n输入明文:\n");for (i=0;i<2*m;i++){scanf("%d",&x[i]);}while(r--){for (i=0;i<m;i++){if(i<m)y1[i]=x[i];else y2[i]=x[i+m];}for(i=0;i<m;i++){F[i]=f(y2[i],k[i]);}for (i=0;i<m;i++){y1[i]=y2[i];y2[i]=f(y1[i],F[i]);}w(y1,y2);}printf("\n");printf("结果为:\n");for (i=0;i<2*m;i++){printf("%d",x[i]);}printf("\n");return 0;}2.实验结果为:总结与分析:平衡的Feistel型分组密码的解密过程是加密过程的逆运算。
密码学教师:袁征2012年2月28日第二章古典密码及其破译序言古典密码是密码学的渊源,这些密码大都简单,可用手工或机械实现加解密,现在很少采用。
然而研究古典密码的原理,对理解、构造、分析现代密码都是十分有益的。
本章共分两节:第一节古典密码第二节古典密码的破译1、古典密码概述用你的经验如何设计一个密码算法?1、古典密码概述古典密码的形式很多,归纳起来有下面三种:类型一、代替密码体制类型二、移位密码体制类型三、乘积密码体制1、古典密码概述1. 用密码体制的概念,分析方格密码有什么特点?2. 能不能改进这个密码算法?1、古典密码概述1. 用密码体制的概念,分析单置换移位密码体制有什么特点?2. 能不能改进这个密码算法?1、古典密码概述1. 能不能把方格密码与单置换移位密码体制结合起来?2、基本数学知识1. 回顾学过的同余的概念、性质?2. 密码学中的运算基本上都是同余模运算。
例如:“凯撒密码”,它的原理是将26个英文字母分别用它后面的第3个英文字母代替,若分别以0~25表示英文字母a~z,用m表示“明文”,c表示密文,凯撒密码的加密算法是:E:c=m+3 (mod26) ,如下所示: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 ZD E F G H I J K L M N O P Q R S T U V W X Y Z A B C2、基本数学知识1. 7≡2(mod 5) ,2包含了整数中的什么数?二、剩余类环1.剩余类:所有模m和r(0≤r<m)同余的整数组成一个剩余类[r]。
例a:所有模5和2同余的整数组成一个剩余类[2],该剩余类中的元素有无穷多个:2、7、12、17、22…例b:模5的剩余类有[0]、[1]、[2]、[3]、[4] 。
练习:模26的剩余类有那些?2. 欧拉函数:剩余类[r]中与m互素的同余类的数目用Φ(m)表示,称Φ(m)是m的欧拉函数。
第一章基本概念1.密钥体制组成部分:明文空间,密文空间,密钥空间,加密算法,解密算法2、一个好密钥体制至少应满足的两个条件:(1)已知明文和加密密钥计算密文容易;在已知密文和解密密钥计算明文容易;(2)在不知解密密钥的情况下,不可能由密文c 推知明文3、密码分析者攻击密码体制的主要方法:(1)穷举攻击(解决方法:增大密钥量)(2)统计分析攻击(解决方法:使明文的统计特性与密文的统计特性不一样)(3)解密变换攻击(解决方法:选用足够复杂的加密算法)4、四种常见攻击(1)唯密文攻击:仅知道一些密文(2)已知明文攻击:知道一些密文和相应的明文(3)选择明文攻击:密码分析者可以选择一些明文并得到相应的密文(4)选择密文攻击:密码分析者可以选择一些密文,并得到相应的明文【注:以上攻击都建立在已知算法的基础之上;以上攻击器攻击强度依次增加;密码体制的安全性取决于选用的密钥的安全性】第二章古典密码(一)单表古典密码1、定义:明文字母对应的密文字母在密文中保持不变2、基本加密运算设q 是一个正整数,}1),gcd(|{};1,...,2,1,0{*q k Z kZ q Z q qq(1)加法密码加密算法:kX m Z Z YX q q ;,;对任意,密文为:qk m m E c k mod )()(密钥量:q (2)乘法密码加密算法:kX m Z Z YX qq ;,;*对任意,密文为:qkm m E ck mod )(解密算法:qc k c D mk mod )(1密钥量:)(q (3)仿射密码加密算法:),(;},,|),{(;21*2121k k kX mZ k Z k k k Z YX qq q 对任意;密文qm k k m E ck mod )()(21解密算法:qk c k c D m k mod )()(112密钥量:)(q q (4)置换密码加密算法:kX mZ Z YX q q ;,;对任意上的全体置换的集合为,密文)()(m m E ck 密钥量:!q 仿射密码是置换密码的特例3.几种典型的单表古典密码体制(1)Caeser 体制:密钥k=3 (2)标准字头密码体制:4.单表古典密码的统计分析(1)26个英文字母出现的频率如下:频率约为0.120.06到0.09之间约为0.04约0.015到0.028之间小于0.01 字母et,a,o,i.n,s,h,rd,lc,u,m,w,f,g ,y,p,b v,k,j,x,q,z【注:出现频率最高的双字母:th ;出现频率最高的三字母:the 】(二)多表古典密码1.定义:明文中不同位置的同一明文字母在密文中对应的密文字母不同2.基本加密运算(1)简单加法密码加密算法:),...,(,),...,(,,11n nn n qn qnnk k kX m m mZ Z YX对任意设,密文:),...,()(11n nk k m k m m E c密钥量:nq(2)简单乘法密码密钥量:nq)(1.简单仿射密码密钥量:nnq q)(2.简单置换密码密钥量:nq )!((3)换位密码密钥量:!n (4)广义置换密码密钥量:)!(nq (5)广义仿射密码密钥量:nnr q 3.几种典型的多表古典密码体制(1)Playfair体制:密钥为一个5X5的矩阵加密步骤: a.在适当位置闯入一些特定字母,譬如q,使得明文字母串的长度为偶数,并且将明文字母串按两个字母一组进行分组,每组中的两个字母不同。
乘法密码加密算法乘法密码加密算法是一种古典密码算法,也被称为“多表密码”,它在加密过程中利用了乘法运算的特性。
乘法密码算法由两个关键因素组成:一个是密钥,另一个是明文密码。
在加密过程中,明文密码中的每个字符被转换成一个数字,在密钥的影响下,通过乘法计算得到密文密码。
1.选择一个合适的密钥,通常是一个小于26的整数(比如5)。
2.将明文密码中的每个字符转换为对应的数字。
一种常见的转换方式是,将字母A-Z分别编号为0-253.对每个数字进行乘法计算,将密钥与其相乘。
得到的结果就是相应字符的密文密码数字。
4.将密文密码数字转换回字母,即可得到最终的密文密码。
举例说明:假设密钥为5,明文密码为HELLO。
将明文密码中的每个字母转换为数字:H-7,E-4,L-11,L-11,O-14对每个数字进行乘法计算:7*5=35,4*5=20,11*5=55,11*5=55,14*5=70。
最后,将这些结果转换为字母:35-?,20-?,55-?,55-?,70-?。
这些字母就是最终的密文密码。
解密过程与加密过程相反:1.使用相同的密钥,将密文密码中的每个字母转换为数字。
2.对每个数字进行除法计算,将其除以密钥。
得到的结果就是相应字符的明文密码数字。
3.将明文密码数字转换回字母,即可得到原始的明文密码。
1.加密过程简单,计算量较小。
2.密钥空间较小,只有小于26的整数。
因此,密钥容易被暴力破解。
3.密文中的字符保留有明显的语言特征,容易通过频率分析等方法进行破译。
4.乘法密码算法只适合对单个字母进行加密,对于多个字母组成的单词或短语,可能导致密文长度变长。
为增强乘法密码加密算法的安全性和效果,可以采取以下措施:1.使用更大的密钥空间:将密钥扩展为更大的整数,可以增加密钥的组合数量,提高密文的安全性。
2.引入模运算:将乘法结果对一个较大的数取模,可以减小密文数字的范围,提高密文的随机性和安全性。
3.使用多表密码:通过使用多个密码表,对不同字符进行乘法计算,可以增加密码空间,增强安全性。
多表古典密码的乘法加密运算
实验目的:
1. 熟练掌握多表古典密码简单乘法加密算法原理及实现;
2. 掌握多表古典密码简单乘法加密算法的应用;
实验内容:
1、写出多表(双表)古典密码的乘法加密运算的算法、程序设计;
2、输入模q(根据明文确定)及加密密钥k1,k2对下列明文进行加法加密:
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’.
(注:标点符号及空格也算一个符号,忽略大小)
3、求出相对应于上述q和k的解密密钥。
实验结果:
1.(1)写出多表古典密码简单乘法加密算法如下:
Step1:确定k和q的值;
Step2:输入相应的密文;
Step3:作变换c=(mi*ki) mod q,字母用ASCII码变为数字后计算;
Step4:得到相对应的明文;
Step5:逐一输出明文;
程序如下:
#include <stdio.h>
#include <stdio.h>
#include <time.h>
main()
{
char M[200];
char C[200];
int K[200],q=26,i,j;
srand( (unsigned)time( NULL ) );
for(j=0;j<=200;j++)
{
K[j]=rand()%50;
}
printf("please input chars:\n"); gets(M);
for(i=0;M[i]!='\0';i++)
{
if(M[i]>='a'&&M[i]<='z')
{
C[i]=((M[i]-'a'+1)*K[i])%q+'a';
}
else if(M[i]>='A'&&M[i]<='Z') {
C[i]=((M[i]-'A'+1)*K[i])%q+'A'; }
else
C[i]=M[i];
}
C[i]='\0';
printf("The result is:\n%s\n",C);
getch();
}
2.进行乘法加密后的结果为:
3.解密密钥为:m[i]=k[i]d*c[i] mod q
总结与分析:
程序设计过程中,运用C++环境运行时需要注意程序的综合运用,不同的运行环境下,需对程序做相应的改变。
通过本次试验,进一步了解了多表古典密码简单乘法加密算法原理及实现;掌握了多表古典密码简单乘法加密算法的应用;
附件:
Ch4 多表(双表)古典密码的乘法加密运算的程序设计文件
注:实验结束,将所有材料打包(文件采用统一格式:sn1-学号,以后的实验资料采用类似的文件格式)压缩并发送到:hzsx2004@。