已知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加密中,首先需要选择两个大素数pq;这两个素数通常是随机生成的,并且需要足够大,以确保算法的安全性;在你的代码中,pq是通过getPrime(512)函数生成的512位素数:
p = getPrime(512)
q = getPrime(512)

输出结果:

p = 10554915510546378513140074459658086644656654144905337809416976066414771647836950941616441505897207397834928781511863699153349798682451297889979721668885951
q = 8246403321715011123191410826902524505032643184038566851264109473851746507405534573077909160292816825514872584170252311902322051822644609979417178306809223

(2)计算模数n

  • 模数npq的乘积,即n = p * q;n的长度(以位为单位)决定了RSA密钥的长度,这个n将用于加密和解密过程中

(3)计算欧拉函数φ(n)

  • 欧拉函数φ(n)用于确定加密和解密指数,对于两个素数pq,φ(n)的计算公式为:**φ(n)=(p−1)×(q−1)**

(4)选择公钥指数e

  • 公钥指数e是一个与φ(n)互质的正整数,通常选择65537(即0x10001),因为它是一个常用的素数,且计算效率较高,这个e将与n一起构成公钥,用于加密

(5)计算私钥指数d

  • 私钥指数de的模逆元,满足以下条件: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}
posted @ 2025-03-11 13:56  sevensnight  阅读(67)  评论(0)    收藏  举报