仿射密码

仿射密码一.仿射密码​仿射密码是一种古典密码,它是通过对明文中的每个字符进行数学变换来加密消息的。这种加密方法最初被使用于古罗马时期,凯撒密码就是一种简单的仿射密码。在现代密码学中,仿射密码已经不再被视为安全的加密方法,因为它容易受到各种攻击,如频率分析攻击和线性密码分析攻击。然而,仿射密码仍然具有教育

大家好,欢迎来到IT知识分享网。

一.仿射密码

​ 仿射密码是一种古典密码,它是通过对明文中的每个字符进行数学变换来加密消息的。这种加密方法最初被使用于古罗马时期,凯撒密码就是一种简单的仿射密码。在现代密码学中,仿射密码已经不再被视为安全的加密方法,因为它容易受到各种攻击,如频率分析攻击和线性密码分析攻击。然而,仿射密码仍然具有教育意义,可以帮助初学者了解密码学的基本概念和技术。

二.基本原理

​ 仿射加密是一种基于数学运算的对称加密技术,其原理是使用一个仿射变换来对明文进行加密。

2.1加密

具体来说,仿射加密需要选择两个整数a和b作为加密密钥。加密过程中,先将明文中的每个字符对应到一个数字上(比如A对应0,B对应1等),形成一个数字序列。然后,对该数字序列中的每个数字x,执行下面的运算:

y = (ax + b) mod m

其中,m是字母表大小(比如26,如果只考虑大写字母的话),mod表示模运算,即取余数。这样得到的y就是该数字的加密结果。最后,将每个加密结果对应到相应的字母上(比如0对应A,1对应B等),就得到了加密后的密文。

2.2解密

解密过程与加密过程相似,也是选择两个整数a和b作为解密密钥,并将密文中的每个字符对应到一个数字上,再执行下面的运算:

x = a^-1(y – b) mod m

其中,a-1表示a的逆元,也就是满足aa-1 ≡ 1 (mod m)的整数。这样得到的x就是该数字的解密结果。最后,将每个解密结果对应到相应的字母上,就得到了原始的明文。

三.优缺点

3.1优点

  • 仿射密码简单易懂,容易实现和使用。

  • 加密速度快,因为使用的是基本的算术运算。

  • 支持多种语言,包括中文、英文等。

  • 提供了一定程度的安全保障,可以用于一些低级别的加密需求。

3.2缺点

  • 安全性较低,容易受到暴力激活成功教程和频率分析等攻击。

  • 密钥空间较小,只有 2626种可能的密钥。

  • 容易受到已知明文攻击。

  • 不支持数字和标点符号等特殊字符的加密。

总体而言,由于仿射密码的安全性相对较弱,因此在现代加密技术中很少被使用。

四.补充

4.1参数说明

仿射密码的解密过程中,存在求逆元这一步,而要使其逆元存在,基本要求是参数a必须与总字母数m互质

4.2字母表说明

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
0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25

在本次实验中,我们定义每个字母代表的数字如上所示。

五.C语言实现

#include<stdio.h>
#include<string.h>

#define Maxsize 50    //定义最大传送信息量

//加密函数
void jiami(char *&p,int a,int b)
{
	printf("密文:");
	for(int i=0;i<strlen(p)-1;i++)
	{
		printf("%c",(char)(((p[i] + 'a' - 97*2)*a+b)%26+97));
	}
	printf("\n");
}

// 求逆元
int mod_inverse(int a, int m)
{
	int x, y, q, r1 = m, r2 = a, r, t1 = 0, t2 = 1, t;
	while (r2 > 0) {
		q = r1 / r2;
		r = r1 - q * r2;
		r1 = r2;
		r2 = r;
		t = t1 - q * t2;
		t1 = t2;
		t2 = t;
	}
	x = t1;
	if (x < 0) {
		x += m;
	}
	return x;
}

//解密函数
void jiemi(char *&q,int x,int b)
{
	printf("明文:");
	for(int i=0;i<strlen(q);i++)
	{
		printf("%c",(char)((((q[i]+'a'-97*2)-b)*x)%26+97));
	}
}

int main() 
{
	char str1[Maxsize],str2[Maxsize];
	char *p=str1,*q=str2;         //两个数组指针,分别代替明文、密文
	int a,b;
	printf("请输入明文:");
	fgets(str1, Maxsize, stdin);
	printf("请输入移位密匙系数1:");
	scanf("%d",&a);
	printf("请输入移位密匙系数2:");
	scanf("%d",&b);
	jiami(p,a,b);                    //加密测试
	printf("------------------");
	printf("\n");
	printf("请输入密文:");
	printf("\n");
	scanf("%s",str2);
	int x=mod_inverse(a,26);
	jiemi(q,x,b);                 //解密函数
}

六.实验结果

isUh.jpg

免责声明:本站所有文章内容,图片,视频等均是来源于用户投稿和互联网及文摘转载整编而成,不代表本站观点,不承担相关法律责任。其著作权各归其原作者或其出版社所有。如发现本站有涉嫌抄袭侵权/违法违规的内容,侵犯到您的权益,请在线联系站长,一经查实,本站将立刻删除。 本文来自网络,若有侵权,请联系删除,如若转载,请注明出处:https://yundeesoft.com/30869.html

(0)

相关推荐

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注微信