同学们 TQL. 佩服李长兴 https://www.cnblogs.com/Ziggy29/ 同学的超神瓜皮思维.
一, 飞虎队(希尔密码) http://47.103.43.235:82/crypto/c/index.php
本题是我今天大部分时间的花费处. 先百度学习了希尔密码, 然后尝试手动计算逆矩阵和矩阵乘法, 还求助于线性代数课本, 可谓苦不堪言.
做题千万条, 数学第一条. 线代学不好, 老师两行泪.
简要介绍希尔密码
希尔密码是以矩阵的线性方式为加密方式. 将 26 个字母分别对应 0 到 25 这 26 个数字 (之前我还徘徊过 A 对应 0 还是 1, 想到取余数会有 0, 所以确定从 0 开始), 明文排成一个含 n 个 m 维列向量(即 mn 矩阵) 的矩阵 M 的格式. 密钥 K 为 nn 矩阵. 加密方式为: 密文 X=(明文 M 乘 密钥 K)Mod 26. 解密方式为: 明文 M=(密钥 K 的逆矩阵 K^-1 乘 密文 X)Mod 26.
使用 MATLAB 进行计算.
一开始我也是手算的, 然而徘徊于 0 和 1 如何抉择, 列和行如何计算, 算出的分数如何取整, 负数如何化正, 可谓是心力交瘁. 最终我决定怒占室友电脑, 使用 MATLAB 来进行计算问题, 以把自己解放于思考更高层次的问题.
1. 计算密钥的逆矩阵. 下图中 x 为原密钥, xx 为 x 的逆矩阵.
大家看图里那些小数哦, 我手动算的时候是以 3 为底的分数, 是完全匹配的. 可是使用分数进行下面的计算会很伤脑筋啊. 于! 是! 我找到了一篇深度好文 https://bbs.pediy.com/thread-89505.htm , 里面介绍了如何处理分数问题, 具体的与矩阵的计算原理有关, 这里我就采取了最小公倍数法, 让 xx 矩阵乘上数 27, 则不会影响结果.
下一步呢, 继续处理 xx, 手动把每一个数改成 0 到 25 的值, 该取模的取模, 该加上 n 倍 26 的加.
2. 逆矩阵与密文相乘. 下图中 xx 为密钥的逆矩阵, 密文为 a.
nia! 这样就算出来了, 然后大家都取个模(这里我是写了个 C 程序然后手动一个个输入算出的, 别嫌笨 ||)
- #include<stdio.h>
- int main()
- {
- int n;
- scanf("%d", &n);
- printf("%d\n", n%26);
- return 0;
- }
手动把这些数按格式记在纸上!
然后! 对照我们的字母数字表, ding!flag 出现辣!
那么 flag 就是 flag{hillisflagxx}, 结束.
二, 死亡真相
那么下面这一题就完全是马老师 @李长兴 https://www.cnblogs.com/Ziggy29/ 的功劳了.(为了凑题所以我把他解的题放在我 WP 上了: p)
首先用音频软件 (我使用的是 AU) 打开文件, 直接就看到了一个 flag 有木有.
得到
- flag:85a9d4517d4725_b9_8cbc9fd_554216
- (让我想到了 b 站上有段时间臭名昭著的图像 midi...)
然鹅啊, 介并不是最终的 flag. 而且尝试了一些解码后也解不开. 下面我就跪服马老师 https://www.cnblogs.com/Ziggy29/ 的想法了. 他竟然把这里的下划线全都换成 0(此处应有惊叹), 然后 md5 解密就结束了.
所以答案是 flag{hsd132456}, 完成.
赛后...
我和室友们又有新游戏可以玩了:)
来源: http://www.bubuko.com/infodetail-3005651.html