BUU-crypto-刷题记录29

[UTCTF2020]hill

题目

wznqca{d4uqop0fk_q1nwofDbzg_eu}

解题

希尔密码(Hill Cipher)是运用基本矩阵论原理的替换密码,由Lester S. Hill在1929年发明。每个字母当作26进制数字:A=0, B=1, C=2… 一串字母当成n维向量,跟一个n×n的矩阵相乘,再将得出的结果MOD26。

如信息“NOSLEEPPING”对应着一组编码14,15,19,12,5,5,16,16,9,14,7。但如果按这种方式直接传输出去,则很容易被敌方破译。于是必须采取加密措施,即用一个约定的加密矩阵K乘以原信号B,传输信号为C=KB(加密),收到信号的一方再将信号还原(破译)为B=KC。如果敌方不知道加密矩阵,则很难破译。

加密

第一步,设定加密矩阵为K=112-120113,即在希尔密码中设q=26,L=3,选取满秩3×3阶可逆矩阵。我们之所以取3×3可逆方阵,也是为了计算方便,相应的安全性就要低一些。

第二步,将信息14,15,19,12,5,5,16,16,9,14,7分为4个列矩阵:X1=141519,X2=1255,X3=16169,X4=1470,其中X中的“0”是虚设的,其目的是为了与列矩阵的行数一致。列矩阵的行数3和个数4完全依赖于加密后的信息所对应的数字的多少和加密矩阵阶数决定。

第三步,将信息加密。进行矩阵的乘法运算:Y1=KX1=112-120213141519=6716100;Y2=KX2=112-1202131255=27-244;Y3=KX3=112-12021316169=501675;Y4=KX4=112-1202131470=21035。加密后的新码为67,16,100,27,-2,44,50,16,75,21,0。Y中的35虽然是多余的信息,但要连同密码一起发给对方,对方在破解密码时要参与计算。

解密

第一步,求密匙矩阵K的逆矩阵。K可用Mathematica计算。即K=-614-3125-1-3。

第二步,再次进行矩阵乘法运算:X1=-614-3125-1-3671610=141519;X2=-614-3125-1-327-244=1255;X3=-614-3125-1-3501675=16169;X4=-614-3125-1-321035=1470。这样原来的信息编码为14,15,19,12,5,5,16,16,9,14,7。

第三步,对照编码表,即可获得对方发来的信息内容为“NOSLEEPPING”。

尝试n = 2,除去数字和字符,将字母转为十六进制数字,并转为矩阵:
在这里插入图片描述
明文前几位应该为utflag,即为:
在这里插入图片描述
列方程可以求出来密钥k:
在这里插入图片描述
求逆矩阵并且与c相乘得到:
,,,没算出来,不知道前面哪是不是错了

还是代码靠谱点

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

答案
flag{d4nger0us_c1pherText_qq}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值