当前位置: 代码迷 >> 综合 >> [UTCTF2020]hill(希尔密码)
  详细解决方案

[UTCTF2020]hill(希尔密码)

热度:2   发布时间:2024-01-30 05:51:51.0

希尔密码

一个n*n矩阵(加密矩阵) A
一个英文字符串s
记 a=0,b=1,c=2…z=25

  1. 先将s转成数字表示形式.
  2. 分组,比如s得到的序列为 x1,x2,x3,x4,x5,x6 n=2,那么要分成每列两个元素的矩阵即:
    x1 x3 x5
    x2 x4 x6
    加密过程: 记上述的矩阵为M,得到的密文矩阵为C,则转化过程为:
    (AM)%26=C(注意是M左乘一个A)
    解密过程:
    M=(A-1 C)%26
    一般做题过程中n不会太高.

题目

在这里插入图片描述

分析

尝试n=2 猜测wznqca=utflag(前面的题目有说过类似对应,所以猜测这里还是这样)
解对应方程

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: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

得到的不是最终答案,需要把原来的 ‘_’ ','大小写等补回去.