前言
1.仿射密码
仿射密码是一种基于数学运算的加密算法,它将明文中的每个字母通过一系列的数学变换,转化为密文中的一个字母。
具体算法:
设明文中的一个字母为x,加密后的字母为y,加密密钥为(a, b),则仿射密码的加密公式为:
y = (ax + b) % n
其中,n为字母表的大小(通常为26),% 表示取余运算。
换算:
为了解密密文,需要求出加密密钥的逆元,然后按照逆元的公式进行解密。
设密文中的一个字母为y,解密后的字母为x,加密密钥为(a, b),则仿射密码的解密公式为:
x = a' * (y - b) % n
其中,a'为a的逆元,% 表示取余运算。
2.逆元
逆元,指在模运算下,对于给定的整数a和模数m,如果存在一个整数x,使得(a * x) % m = 1,则称x为a在模m下的逆元。逆元在密码学中有重要的作用,例如在RSA算法、ElGamal算法、椭圆曲线密码等密码算法中均有应用。
具体算法:
暴力枚举算法:枚举[0, m-1]之间所有数x,逐一验证(a * x) % m是否等于1,时间复杂度为O(m)。
扩展欧几里得算法:根据扩展欧几里得算法,可以在O(log m)的时间复杂度内求出a在模m下的逆元。具体算法步骤如下:
(1)使用欧几里得算法求出a和m的最大公约数d,如果d不等于1,则a在模m下不存在逆元。
(2)求出方程 ax + my = d 的一组整数解(x0, y0),可以使用扩展欧几里得算法求解。
(3)方程 ax + my = d 的任意一组整数解(x, y) 都可以表示为(x0 + tm, y0 - tn),其中t为任意整数。
(4)如果将等式 ax = 1 - my 代入其中,得到 x = x0 + t(m/d),由于x是a在模m下的逆元,因此x需要满足0 <= x < m。
(5)因此,求出x = (x0 + t(m/d))%m,即为a在模m下的逆元。
简单案例:
例如,计算在模26下,字母D的逆元。由于D在字母表中是第4个字母(A为第0个字母),因此D在模26下的值为4。要求D的逆元,需要找到一个整数x,满足(4 * x) % 26 = 1。通过暴力枚举,可以验证当x等于7或者19时,满足条件。因此D在模26下的逆元为7或者19。
一、affine
1.打开题目
2.解题
ord(i)函数是Python中的一个内置函数,用于获取一个字符的ASCII码值,即字符对应的整数表示。例如,ord('a')返回数值97,ord('b')返回数值98,以此类推。
在ASCII码表中,小写字母a的ASCII码值为97,因此ord(i)-97表示将字符i转换为小写字母a的偏移量,也就是i与a之间的距离。例如,当i等于'b'时,ord(i)返回数值98,减去97后得到1,表示'b'与'a'相差1个单位。这个偏移量在密码学中常常用来进行模运算和数组索引操作。例如,在Caesar密码中,就使用了这个偏移量对明文进行加密,具体方法是将明文中的每个字母都向后移动k个单位,其中k为给定的密钥。
flag = "szzyfimhyzd"
flaglist = []#取与a位置的偏移量
for i in flag:
flaglist.append(ord(i)-97)
flags = ""
for i in flaglist:
for j in range(0,26):
#计算逆元
c = (17 * j - 8) % 26
#偏移量=逆元
if(c == i):
flags += chr(j+97)
print(flags)
得到flag:flag{affineshift}