ICode9

精准搜索请尝试: 精确搜索
首页 > 其他分享> 文章详细

仿射密码的学习

2021-02-27 21:02:41  阅读:430  来源: 互联网

标签:26 get 学习 密码 逆元 y1 仿射 remainder


原理

仿射密码是一种表单代换密码,字母表的每个字母相应的值使用一个简单的数学函数对应一个数值,再把对应数值转换成字母。
在这里插入图片描述
加密函数:E(x) = (ax + b) (mod m),其中 a与m互质,x表示明文按照某种编码得到的数字,m是编码系统中字母的个数(通常都是26)。

解密函数:D(x) = a^{-1} (x - b) (mod m),其中 a^{-1} 是 a 在Z_{m}群的乘法逆元。

乘法逆元

了解一下乘法逆元
欧几里得算法求解乘法逆元——Python

#欧几里得算法求最大公约数
def get_gcd(a, b):
	k = a // b
	remainder = a % b
	while remainder != 0:
		a = b 
		b = remainder
		k = a // b
		remainder = a % b
	return b
	
#改进欧几里得算法求线性方程的x与y
def get_(a, b):
	if b == 0:
		return 1, 0
	else:
		k = a // b
		remainder = a % b		
		x1, y1 = get_(b, remainder)
		x, y = y1, x1 - k * y1			
	return x, y
	
a, b = input().split()
a, b = int(a), int(b)
 
#将初始b的绝对值进行保存
if b < 0:
	m = abs(b)
else:
	m = b
flag = get_gcd(a, b)
 
#判断最大公约数是否为1,若不是则没有逆元
if flag == 1:	
	x, y = get_(a, b)	
	x0 = x % m #对于Python '%'就是求模运算,因此不需要'+m'
	print(x0) #x0就是所求的逆元
else:
	print("Do not have!")

比如求5关于模26的乘法逆元
在这里插入图片描述

理解原理之例子

下面举个例子
加密:
我们以 E(x)

脚本

下面是关于求仿射密码的python3脚本(自己写的,有错请指正):

#仿射密码解密
#改进欧几里得算法求线性方程的x与y
def get(a, b):
    if b == 0:
        return 1, 0
    else:
        k = a //b
        remainder = a % b
        x1, y1 = get(b, remainder)
        x, y =y1, x1 - k * y1
    return x, y
 
s = input("请输入解密字符:").upper()
a = int(input("请输入a:"))
b = int(input("请输入b:"))
 
#求a关于26的乘法逆元
x, y = get(a, 26)
a1 = x % 26
 
l= len(s)
for i in range(l):
    cipher = a1 * (ord(s[i])- 65 - b) % 26
    res=chr(cipher + 65)
    print(res, end='')

在这里插入图片描述

深度破解

首先,我们可以看到的是,仿射密码对于任意两个不同的字母,其最后得到的密文必然不一样,所以其也具有最通用的特点。当密文长度足够长时,我们可以使用频率分析的方法来解决。

其次,我们可以考虑如何攻击该密码。可以看出当a=1

时,仿射加密是凯撒加密。而一般来说,我们利用仿射密码时,其字符集都用的是字母表,一般只有26个字母,而不大于26的与26互素的个数一共有

ϕ(26)=ϕ(2)×ϕ(13)=12

算上b的偏移可能,一共有可能的密钥空间大小也就是

12×26=312

一般来说,对于该种密码,我们至少得是在已知部分明文的情况下才可以攻击。下面进行简单的分析。

这种密码由两种参数来控制,如果我们知道其中任意一个参数,那我们便可以很容易地快速枚举另外一个参数得到答案。

但是,假设我们已经知道采用的字母集,这里假设为26个字母,我们还有另外一种解密方式,我们只需要知道两个加密后的字母 y1,y2

即可进行解密。那么我们还可以知道

y1=(ax1+b)(mod26) y2=(ax2+b)(mod26)

两式相减,可得

y1−y2=a(x1−x2)(mod26)

这里 y1,y2

已知,如果我们知道密文对应的两个不一样的字符 x1 与 x2 ,那么我们就可以很容易得到 a ,进而就可以得到 b 了。

破解举例

放射密码分析目标:求a,b
方法:求出频率最高的两个字母,只需要猜出两个字母的变换,就能得到a,b
英文统计规律:
在这里插入图片描述
我们用CAP来分析一个例子
密文:FMXVEDKAPHFERBNDKRXRSREFMORUDSDKDVSHVUFEDKAPRKDLYEVLRHHRH
频率分析:
我们可以看到r(8次)和d(7次)最高
在这里插入图片描述
根据英文明文分布规律,我们假设r对应e,d对应t,r的序号是17,e是4,d是3,t是19
所以我们可以列出两个方程
17=(4a+b)mod26
3=(19a+b)mod26
解出方程a=6,b=19

因为a和26现在的最大公约数是2,不是1,所以假设不成立
我们继续假设r是e的加密,e是t的加密,得到a=8,不满足,继续假设r是e的加密,k是t的加密,a=3,b=5,是一个合法的秘钥。
点击ciphers中的Affine,
在这里插入图片描述
a,b分别填3,5,解密,得到明文algorithmsarequitegeneraldefinitionsofarithmeticprocesses
在这里插入图片描述
从上面看出,对放射密码的破解,一次假设可能不会成功,我们要多次假设才能得到我们想要的结果
假设一般频率最高的不动,如果不满足,次高的换

标签:26,get,学习,密码,逆元,y1,仿射,remainder
来源: https://blog.csdn.net/qq_51558360/article/details/114186572

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有