希尔密码
一个n*n矩阵(加密矩阵) A
一个英文字符串s
记 a=0,b=1,c=2…z=25
- 先将s转成数字表示形式.
- 分组,比如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
得到的不是最终答案,需要把原来的 ‘_’ ','大小写等补回去.