目录
1.题目
wznqca{d4uqop0fk_q1nwofDbzg_eu}
2.分析
题目名称为hill,hill在外文翻译是希尔,可以作为人名,题目考察希尔加密。希尔加密的密钥是一个矩阵,而这个矩阵的获取需要根据已知信息进行计算,我们根据经验猜测的前6个字母为'utfag',这点已知信息就足以帮助我们计算得到密钥矩阵。
我们先计算密钥矩阵,根据已知信息,我们知道:
[utflag]->[wznqca]
#即
[20, 19, 5, 11, 0, 6] ->[22, 25, 13, 16, 2, 0]
因为可以建立六个一阶方程,但是我们要求的又是n*n的矩阵,所以使用的密钥矩阵应该是2*2的矩阵。
在加密过程中:
所以我们在保证K,M,C均为方阵的后,就能够通过矩阵求逆得到K:
求到K之后,再按照如下过程求解原文:
3.解题
计算密钥矩阵,使用部分信息来解密钥矩阵,使用sagemath内置的矩阵计算功能来解题:
#please run in sagemath
C = Matrix( [[22, 13],[25, 16]])
M = Matrix( [[20, 5], [19, 11]])
K = C*M.inverse() % 26
print(K)
K_inv = K.inverse()%26
print(K_inv)
'''
K:
[ 1 22]
[11 13]
K_inv:
[13 6]
[ 3 21]
'''
得到了K矩阵后可以求解原文:
K_inv = Matrix([[13, 6],[ 3,21]])
s = 'duqopfkqnwofdbzgeu'
ans = ''
for i in range(0, len(s), 2):
T = Matrix([[ord(s[i]) - 97], [ord(s[i + 1]) - 97]])#两个两个的解密密文
R = K_inv * T%26
ans += chr(R[0][0] + 97) + chr(R[1][0] + 97)
print(ans)
#dngeruscphertextqq
手工把下划线,数字补回去,注意T改大写,得到flag:
utflag{d4nger0us_c1pherText_qq}