huangx607087学习RSA的笔记4
0.简介:
一个密码学废物的学习笔记,很菜,别看,以后会不定期更新
An Overview of some special kinds of RSA and their solutions.
一个对过去RSA学习的回顾及其实战中题目的应对方法,很多方法在以前的笔记(RSA Notes 1 & RSA in GF)中提及过,不过这次是结合了例题来讲解的,很多地方还是直接用的脚本,因为我太fw了
1. Overview of RSA in GF
RSA在GF域上的多项式的表现形式,根据之前笔记中的内容,这种题目就是利用Sagemath把RSA中的模多项式分解成两个本原多项式,然后注意到这两个本源多项式$P,Q$的$\phi$值为$p^e-1$,其中$p$是GF域中的素因数,$e$为指数,分别取决于$P$的次数和$Q$的次数,因为所有的$p^e-1$个多项式都无法与本源多项式$P$互约。
所以我们可以先来看看这样一道题目:
1 | Prime: 43753 |
这道题给出了一个$p=43753$,和两个多项式$n,c$,很显然,根据以往的传统,我们把$n$放到sagemath中进行分解。
不过我们发现他最后竟然带了个系数$34036$,计算了一下$\phi(34036)=16632$,所以最后的$\phi(n)=16632(43753^{65})(43753^{112})$,然后就是求逆元。不过最后发现这个$16632$乘不乘最后的结果都一样,不知道是为什么。
然后就是常规操作了,我们根据RSA的常规解密,就可以解出$m$。这里到最后应该是把$m$多项式的次数从低到高的系数拿出来转换成字符(而不是视为$43753$进制最后转换成$10$进制后long_to_bytes
),最后的答案就很简单了
2.Overview of Coppersmith
以下部分位Coppersmith相关例题讲解
PART 1
1 | n=0x67de16e8ceaece4a123ad278b249a9acde81174d4287889d68dbb7939fdfa28f3a927c4e1c71f9b7b036c7ce287806105954fb9086bfe3dbe5f82d156f4151c9fe74e32f6ce8bb239c2d55cb6628e53941628ccbd294aa101687160b578decf716f348ea42922358946e7706daf044be08a9bcd8ea248b597eeb3a1e16781247dec66a0976046de5b2603315ab5dc17120a558db56213e66989c0895492151fb5a0784fa346dfeebf2b1f71b3c7dbf135abfd4499d4f83b6d0b4c68fe5b1fe14e383d4c7cc78065cfed1831bd2e19c06b270e4ebfb9d09f3431d613301106c7762dace771e730c3268ad549e20202ac1f77d47eb18f82693e6e974f783a88793 |
这道题给出了$n,e,c$,同时还有一个$512$位长的$m$,不过最低的$72$位被省略了,所以现在我们就使用我在RSA Notes 1中第0x08部分发布的脚本,补充完整参数,放入sagemath-notebook中运行即可
1 | n = #你已知的n值 |
PART 2
1 | n=0x6546140f6d20fb1af8755ba3925274f8df3f175ea783e3f23748429fe6602477239b51e5c20b201b82e210402ebbfc159cb548117a4c2e1b73bbee26bbc04f5388ed3710beb66db0e1b6253030944c791529bc6cf4959851fde47602dcc116468038f852b766d418a7b2d4b83edef71e82b6465a3726d2f9d228dc0a99c01f277e28176c93d7059b3ad0b20f33b6b26785a22a3e867c11a9dc564311cc4cd6b7a3f605c9e7c7e44896181713269faf5600e98cb12450316bad55cda3e1ed24bbdac22cf4c8d23f1f4767336aebea9c638d6258f80c858e5b01be39edf7eb245c3c4639ef6de9edaf904808e09e141030ec503260418b23a0347bf224e65766f3 |
这道题给出了$p$的值,不过$p$缺失了最后的$128$位,所以我们可以补全以下脚本,然后放入sagemath中运行即可获得完整的$p$值,进而分解$n$,常规解密即可。
1 | n = #填写n值 |
PART 3
1 | n=0x8449fe9c8f1ddf7b08b53af7e3f55f9199fdc07b05ae7bda1737159ee985c8ea7d46dd1ac82cf23fef91b119822667d4fe7d98a2a46d1fc38f9dc05e9fb8e6ea07087f77d8dbda45877eb5babb7bc58af8caccdcbe89cf0cb994ce51fa5d45565fbc1b1797984663bb912ce2c9391ba6b76c92c4ac2e6b5d9c1242fdc75f36f7 |
这次,我们已知的是$n,e,c$同时还给出了$d$的最低$512$位,我们也可以直接补全以下脚本,然后放入sagemath中即可获得完整的$d$值
1 | def partial_p(p0, kbits, n): |
PART 4
1 | e=3 |
低指数广播攻击就是已知同一个明文$m$被多个不同的密钥加密后的结果,这个时候可以直接使用中国剩余定理解决,最后对结果开三次根号即位明文的值。
CRT的脚本有很多,比如说我博客中的0xGame Div 2中就有现成的脚本可以直接拿过来用,此处节省版面,不上脚本,因为更重要的内容在后面
PART 5
ORG 2021.1.22
1 | n=0xa1c7556e895f8268b7a81c5cae3d1377f245ceb84b86878982c9869ed9a00fd1ec11a462831b812d7f973a385a1cdae9465c78085ef1d28fa52d8b151609c737e788c3ae9848c39cc2d62c8c73b7659d19e49301171e5df0d9eb6bd0ea0c0f2d64235372c04f88e6402f202783432d2a3cca4d7290e59e41afbe1c206495134d |
其中$x$是对$m+1$加密的结果,也就是$(m+1)^7 \mod n$
这里就涉及到了相关明文攻击:
UPD 2021.2.18
UPD内容:删除了原版中错误的脚本代码,上了一个准确的代码
所谓RSA相关明文攻击,就是在已知$c\equiv m^e \pmod p$的情况下,同时还知道了$x\equiv (m+1)^e \pmod p$的情况,这个时候启动相关明文攻击,具体内容将在后面一篇RSA笔记中提到。
下面先上一下解密脚本,这里是知道了$x$和$x+b$的情形。当然,如果一次项不同,举个例子。比如我们知道的是$c=E(2m+3)$和$x=E(5m+8)$。可以得到$C=5^ec,X=2^ex$,那么我们就获得了$C=E(10m+15),X=E(10m+16)$的情形,填写$b=1,c=C,x=X$,那么我们就可以获得$10m \mod n$的计算结果,简单处理一下就可以获得$m$了。(CTF不是ACM,因此我们不需要把所有的步骤全放在一个文件里面,自己多数都是分部计算的,故关于如何凑m前面的系数,请自己根据提示构造)
1 | #sagemath code |
PART 6
1 | n=0xbadd260d14ea665b62e7d2e634f20a6382ac369cd44017305b69cf3a2694667ee651acded7085e0757d169b090f29f3f86fec255746674ffa8a6a3e1c9e1861003eb39f82cf74d84cc18e345f60865f998b33fc182a1a4ffa71f5ae48a1b5cb4c5f154b0997dc9b001e441815ce59c6c825f064fdca678858758dc2cebbc4d27 |
很显然,看到$e$这么大,并且$\ln d =0.27 \ln n< 0.292 \ln n$,很容易想到WinerAttack
不过试了好几个weinerattack的脚本都爆破失败,原因可能是因为此处的$\dfrac{\ln d}{\ln n}=0.27$,过于接近$0.292$了,导致了爆破的失败。
网上找到了一个与Winerattack相类似但不是Winerattack的脚本,填参后放入sagemath里用即可。
1 | import time |
3.End
这些RSA的破解都是难度较高的,后期还是需要多理解一下的。