RSA学习
1.构造格解决RSA中m>n问题
首先我们肯定都对RSA加密以及解密原理有了一定认识,比如加密的这句代码:$c=m^e\mod(n)$通过这种方式来得到我们的密文c,但是这个方法有个前提就是m必须小于于n,原因下面再提。然后再看解密,$m=c^d \mod(n)$可以通过欧拉定理来证明这个过程得到$c^d\mod(n)=m\mod(n)$,显然我们能发现如果m大于n会导致得到的密文$newm=m\mod(n)$,我们得到的是newm,而不是m,所以就不完整了,自然还原出来的明文多半就是乱码,那么如何处理这类m>n的问题就是要学习的构造格。学习参考:2024-NSSCTF-密码工坊非官方dlc-wp-crypto | 糖醋小鸡块的blog
例题
1.1 2024羊城杯crypto RSA_loss
1 | from Crypto.Util.number import * |
由题目可以知道进行了一个加密再解密的过程,最后解出来是乱码的原因也就是在于m大于n导致数据丢失了。
我们先猜测message范围是所有数字大小字母以及下划线,那么对应的ASCII码范围就在(48,128)之间,假设message长度为le,那么:
$$
m=256^{le-7}*pre+256m_0+suf
$$
(其中pre=b’DASCTF{‘,suf=b’}’,m_0为括号中间部分)。
那么就有:
$$
c=(256^{le-7}*pre+256m_0+suf)\mod(n)
$$
就能得到$m_0 \mod(n)$的值:
$$
m_0=256^{-1}(c-256^{le-7}pre-suf)\mod(n)
$$
然和记$m_0$每个字节为$s_i$从而用ascii的角度将其表示为:
$$
m_0=\sum_{i=0}^{le-9}256^{i}s_i=s_0+256s_1+256^{2}s_2+…+256^{le-9}s_{le-9}\mod(n)
$$
即可以写成:
$$
m_0=\sum_{i=0}^{le-9}256^is_i+kn
$$
就可以构造格来找目标向量:
$$
M = \left(
\begin{array}{*{7}{c}}
1 &0 &0 &0 & 0& 0& 1\\
0& 1 & 0& 0& 0& 0& 256\\
0& 0& \ddots & 0&0 &0 & \vdots\\
0& 0&0 & \ddots & 0&0 & \vdots\\
0& 0& 0& 0& 1 & 0& 256^{le-9}\\
0& 0& 0& 0&0 & 1 & -m_0\\
0&0 & 0&0 & 0&0 & n\\
\end{array}
\right)
$$
有:
$$
(s_0,s_1,…,s_{le-9},1,k)*M=(s_0,s_1,…,s_{le-9},1,0)
$$
这样解出来的向量预期就在48-128之间,范围太大了结果肯定不太行,优化方法就是令:
$$
t_i=s_i-88
$$
这样目标向量范围就为(-40,40)可以解了。
1 | from Crypto.Util.number import * |
由于此题不知道长度所以找了一个范围进行遍历求解,然后找出有意义的输出