仿射密码
加密方法:每个字母通过计算 c = (a*x + b) mod m 转换为另一个字母。
解密方法:每个字母通过计算 x = a_inv * (c - b) mod m 转换回原始字母,其中 a_inv 是 a 关于 m 的模反元素。
要求:
gcd(a,m)=1
'''
仿射密码
加密方法:每个字母通过计算 c = (a*x + b) mod m 转换为另一个字母。
解密方法:每个字母通过计算 x = a_inv * (c - b) mod m 转换回原始字母,其中 a_inv 是 a 关于 m 的模反元素。
要求:
gcd(a,m)=1
'''
import gmpy2
table='abcdefghijklmnopqrstuvwxyz'
def encrypt(plain,a,b,m=26): # 加密函数
c=''
for char in plain:
if char in table:
x=ord(char)-ord('a')
y=(a*x+b)%m
c+=table[y]
else:
c+=char
return c
def decrypt(c,a,b,m=26): # 解密函数
if gmpy2.gcd(a,m)!=1:
return exit(print('a={}与m={}不互质,无法解密!'.format(a,m)))
a_inv=int(gmpy2.invert(a,m))
plain=''
for char in c:
if char in table:
y=ord(char)-ord('a')
x=(a_inv*(y-b))%m
plain+=table[x]
else:
plain+=char
return plain
def bp(cyber,m=26): # 爆破函数
res=[]
for a in range(1,26,2):
try:
if gmpy2.gcd(a,m)==1:
for b in range(26):
plain=decrypt(cyber,a,b)
res.append((a,b,plain))
except:
pass
return res
# 一次做题记录
a=11
b=7
c='dikhkkruz'
res=decrypt(c,a,b)
print('cipher:',c)
print('decrypt:',res)
print('----------------------------------------------------\nend!')
# ctfaffine