希尔密码
云影密码
题一
[HDCTF2023]–爬过小山去看云
题目描述:
密文:ymyvzjtxswwktetpyvpfmvcdgywktetpyvpfuedfnzdjsiujvpwktetpyvnzdjpfkjssvacdgywktetpyvnzdjqtincduedfpfkjssne
在山的那头,有3个人,4只鸟,19只羊,11朵云
题目分析:
- 小山 --> hill --> 希尔密码
- 直接使用在线网站解决即可,得到:
yourpiniseightfourtwozeroeightfourtwoonezeroeighteightfourzerotwofourzeroeightfourzeroonezeroonetwofourx
- 英文数字转化为中文数字:
842084210884024084010124
- 只有 01428 便知是云影密码,可以手算,也可用代码解,这里就直接上代码了:
a="842084210884024084010124"
s=a.split('0')
l=''
print(s)
for i in s:
sum=0
for j in i:
sum+= int(j)
l += chr(sum+96)
print(l)
# notflag
得到flag{notflag}
题二
buu [UTCTF2020]hill 1
题目描述:
wznqca{d4uqop0fk_q1nwofDbzg_eu}
题目分析:
- 题目名称提示了是希尔密码,但是并不知道密钥
- 已知 wznqca 对应 utctf
- 猜测 n = 2 (即密钥矩阵为二阶)
- 密文对应26个数字得到:
22, 25, 13, 16, 2, 0, 3, 20, 16, 14, 15, 5, 10, 16, 13, 22, 14, 5, 3, 1, 25, 6, 4, 20
- 密钥二阶的话得到密文序列:
22 13 2 3 16 15 10 13 14 3 25 4
25 16 0 20 14 5 16 22 5 1 6 20
- 其中前六个密文矩阵A为:
w n c 3 16 15 10 13 14 3 25 4
z q a 20 14 5 16 22 5 1 6 20
- 对应于明文:
u f a ...
t l g ...
- 转为数字矩阵M:
20 5 0 ...
19 11 6 ...
- 设密钥矩阵B为:
a b
c d
又BM = A
解方程即可
代码如下:
s='wznqcaduqopfkqnwofDbzgeu'
flag_pre='utflag'
def getit(a1,b1,c1,a2,b2,c2,a3,b3,c3):
for i in range(26):
for j in range(26):
if (a1 * i + b1 * j) % 26 == c1 and (a2 * i + b2 * j) % 26 == c2 and (a3 * i+b3*j) % 26 == c3:
print(i,j)
return (i,j)
x1=getit(22,25,20,13,16,5,2,0,0)
x2=getit(22,25,19,13,16,11,2,0,6)
import string
flag=''
for i in range(0, len(s),2):
flag+=string.ascii_letters[(x1[0]*string.ascii_letters.index(s[i])+x1[1]*string.ascii_letters.index(s[i+1]))%26]
flag+=string.ascii_letters[(x2[0]*string.ascii_letters.index(s[i])+x2[1]*string.ascii_letters.index(s[i+1]))%26]
print(flag)
# utflagdngeruscphertextqq
得到:
utflagdngeruscphertextqq
把删除的数字和符号加上以及大小写转换过来即可得到flag:
utflag{d4nger0us_c1pherText_qq}
希尔密码参考:https://blog.csdn.net/m0_57291352/article/details/118829155