仿射密码


加密方法:每个字母通过计算 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

参考文章

仿射密码 - Hk_Mayfly - 博客园仿射密码 - Hk_Mayfly - 博客园