仿射密碼解析與例項

2021-08-21 11:56:27 字數 2554 閱讀 3222

仿射密碼的加密函式是 e(x)=(ax+b)(modm),其中

解密函式是 d(x)=a−1(x−b)(modm),其中 a−1 是 a 在 zm群的乘法逆元。

下面我們以 e(x)=(5x+8)mod26函式為例子進行介紹,加密字串為affine cipher,這裡我們直接採用字母表26個字母作為編碼系統

其對應的加密結果是ihhwvcswfrcp。對於解密過程,正常解密者具有a與b,可以計算得到 a−1為 21,所以其解密函式是d(x)=21(x−8)(mod26),解密如下

可以看出其特點在於只有 26 個英文本母。

首先,我們可以看到的是,仿射密碼對於任意兩個不同的字母,其最後得到的密文必然不一樣,所以其也具有最通用的特點。當密文長度足夠長時,我們可以使用頻率分析的方法來解決。

其次,我們可以考慮如何攻擊該密碼。可以看出當a=1時,仿射加密是凱撒加密。而一般來說,我們利用仿射密碼時,其字符集都用的是字母表,一般只有26個字母,而不大於26的與26互素的個數一共有ϕ(26)=ϕ(2)×ϕ(13)=12算上b的偏移可能,一共有可能的金鑰空間大小也就是12×26=312

一般來說,對於該種密碼,我們至少得是在已知部分明文的情況下才可以攻擊。下面進行簡單的分析。

這種密碼由兩種引數來控制,如果我們知道其中任意乙個引數,那我們便可以很容易地快速列舉另外乙個引數得到答案。

但是,假設我們已經知道採用的字母集,這裡假設為26個字母,我們還有另外一種解密方式,我們只需要知道兩個加密後的字母 y1,y2即可進行解密。那麼我們還可以知道

y1=(ax1+b)(mod26)

y2=(ax2+b)(mod26)

兩式相減,可得y1−y2=a(x1−x2)(mod26)

這裡 y1,y2已知,如果我們知道密文對應的兩個不一樣的字元 x1 與 x2 ,那麼我們就可以很容易得到 a ,進而就可以得到 b 了。

這裡我們以twctf 2016 的 super_express為例進行介紹。簡單看一下給的原始碼

import sys

key = '**********ed***************'

flag = 'twctf'

if len(key) % 2 == 1:

print("key length error")

sys.exit(1)

n = len(key) / 2

encrypted = ''

for c in flag:

c = ord(c)

for a, b in zip(key[0:n], key[n:2*n]):

c = (ord(a) * c + ord(b)) % 251

encrypted += '%02x' % c

print encrypted

可以發現,雖然對於 flag 中的每個字母都加密了 n 次,如果我們仔細分析的話,我們可以發現

c1=a1c+b1

c2=a2c1+b2

=a1a2c+a2b1c+b2

=kc+d

根據第二行的推導,我們可以得到其實 cn也是這樣的形式,可以看成 cn=xc+y,並且,我們可以知道的是,key 是始終不變化的,所以說,其實這個就是仿射密碼。

此外,題目中還給出了密文以及部分部分密文對應的明文,那麼我們就很容易利用已知明文攻擊的方法來攻擊了,利用**如下

import gmpy

key = '**********ed****************'

flag = 'twctf'

f = open('encrypted', 'r')

data = f.read().strip('\n')

encrypted = [int(data[i:i + 2], 16) for i in range(0, len(data), 2)]

plaindelta = ord(flag[1]) - ord(flag[0])

cipherdalte = encrypted[1] - encrypted[0]

a = gmpy.invert(plaindelta, 251) * cipherdalte % 251

b = (encrypted[0] - a * ord(flag[0])) % 251

a_inv = gmpy.invert(a, 251)

result = ""

for c in encrypted:

result += chr((c - b) * a_inv % 251)

print result

結果如下:

➜  twctf2016-super_express git:(master) ✗ python exploit.py

twctf

仿射密碼與擴充套件歐幾里德變換

仿射密碼簡介 仿射密碼和移位密碼一樣,也是一種替換密碼.不同的是,移位密碼中,我們使用的是模n加 而在下面的仿射密碼中,我們使用的上一節中介紹的模n乘.在安全性方面,仿射密碼同移位密碼一樣,都是極其差的,不僅因為他們的原理簡單,更要命的是這兩種替換密碼沒有隱藏明文的字頻資訊,這很容易導致破解者輕易的...

770 仿射密碼 暴力列舉

時間限制 1000 ms 記憶體限制 65535 kb 難度 1 描述 仿射密碼是替換密碼的另乙個特例,可以看做是移位密碼和乘數密碼的結合。其加密變換如下 e m k1 m k2 mod q 其中k1,k2為金鑰,且0現已知一經過仿射加密的密文和金鑰,請破譯出它的明文。輸入 輸入包含不超過1000組...

加密技術 仿射密碼

今天上午一二節課上了資訊保安概論,講到加密技術,有點好奇,怎麼實現加密和解密,移位密碼挺簡單,仿射密碼用到仿射函式 e x ax b mod 26 且a與26的最大公因子為1。金鑰就是a,b。這個函式我開始理解錯了,我以為ax加上b模除26後的結果,後來問了下老師再知道自己弄錯了,是ax b以後再模...