已知p,q,e,c,求出d,再求m
题目:
from Crypto.Util.number import *
flag = b'NSSCTF{******}'
p = getPrime(512)
q = getPrime(512)
n = p*q
e = 65537
phi = (p-1)*(q-1)
m = bytes_to_long(flag)
c = pow(m, e, n)
print(f'p = {p}')
print(f'q = {q}')
print(f'e = {e}')
print(f'c = {c}')
'''
p = 10554915510546378513140074459658086644656654144905337809416976066414771647836950941616441505897207397834928781511863699153349798682451297889979721668885951
q = 8246403321715011123191410826902524505032643184038566851264109473851746507405534573077909160292816825514872584170252311902322051822644609979417178306809223
e = 65537
c = 40005881669517895877352756665523238535105922590962714344556374248977905431683140065629966778249773228248201807844489945346731806741025157651474530811920115794270396320935022110691338083709019538562205165553541077855422953438117902279834449006455379382431883650004540282758907332683496655914597029545677184720
'''
RSA加解密:
RSA加密算法是一种非对称加密算法,它基于数论中的模运算和大整数分解的困难性,以下是RSA加密过程的详细解释
1. 密钥生成(Key Generation)
(1)选择两个大素数p和q
- 在RSA加密中,首先需要选择两个大素数
p
和q
;这两个素数通常是随机生成的,并且需要足够大,以确保算法的安全性;在你的代码中,p
和q
是通过getPrime(512)
函数生成的512位素数:
p = getPrime(512)
q = getPrime(512)
输出结果:
p = 10554915510546378513140074459658086644656654144905337809416976066414771647836950941616441505897207397834928781511863699153349798682451297889979721668885951
q = 8246403321715011123191410826902524505032643184038566851264109473851746507405534573077909160292816825514872584170252311902322051822644609979417178306809223
(2)计算模数n
- 模数
n
是p
和q
的乘积,即n = p * q
;n
的长度(以位为单位)决定了RSA密钥的长度,这个n
将用于加密和解密过程中
(3)计算欧拉函数φ(n)
- 欧拉函数
φ(n)
用于确定加密和解密指数,对于两个素数p
和q
,φ(n)
的计算公式为:**φ(n)=(p−1)×(q−1)**
(4)选择公钥指数e
- 公钥指数
e
是一个与φ(n)
互质的正整数,通常选择65537
(即0x10001
),因为它是一个常用的素数,且计算效率较高,这个e
将与n
一起构成公钥,用于加密
(5)计算私钥指数d
- 私钥指数
d
是e
的模逆元,满足以下条件:d×e≡1(modφ(n))
在Python中,可以使用inverse(e, phi)
函数计算d
2. 加密过程(Encryption)
(1)明文编码
- 明文消息(如字符串)需要转换为一个整数
m
,这个过程称为编码,在代码中,使用bytes_to_long
函数将flag转换为整数
m = bytes_to_long(flag)
例如,flag = b'NSSCTF{******}'
会被转换为一个大整数m
(2)加密公式
- 加密过程使用公钥
(n, e)
对明文m
进行加密,生成密文c
,加密公式为:c ≡ m<sup>e </sup>(mod n)
- 输出结果:
c = 40005881669517895877352756665523238535105922590962714344556374248977905431683140065629966778249773228248201807844489945346731806741025157651474530811920115794270396320935022110691338083709019538562205165553541077855422953438117902279834449006455379382431883650004540282758907332683496655914597029545677184720
3. 解密过程(Decryption)
(1)密文解码
- 解密过程使用私钥
(n, d)
对密文c
进行解密,恢复明文m
,解密公式为:m ≡ c<sup>d </sup>(mod n)
在Python中,解密过程可以表示为:
m = pow(c, d, n)
- 然后将解密后的整数
m
转换回原始的字节数据:
flag = long_to_bytes(m)
解答:
from Crypto.Util.number import *
p = 10554915510546378513140074459658086644656654144905337809416976066414771647836950941616441505897207397834928781511863699153349798682451297889979721668885951
q = 8246403321715011123191410826902524505032643184038566851264109473851746507405534573077909160292816825514872584170252311902322051822644609979417178306809223
e = 65537
c = 40005881669517895877352756665523238535105922590962714344556374248977905431683140065629966778249773228248201807844489945346731806741025157651474530811920115794270396320935022110691338083709019538562205165553541077855422953438117902279834449006455379382431883650004540282758907332683496655914597029545677184720
n=p*q
phi = (p-1)*(q-1)
d = inverse(e, phi)
m = pow(c, d, n)
print(long_to_bytes(m))
#NSSCTF{now!you_know_rsa}