[SWPUCTF 2021 新生赛]crypto2-WP

题目类型:

RSA——共模攻击


题目详情:

from gmpy2 import *
from Crypto.Util.number import *



flag  = '***************'

p = getPrime(512)
q = getPrime(512)
m1 = bytes_to_long(bytes(flag.encode()))


n = p*q
e1 = getPrime(32)
e2 = getPrime(32)
print()

flag1 = pow(m1,e1,n)
flag2 = pow(m1,e2,n)
print('flag1= '+str(flag1))
print('flag2= '+str(flag2))
print('e1= ' +str(e1))
print('e2= '+str(e2))
print('n= '+str(n))


#flag1= 100156221476910922393504870369139942732039899485715044553913743347065883159136513788649486841774544271396690778274591792200052614669235485675534653358596366535073802301361391007325520975043321423979924560272762579823233787671688669418622502663507796640233829689484044539829008058686075845762979657345727814280
#flag2= 86203582128388484129915298832227259690596162850520078142152482846864345432564143608324463705492416009896246993950991615005717737886323630334871790740288140033046061512799892371429864110237909925611745163785768204802056985016447086450491884472899152778839120484475953828199840871689380584162839244393022471075
#e1= 3247473589
#e2= 3698409173
#n= 103606706829811720151309965777670519601112877713318435398103278099344725459597221064867089950867125892545997503531556048610968847926307322033117328614701432100084574953706259773711412853364463950703468142791390129671097834871371125741564434710151190962389213898270025272913761067078391308880995594218009110313

题型分析:

由题目中e1和e2可知这个题型为共模题型,那么话不多直接上代码(一切尽在代码中)


解决方案:

首先我们先用代码简单的了解一下rsa算法

from Crypto.Util.number import *#是导入语句具体来说,这行代码会导入 number 子模块中的所有函数和类,使其在当前代码中可用。
import gmpy2 #高精度算法
p = int(input()) #素数
q = int(input())
e = int(input())#这是RSA公钥中的公钥指数。通常情况下,它是一个较小的整数,通常是65537。它用于加密消息。
c = int(input())#这是RSA加密的结果,也就是密文,通过执行 c = pow(m, e, n)=m的e次方mod n
n=p*q #模数n
L = (p-1)*(q-1)#这是欧拉函数 (φ) 的值,计算方法为 (p-1) * (q-1)。在RSA中,它在私钥的计算中用到。
d =gmpy2.invert(e,L)#这行代码使用gmpy2库中的 invert 函数来计算私钥指数 d。它找到了满足 d * e ≡ 1 (mod L) 的 d 值。
#print(d)#求d的值
m = pow(c,d,n) #m是明文 pow用于计算一个数的幂,如pow(2, 3, 5)  # 计算 2 的 3 次方,然后对 5 取模,结果为 3
print(long_to_bytes(m))#将大整数转换为字节数组 //基本上大部分的RSA解密都需要进行转换
# 将大整数 m 进行二进制编码。
# 将编码后的二进制数据按字节进行分割。
# 最终的结果是一个字节数组,每个元素代表一个字节。
# 这个函数在密码学中经常用于将加密后的消息转换为可传输的字节序列,或者将计算得到的哈希值转换为二进制数据,以便进行后续的处理或者存储。

共模:

  • e1 和 e2: 这是两种不同的RSA加密操作的公共指数。
  • c1 和 c2: 这是两种不同的RSA加密操作的结果密文。
  • n: 这是两种RSA操作共享的模数。
import gmpy2
from Crypto.Util.number import *

e1= 3247473589
e2= 3698409173
c1 = 100156221476910922393504870369139942732039899485715044553913743347065883159136513788649486841774544271396690778274591792200052614669235485675534653358596366535073802301361391007325520975043321423979924560272762579823233787671688669418622502663507796640233829689484044539829008058686075845762979657345727814280
c2 = 86203582128388484129915298832227259690596162850520078142152482846864345432564143608324463705492416009896246993950991615005717737886323630334871790740288140033046061512799892371429864110237909925611745163785768204802056985016447086450491884472899152778839120484475953828199840871689380584162839244393022471075
n = 103606706829811720151309965777670519601112877713318435398103278099344725459597221064867089950867125892545997503531556048610968847926307322033117328614701432100084574953706259773711412853364463950703468142791390129671097834871371125741564434710151190962389213898270025272913761067078391308880995594218009110313

g,x,y = gmpy2.gcdext(e1, e2) #xe1 + ye2 = 1 解出x , y :使用gmpy2库的gcdext函数来计算e1和e2的最大公约数这个公约数通常是1,因为它们被选择为互质数
#x和y是扩展欧几里得算法中计算出来的一个整数。它满足以下关系:x * e1 + y * e2 = 1,其中 e1 和 e2 是两个不同的公共指数。在共同模数攻击中,x 的值被用于解密第一个密文 c1 ,y的值被用于解密第二个密文c2
m = pow(c1, x , n) * pow(c2, y, n) % n #由扩展欧几里得算法计算x和y,使得x * e1 + y * e2 = 1。接着使用这些值从两个密文c1和c2中恢复明文m。pow函数用于执行模数指数运算,而% n确保结果在模数n内
#x 和 y 是扩展欧几里得算法的输出,用于解密两个不同的密文,而 d 是RSA算法中的私钥,用于解密RSA加密的密文。
print(long_to_bytes(m))

因此最终的flag为:NSSCTF{xxxxx******xxxxx}

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值