Bugku-CTF加密篇之affine(y = 17x-8 flag{szzyfimhyzd})


affine

y = 17x-8 flag{szzyfimhyzd}
答案格式:flag{*}
來源:第七屆山東省大學生網絡安全技能大賽
 
 
 
本題要點:仿射加密
 
 
看到這道題目有點懵.....題目是affine.....查看中文釋義是仿射。
 
查閱資料,什么是仿射密碼呢?
 
 
  仿射加密法 
 
在仿射加密法中,字母表的字母被賦予一個數字,例如  a=0,b=1,c=2…z=25 。仿射加密法的密鑰為0-25直接的數字對。
仿射加密法與單碼加密法沒什么不同,因為明文的每個字母分別只映射到一個密文字母。
仿射密碼的加密算法就是一個線性變換,即對任意的明文字符x,對應的密文字符為 ,其中,a,b∈ ,且要求gcd(a,26)=1,函數e(x)稱為仿射加密函數。
 
注意:
注1. 仿射加密函數要求gcd(a,26)=1,即要求a和26互素,否則 就不是一個單射函數。
注2. 從仿射加密函數的表達式易知,當a=1,b=3時,這種仿射密碼就是著名的凱撒密碼。
注3. 在求解仿射解密函數時,需要求a在 上的乘法逆元 這可由擴展歐幾里得算法求解,下表列出了在 上所有與26互素元素的乘法逆元:
 
  舉個栗子~ 
 
假設e(x)為密文,x為明文。
設仿射加密函數是
由上表知: 所以相應的仿射解密函數是
若加密明文是   sorcery  ,首先把明文每個字母轉換為數字  18,14,17,2,4,17,24 。然后對明文進行加密,這里以第一個字母s為例:
 
e(x)=(11*18+6)mod 26
e(x)=204 mod 26
e(x)=22 
 
對照下表:
 
 

 

 

 

 
依次解密,最后得密文為    welcylk 
 
 
那么,我們根據這個原理,寫一個腳本解密一下~
(這里又要借用大佬的py腳本了~)
 
flag = "szzyfimhyzd"
flaglist = []
for i in flag:
    flaglist.append(ord(i)-97)
flags = ""
for i in flaglist:
    for j in range(0,26):
        c = (17 * j - 8) % 26
        if(c == i):
            flags += chr(j+97)
print(flags)

 

 
 
 
 
得到結果~~
 
 
 
提交  flag{affineshift} 
 
 
 
 
 
 
 
參考資料:
 
https://baike.baidu.com/item/仿射加密法/1708885?fr=aladdin
https://blog.csdn.net/qq_42777804/article/details/91484576
 
 
 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM