1.RSA加密过程
1.1随机生成两个质数p,q计算出模数n,n=p * q(p和q越大,越安全,因为n位数越大,越难破解)
将n转换为2进制,n的位数即为加密算法的位数,目前常用的是1024位,重要场合使用2048位
1.2 计算φ(n)=(p-1) * (q-1), 表示在<=n 的正整数之中,与 n 构成互质关系的数的个数
1.3随机选取密钥e,使得e与φ(n)互质(1 < e < φ(n) )
1.4求得一个整数d,使得 d满足(e * d)%m = 1
至此,可以得到公钥(n,e)和私钥(n,d)密文传输过程中只公布公钥,其余数字均不公布
1.5加密
将明文a使用公钥加密为b,b=a^e%n(其中a的位数要小于n的位数)
2.RSA解密过程
如果知道私钥(n,d)则将密文b使用私钥解密为a
a=b^d%n
整个过程产生了p,q,n,φ(n),e,d;6个变量,在ctf中,应根据不同情况作出相应解法
3.ctf中RSA题目总结
攻防世界-easy_RSA
题目描述如下图所示
题目中给定了p,q,e;根据N=p*q可以计算出模数,将N转换为2进制,此时N的位数就是工具中的Key大小,注意加密指数e是16进制,需要将10进制下为17的e转换为16进制下的11,计算私钥d即可得到答案
也可以使用工具CTF-RSA-tool,在终端中输入python solve.py -v --private -N 2135733555619387051 -p 473398607161 -q 4511491 -e 17,计算出d
攻防世界 Normal_RSA
题目中包含两个文件
flag.enc是密文文件,pubkey.pem是公钥文件,一般这种题目我们需要提取出公钥(n,e)通过各种攻击手段恢复私钥,然后去解密密文flag.enc得到flag
得到e=65537 ,模数N为
C2636AE5C3D8E43FFB97AB09028F1AAC6C0BF6CD3D70EBCA281BFFE97FBE30DD,将N转换为10进制87924348264132406875276140514499937145050893665602592992418171647042491658461
使用工具yafu分解模数N,得到p=275127860351348928173285174381581152299,q=319576316814478949870590164193048041239
输入如下命令,生成私钥private.pem
python rsatool.py -o private.pem -e 65537 -p 275127860351348928173285174381581152299 -q 319576316814478949870590164193048041239
在openssl下使用命令
rsautl -decrypt -in flag.enc -inkey private.pem
解密flag.enc
所用到的工具的介绍以及安装方法
参考文章1
参考文章2
参考文章3
以后在做题过程中遇到RSA相关题目会持续更新