首页 > 编程知识 正文

仿射密码算法,仿射密码解密算法例题

时间:2023-05-06 19:24:59 阅读:186233 作者:2088

所述仿射密码的原理仿射密码的加密函数是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! () ) ) ) )。

版权声明:该文观点仅代表作者本人。处理文章:请发送邮件至 三1五14八八95#扣扣.com 举报,一经查实,本站将立刻删除。