buuoj Reverse部分
rsa
e和n可通过openssl命令获取
1 | $openssl rsa -pubin -text -modulus -in pub.key |
其中Modulus为n,Exponent为e。
1 | import rsa |
[AFCTF2018]可怜的RSA
此题也是给出了公钥文件和密文,但需要使用PKCS1_OAEP模式解密。
1 | from gmpy2 import iroot, next_prime, powmod, invert, gcd |
[SUCTF2019]SignIn
1 | import gmpy2 |
buuoj Crypto部分
RSA
1 | import gmpy2 |
rsarsa
1 | import gmpy2 |
RSA1
此题属于已知p,q,dp,dq,c求明文
1 | import gmpy2 |
这里借助dp,dq解密的算法原理推导过程可见https://blog.csdn.net/qq_52193383/article/details/119760806
RSA2
此题属于已知e,n,dp/(dq),c求明文
已知
推导
将k遍历range(1,e),若k满足(e*dp - 1) % k = 0,且p能被n整除,则能得出p,q,d。
1 | import gmpy2 |
RSA3
共模攻击
1 | import gmpy2 |
RSAROLL
题目给出的数据前两个是n和e后面的每一行是一个密文,这点乍一看确实不好理解。
1 | import gmpy2 |
[HDCTF2019]basic rsa
最常规的解法,已知p,q,e,c,求解m
1 | import gmpy2 |
[GUET-CTF2019]BabyRSA
此题本质是已知n,e,d,c ,求m。只不过是间接给出了p+q
和(p+1)*(q+1)
来求p*q
。
1 | import gmpy2 |
rsa2
低解密指数攻击
1 | import hashlib |
这题有一点比较坑的地方就是python2和python3的hex()函数输出的结果不一致,python2会在输出后加一个L
Dangerous RSA
低加密指数攻击:公钥中的加密指数e很小,但是模数n很大
加密公式:
1 | import gmpy2 |
RSA4
中国剩余定理
1 | import gmpy2 |
RSA5
低加密指数广播攻击(模数n、密文c不同,明文m、加密指数e相同)
某些题目会给出多组n和c,但是e却不小,比如e=65537,这种情况下不建议使用中国剩余定理求解,可以尝试在n中寻找最大公约数gcd。
这里的e达到了65537,考虑在不同的n中试试寻找公因数求解,求出不同n之间的最大公约数 gcd()从而得到p或q,进而可得d,有私钥d就能得到明文。
1 | import gmpy2 |
RSA & what
n相同,明文m相同,不同的e加密为不同的c,可利用共模攻击。
1 | import gmpy2 |
再利用base64隐写解密。
[HDCTF2019]bbbbbbrsa
此题需要爆破e,得出的结果需要转成byte进行分析。
1 | import gmpy2 |
[RoarCTF2019]RSA
http://factordb.com/可以分解n,或者参考https://paper.seebug.org/1059/#rsa解答。
e是爆破出来的,貌似不会抛异常,只能通过看解出的明文长度来判断是否正确。
1 | import gmpy2 |
[NCTF2019]childRSA
这道题的特点是给出了p和q的生成方法,即从前10000个素数中,随机选择若干个相乘,直到乘积+1是个大素数。
本题考查费马小定理。也可以直接分解n。
1 | from gmpy2 import iroot, next_prime, powmod, invert, gcd |
[NCTF2019]babyRSA
题目已知e,d,关键是根据ed求出phi。
1 | from gmpy2 import iroot, next_prime, powmod, invert, gcd |
[BJDCTF2020]easyrsa
此题需看懂z=Fraction(1,Derivative(arctan(p),p))-Fraction(1,Derivative(arth(q),q))
实际上是在描述
当然此题也可以使用在线分解直接解出p,q。
1 | from gmpy2 import iroot, next_prime, powmod, invert, gcd |
[MRCTF2020]Easy_RSA
观察p的生成,发现需要利用已知 n 和 φ(n) , 分解 n
观察q的生成,发现需要利用已知ed,分解n
这里用到的原理未弄明白
可参考https://aidaip.github.io/crypto/2019/08/21/RSA-%E5%B7%B2%E7%9F%A5ed%E5%88%86%E8%A7%A3n.html
1 | import gmpy2 |
[MRCTF2020]babyRSA
此题关键是在计算p时要用到欧拉定理
1 | import gmpy2 |
[NPUCTF2020]EzRSA
此题涉及的知识点有如下,证明见https://blog.csdn.net/ZoeMG/article/details/124982839
题目中给出的gift
即lcm(p,q)
与n的位数差别小,所以可以爆破gcd(p,q)
的值,来获取phi
的值
同时题目给出的e不是素数。分解可以得到e=2∗27361
实际的加密过程为
所以在解密时,需要将e整除2,解出的明文再开平方。
1 | import gmpy2 |
[De1CTF2019]babyrsa
第四问给出了两个式子
按常规操作解其中任何一个式子都能求出flag
但此题的e与解密指数不互素
通过变形
通过计算发现,
故尝试舍去含p的式子