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