最近做题遇到好几次RSA解密,最近密码学课也学到了 RSA密码算法,写一篇文章促进对RSA的理解。
一:RSA的基本原理的理解:
1.学习RSA加密得知道欧拉函数,想理解欧拉函数又得弄明白同余类与剩余系的知识,这些是基础。
2.RSA的密钥生成原理:
第一步:选择两个较大素数P,Q.
第二步:计算n=pq,z=(p-1)(q-1)。
第三步:随机选取e(其中e<n),e与z没有公因数(e,z互为质数)
第四步:选取d使得ed-1能够被z完全整除。ed mod z=1
第五部:公钥是(n,e) 私钥是(n,d)
二 下面以SUCTF 2019 signin记录一下RSA的应用与解密方法
这里函数分析得到
N=103461035900816914121390101299049044413950405173712170434161686539878160984549
c = 0xad939ff59f6e70bcbfad406f2494993757eee98b91bc244184a377520d06fc35
e = 65537
第一步我们要求取的是pq两个素数的值 从其他大佬那里偷来神器RSAyafu 他可以讲给定的数分成两个相乘的素数
直呼nb
第二种使用方法:
如果因数过长,将 因数 用文本文件存放在 yafu 目录下,例如:data.txt 。文件最后一行一定要换行,否则 eof; done processing batchfile。
.\yafu-x64.exe "factor(@)" -batchfile data.txt
p = 366669102002966856876605669837014229419
q = 282164587459512124844245113950593348271
下面就是使用python解密了
(先得安装gmpy2库)
学习一下gmpy2库的使用
gmpy2.invert(a,c) 对a,求b,使得a*b=1(mod c)
gmpy2.powmod(a,n,p) 对于给定的整数p,n,a,计算aⁿ mod p
补充一下binascii.unhexlify函数
unhexlify(hexstr)将十六进制转换为二进制形式。
hex()函数记得加[2:]去掉开头的0x。
求d脚本
import gmpy2
from Crypto.Util import number
e=65537
n=87924348264132406875276140514499937145050893665602592992418171647042491658461
p=275127860351348928173285174381581152299
q=319576316814478949870590164193048041239
d=gmpy2.invert(e,(p-1)*(q-1))
print(d)
密文拿到手之后,需要密文的数字形式,用winhex打开查看十六进制形式
最后得到的密文的十六进制形式数字个数需要是偶数被,不是则尝试加0或者删除