古典密码-仿射密码Affine

仿射密码Affine基础知识

仿射密码属于一种替换密码,通过对一个字母使用加密函数(模运算)生成另外一个字母(某些情况下,不只是字母)。

加密函数:

\[E(x) ≡ (ax + b) (mod\ m) \]

  • a、b:函数的参数部分,不同的加密有不同的值
  • m:字母的数量,一般值为26、32等
  • a与m互质

解密函数:

\[D(x) ≡ a^{-1}(x-b)(mod\ m) \]

  • \(a^{-1}\)是a关于模m的乘法逆元

上述解密函数的式子是相对于加密函数而言的,特殊情况下(直接要得到解密函数的参数时)可以直接设解密函数为y = a*x + b (mod Z)

仿射密码wiki

举个栗子

加密

以加密函数 \(E(x) = (5x + 8) (mod 26)\) 为例,以字母表26个字母作为编码系统

明文 A F F I N E C I P H E R
x 0 5 5 8 13 4 2 8 15 7 4 17
y = 5x+8 8 33 33 48 73 28 18 48 83 43 28 93
y mod 26 8 7 7 22 21 2 18 22 5 17 2 15
密文 I H H W V C S W F R C P

对应的加密结果为:IHHWVCSWFRCP

解密

在已知a = 5,m = 26的情况下,我们需要求a关于模m的逆元,

根据乘法逆元的定义,我们可以得到如下式子:

\[a·a^{-1} ≡ 1 (mod\ m) \]

带入参数,有\(5·a^{-1} ≡ 1(mod 26)\) ,可以得到\(a^{-1}\) = 21

因此解密函数为:\(D(x) = 21(x - 8) (mod 26)\)

密文 I H H W V C S W F R C P
y 8 7 7 22 21 2 18 22 5 17 2 15
x = 21(y−8) 0 -21 -21 294 273 -126 210 294 -63 189 -126 147
x mod 26 0 5 5 8 13 4 2 8 15 7 4 17
明文 A F F I N E C I P H E R

解密后的明文结果为:AFFINECIPHER

相关题目

题目来源:https://adworld.xctf.org.cn/task/answer?type=crypto&number=5&grade=1&id=5535&page=1

题目信息

wK3GgH.png

题目分析

  1. 改题目源自bitsctf-2017,对BITSCTF这几个字符进行base32加密得到IJEVIU2DKRDA==== base32加密网站
  2. 与文件所给的字符进行对比
M Z Y V M I W L G B L 7 C
I J E V I U 2 D K R D A ====

可以看到M和I一直都是对应的,故想到移位加密和仿射加密,易排除移位加密

  1. 反射密码的解密需要解密函数,但这里并没有解密函数,我们需要先得到解密函数
for a in range(-20,20):
    for b in range (-20,20):
        if (a*12+b)%32 == 8 and (a*25+b)%32 == 9:
            print(a,b)

可以得到a=5 b=12(多增加IF处的判断语句就可以更加精确)

  1. 得到了ab,使用解密公式y = a*x+b (mod32)
c = "MZYVMIWLGBL7CIJOGJQVOA3IN5BLYC3NHI"
sn = "ABCDEFGHIJKLMNOPQRSTUVWXYZ234567"
msg = ""
for i in c:
    msg += str(sn[(5*sn.find(i)+12)%32])
print(msg)

得到IJEVIU2DKRDHWUZSKZ4VSMTUN5RDEWTNPU

放入base32解密得到BITSCTF{S2VyY2tob2Zm}

参考资料

https://www.cnblogs.com/Mayfly-nymph/p/12394329.html

https://www.bilibili.com/video/BV1Gh411o7vM?t=332

https://www.bilibili.com/video/BV1qE411i7Zq?t=535

fanqiang

仿射密码wiki

[仿射密码ctf-wiki](

posted @ 2020-09-07 23:06  labster  阅读(1452)  评论(0编辑  收藏  举报