所述仿射密码的原理仿射密码的加密函数是e(x )=(AXB ) ) modm )。 在这里
x表示通过有明文的编码得到的数字a和m是编码系统的字母数。 解码函数为d(x )=a1-XB )modm,其中a-1为Zm群中a的乘法的倒数。
以e(x )=) 5x8) mod26函数为例。 加密字符串是AFFINE CIPHER,这里直接采用26个字母作为编码系统
其对应的加密结果是IHHWVCSWFRCP。 对于解码过程,正常解码者具有a和b,由于可以计算出a1为21,所以其解码函数为d(x )=21 ) x8 ) mod26 ),解码如下
特点是字母只有26个字。
首先,可以看出仿射密码具有最常见的特征,因为对于任意两个不同的字符,最后得到的密文必然不同。 如果密文长度足够长,可以用频率分析的方法解决。
接下来,考虑一下如何攻击密码。 a=1时,可知仿射加密是普通的草丛。 一般来说,我们使用仿射密码时,其字符集使用的是字母,通常只有26个字符。 另外,考虑到26以下的26互素的数量为(26 )=12) ) 13 )=12和b的可偏移性,可以共享的密钥空间的大小为1226=312
一般来说,只有至少部分明确的情况下,才能攻击此类密码。 让我做个简单的分析。
这个密码由两个参数控制。 如果您知道其中一个参数,则可以轻松枚举另一个参数以获得答案。
但是,假设您知道已经采用的字符集。 这里设定为26个字符。 还有一种解密方式。 如果知道两个加密的字符y1、y2就可以解密。 我们还知道
y1=(ax1b ) (模26 ) )。
y2=(ax2b ) (mod26 ) )
减去两个表达式,得到y1y2=a(x1x2) (mod26 )
在此,y1、y2如果知道与密文相对应的两个不同的字符x1和x2,就可以容易地得到a,进而得到b。
示例此处以TWCTF 2016的super_express为例进行介绍。 简单查看给定的源代码
import syskey=' * * * * * censored * * * * * * * flag=' tw CTF { * * * * * * * * * censored * * * * * } ' n=len () key[n:2*n](:c=(ord(a ) cord ) b ) ) 251加密=' x ' % cprintencrypted加密了标志的每个字符n次,但小心翼翼地
c1=a1c b1
c2=a2c1 b2
=a1a2c a2b1c b2
=kc d
根据第2行的导出,实际上cn也是这样的形式,可以看作cn=xc y。 而且,因为key总是不变的,所以你会发现实际上这是仿射密码。
另外,由于标题中还显示了密文和与部分密文对应的明文,所以很容易用已知明文攻击的方法进行攻击。 使用代码如下
importgmpykey=' * * * * * censored * * * * * * * * * flag=' tw CTF { * * * * * * * } n ' ) encrypted=[ int ] 2 ) plainDelta=ord(flag[1]-ord ) flag [0] (cipherdalte=encrypted (1)-encrypted) a=gmpy.invert ) ) 251 ) cipherdalte % 1b=(encrypted [0]-a* ord (flag [0] ) ) 251a_inv=gmpy.invert ) a,251 ) result='
tw CTF 2016-super _ express git : (master ) python exploit.pytw CTF { faster _ than _ frd dy! () ) ) ) )。