NSSCTF PR

文章讲述了如何利用中国剩余定理解决RSA加密中生成的同余方程组,通过SageMath求解c1和c2在模p和r下的解,进而还原原始明文。
摘要由CSDN通过智能技术生成

题目

提示是crt

from Crypto.Util.number import *
import random

flag=plaintext = 'NSSCTF{****************}'
charset = 'abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789'
padding_length = 100 - len(plaintext)

for _ in range(padding_length):
    plaintext += random.choice(charset)

public_exponent = 31413537523
message = bytes_to_long(plaintext.encode())
assert message > (1 << 512)
assert message < (1 << 1024)

prime_p = getPrime(512)
prime_q = getPrime(512)
prime_r = getPrime(512)
n1 = prime_p * prime_q
n2 = prime_q * prime_r
ciphertext1 = pow(message, public_exponent, n1)
ciphertext2 = pow(message, public_exponent, n2)
print('c1=', ciphertext1)
print('c2=', ciphertext2)
print('p=', prime_p)
print('r=', prime_r)


'''
c1= 36918910341116680090654563538246204134840776220077189276689868322808977412566781872132517635399441578464309667998925236488280867210758507758915311644529399878185776345227817559234605958783077866016808605942558810445187434690812992072238407431218047312484354859724174751718700409405142819140636116559320641695
c2= 15601788304485903964195122196382181273808496834343051747331984997977255326224514191280515875796224074672957848566506948553165091090701291545031857563686815297483181025074113978465751897596411324331847008870832527695258040104858667684793196948970048750296571273364559767074262996595282324974180754813257013752
p= 12101696894052331138951718202838643670037274599483776996203693662637821825873973767235442427190607145999472731101517998719984942030184683388441121181962123
r= 10199001137987151966640837133782537428248507382360655526592866939552984259171772190788036403425837649697437126360866173688083643144865107648483668545682383
'''

题目提示了crt,那么我们可以写出两个同余方程组

c_1\equiv m^emodp\\c_2\equiv m^e mod r

中国剩余定理

设正整数m1,m2,.....,mk两两互素,则同余方程组:

x\equiv a_1(mod ~m1)\\x\equiv a_2(mod~m_2)\\......\\x\equiv a_k(mod~m_k)

有整数解。并且在模M=m1*m2*m3*...*mk下的解是唯一的,解为

x\equiv (a_1M_1M^{​{-1}}+a_2M_2M_2^{-1}+...a_kM_kM_k^{-1})mod~M\\

其中

M_i=\frac{M}{m_i}而Mi是模mi的逆元

摘自中国剩余定理(超详细讲解)-CSDN博客​​​​​

分析:

所以我们可以构建一个新的n=p*r

然后用sagemath,运用中国剩余定理可以求得关于

c_1\equiv m^emodp\\c_2\equiv m^e mod r

这两个方程组的解也就是m^e,在rsa解密当中c\equiv m^emodn,所以cm^e在模n下同余,

所以我们就可以求解pow(m^e,d,n)来求解真正的m

代码如下:

#sage
import gmpy2
import libnum
c1= 36918910341116680090654563538246204134840776220077189276689868322808977412566781872132517635399441578464309667998925236488280867210758507758915311644529399878185776345227817559234605958783077866016808605942558810445187434690812992072238407431218047312484354859724174751718700409405142819140636116559320641695
c2= 15601788304485903964195122196382181273808496834343051747331984997977255326224514191280515875796224074672957848566506948553165091090701291545031857563686815297483181025074113978465751897596411324331847008870832527695258040104858667684793196948970048750296571273364559767074262996595282324974180754813257013752
p= 12101696894052331138951718202838643670037274599483776996203693662637821825873973767235442427190607145999472731101517998719984942030184683388441121181962123
r= 10199001137987151966640837133782537428248507382360655526592866939552984259171772190788036403425837649697437126360866173688083643144865107648483668545682383
e=31413537523
phi=(p-1)*(r-1)
d=gmpy2.invert(e,phi)
a=CRT([c1,c2],[p,r])
m=pow(int(a),d,p*r) 
print(libnum.n2s(int(m)))

欢迎批评指正。

  • 18
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 3
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值