定义:仿射密码是一种简单的单表替换密码,类似于凯撒密码,每一个字母对应一个数字,如下图:

img

加密函数:

E(x) = (ax + b) (mod m) ,其中要求a m两个数互质,m为加密字母的个数,通常下取26,b为移动大小

范例:

y = E(x)= (5x+8) mod26

加密字符串为 AFFINE CIPHER ,对照上表依次找到各个字母所对应的数字,按照加密函数进行计算,如下图:

img

加密后得到的密文为 IHHWVCSWFRCP

通过加密原理,编写加密代码如下:

a = 5
b = 8
cipher ="AFFINECIPHER"
flag = ""
for i in cipher :
    cha = ord(i)-ord("A")
    flag+=chr((a*cha+b) % 26+ord("A"))
print(flag)

解密函数:

D(x) =a^(-1)(x – b) (mod m) ,其中a^(-1)为乘法逆元

乘法逆元定义:若在mod p意义下,对于一个整数a,有a*x ≡ 1(mod p),那么这个整数x即为a的乘法逆元,同时a也为x的乘法逆元

即(a/b)%p = a*(b的逆元)%p

求解过程:根据费马小定理,当a不是p的倍数时,a^(p-1) ≡ 1 (mod p)

转换为a * a^(p-2) ≡ 1 (mod p),根据定义则a^(p-2)为乘法逆元

转换为等式 a %p * (a^(p-2)) % p ≡ 1 %p,则 (a^(p-2)) % p 为所计算的逆元

求出逆元后,带入解密函数中,计算并对照字母表

范例:

D(y) = 21(y-8) mod 26

将密文 IHHWVCSWFRCP 依次进行计算

img

通过解密原理,编写解密代码如下:

import gmpy2
a = 5
b = 8
cipher ="IHHWVCSWFRCP"
e = gmpy2.invert(5,26)
flag =""
for i in cipher:
    cha = ord(i)-ord("A")
    flag+=chr((e *(cha - b)) % 26 + ord("A") )
print (flag)

例题:

密文:kgws{m8u8cm65-ue9k-44k5-8361-we225m76eeww}
k1:123456
k2:321564

根据kgws == flag 求得仿射密码中的a b