Lab2-Crypto Report¶
AES 部分¶
CBC Byte Flip¶
我们需要的是将 OriginString 替换为 HackString,根据 CBC 自身的编码特性,将两个字符串(带 Padding)分为 16 个一组(共 4 组,但是第四组在 HackString 中已经全是 Padding 的了,对我们的解题没有帮助,所以去掉):
57 65 6c 63 6f 6d 65 20 74 6f 20 53 45 43 55 52 | Welcome to SECUR
45 20 43 72 79 70 74 6f 20 53 79 73 74 65 6d 0a | E Crypto System\n
4e 6f 20 77 61 79 20 74 6f 20 68 61 63 6b f0 9f | No way to hack\xf0\x9f
59 6f 75 72 20 43 72 79 70 74 6f 20 53 79 73 74 | Your Crypto Syst
65 6d 20 69 73 20 48 41 43 4b 45 44 20 42 59 20 | em is HACKED BY
41 41 41 f0 9f a4 a3 f0 9f a4 a3 f0 9f a4 a3 01 | AAA🤣🤣🤣\x01
如果有两个密文组 C1+C2,经过 Block Cipher Decryption 后为 D1+D2,解密结果为 P1+P2,对应的 HackString 部分为 H1+H2,我们可以得到 \(P2=C1\oplus D2\),从而 \(D2=P2\oplus C1\)
因此我们想让 P2 变为 H2,我们可以将 C1 改为 \(D2 \oplus H2\),再次交互获得新的 P1,通过前一个块改变 P1 使其为 H1,以此类推,直到最后我们需要通过 IV 来改变最前面这个块,这样就将输入的 Ciphertext 解密成我们想要的 HackString 了,编写 python 程序如下:
运行即可得到 flag:
Padding Oracle¶
这道题我们需要利用程序 padding error 时只会报 500 错误而不会终止程序来进行解密,我们将密文照样分为 16 字节一组,一块一块地获得解密出来的原文。
对于两个密文组 C1+C2,经过 Block Cipher Decryption 后为 D1+D2,解密结果为 P1+P2,我们要想得到 P2,就得获得 D2,我们尝试在 C2 前加一个需要爆破的块 C,每次将 C+C2 送给程序,先对这个块的最后一个字节进行爆破,如果该字节与 D2 的最后一个字节异或结果为 0x01 时,其结果一定为 unpad 成功,即程序会输出 403,那么我们就可以得到 D2 的最后一个字节了,以此类推一个一个字节进行爆破,最后我们能获得完整的 D2,那么 P2 即为 \(C1\oplus D2\)。
这里需要补充的是“以此类推”的一个小细节,在进行下一个字节的爆破之前,我们需要重新改动爆破块 C 当中的值,因为我们已经确认了 D2 已爆破字节的值,我们需要将爆破块 C 已爆破字节的值全部更改掉使得这些值跟 D2 的已爆破的值异或结果为下一次爆破所需要的正确 padding 的值,这样才能使得爆破正常进行。
编写 python 程序如下:
运行即可得到 flag:
RSA 部分¶
Republican Signature Agency¶
对于这样一个自动加解密的机器,要得到 flag,最简单的方法即为将Plz give me the flag!
交给机器进行加密,然后将密文再次解密即可,但是当我们实践的时候便发现了这样的情况:
这便是这道题的限制,为了获得这个字符串加密后的结果,我们将这个字符串转为十进制,分解质因数:
根据 5 个质因数获得 5 个加密结果,根据模乘运算也可以获得整体加密后的结果。编写 python 程序如下:
中途遇到了非常多挫折,其中最大的便是当我们将后面两个大质数送给程序进行加密时,我们还会碰到这样的情况:
这个程序还要求我们输入的明文必须都为 ASCII 字符,因此我们需要爆破这个质因数满足转换为字符串均为 ASCII 字符的倍数,通过一系列模乘模除运算最后获得准确的加密结果。
最后运行我们能得到 flag:
格密码¶
这道题与上课所讲的例题类似,有 \(A_n=\begin{pmatrix}A_{n,1}&A_{n,2}&...&A_{n,m}\end{pmatrix}\),\(S=\begin{pmatrix}S_1&S_2&...&S_m\end{pmatrix}\),\(b_n=A_n\vdot S+e_n(mod\space q)\),构建格矩阵: $$ M=\begin{pmatrix} b_1&b_2&...&b_n&BIGNUM\ A_{1,1}&A_{2,1}&...&A_{n,1}\ A_{1,2}&A_{2,2}\ \vdots&&\ddots\ A_{1,m}&&&A_{n,m}\ q\ &q\ &&\ddots\ &&&q\ \end{pmatrix} $$ 有: $$ \begin{pmatrix} -1&S_1&S_2&\cdots&S_m&k_1&k_2&\cdots&k_n \end{pmatrix} M=\begin{pmatrix} e_1&e_2&\cdots&e_n \end{pmatrix} $$ 求 CVP 问题,求得向量 e,通过 \(S=A_n^{-1}\vdot(b-e)\) 可求得私钥 S,有了私钥我们就可以通过加密内容反推得到明文。
由于 sage 和 pwntools 的环境结合一直没配好 qwq 所以没法通过交互执行这个思路,就手动 copy 了一份 A 和 b 获得 S(求给点思路分 qwq),代码如下:
但是查看 A*S-b 得到全是 0,不知道是不是思路有问题,望指正。