題目如下所示然痊,考點(diǎn)是仿射密碼:
題目.png
下面是對仿射密碼的一個(gè)簡介,仿射密碼對相同字母加密后的結(jié)果是一樣的屉符,這是一個(gè)入手點(diǎn):
仿射密碼.png
題目說這是一個(gè)圖片文件玷过,一般想到有png和jpg兩種,先看下一張普通png圖片的hex數(shù)據(jù):
png圖片
bin文件.png
可以看到明顯和題目給的bin文件有相同的重復(fù)筑煮,說明這個(gè)bin文件就是png圖片經(jīng)過仿射密碼加密得到的辛蚊,一般一個(gè)簡單的仿射密碼的字母表長度為英文字母的總數(shù)26,而這里應(yīng)該是ascii碼的總數(shù)256真仲,所以需要在網(wǎng)上找到的腳本上改下關(guān)鍵數(shù)值袋马,目前我們已知了部分明文,就可以通過這部分得到密鑰key秸应,也就是a和b的值虑凛,之后再算出a的逆元,就可以decode出原來的圖片了软啼,爆破腳本如下所示:
#coding:utf-8
png = [0x89, 0x50, 0x4e, 0x47, 0x0d, 0x0a, 0x1a, 0x0a]
zakukozh = [0x60, 0x09, 0xeb, 0x82, 0x1c, 0xef, 0xdf, 0xef]
for a in range(3,256):
for b in range(0,256):
x=[]
for i in range(len(png)):
x.append((a*png[i]+b)%256)
if x == zakukozh:
print a,b
exit(0)
結(jié)果
得出結(jié)果a=15桑谍,b=89,可以再計(jì)算下a的逆元祸挪,也是通過爆破的方式:
#coding:utf-8
png = [0x89, 0x50, 0x4e, 0x47, 0x0d, 0x0a, 0x1a, 0x0a]
zakukozh = [0x60, 0x09, 0xeb, 0x82, 0x1c, 0xef, 0xdf, 0xef]
b=89
for a in range(3,256):
x=[]
for i in range(len(zakukozh)):
x.append(a*(zakukozh[i]-b)%256)
if x == png:
print a,b
exit(0)
結(jié)果
可以得出a的乘法逆元為239锣披,現(xiàn)在就可以復(fù)原png圖片了,將decode的每一個(gè)字節(jié)寫入即可:
f=open("zakukozh.bin",'rb')
f1=open("flag.png",'wb')
a=239
b=89
x=''
for i in f.read():
x+=chr(a*(ord(i)-b)%256)
f1.write(x)
f.close()
f1.close()
圖片.png