RSA讲解及简单题目讲解

最近在学习RSA,上网发现对于我这种基础差的很不友好(看不明白RSA数学公式)所以便自己对RSA做了详细总结。

1、RSA的讲解

1.密钥 生成: 选择两个大素数: p, q 计 算n: n = p * q

2.计算欧拉函数φ(n): φ(n) = (p-1) * (q-1) 解 释: p和q均为大素数,且n = p * q

选择 公钥e: 1 < e < φ(n),且gcd(e, φ(n)) = 1 解 释:e和φ(n)的最大公约数gcd(e, φ(n))必须为1,即e和φ(n)不能有除1以外的公因数

计算私钥d: d * e ≡ 1 (mod φ(n)) 解释:解密指数d乘以加密指数e的结果模欧拉函数φ(n)后等于1 解释:取模,也就是小学学过的取余运算,列如:5%2=1(模是一种运算符号,通常用符号“%”表示)

加密: 加密公式: [c = m^e \mod n] 其中,c为密文,m为明文,e为公钥指数,n为模数 解释:C等于明文M的公钥指数e次方对模数n取模的结果,公钥指数e是一个小于φ(n)且与φ(n)互质的正整数

解密: 解密公式: [m = c^d \mod n] 其中,m为明文,c为密文,d为私钥指数,n为模数 解释:明文m等于密文c的私钥指数d次方对模数n取模的结果 在RSA加密算法中,这个公式表示了解密过程:密文c先被用私钥指数进行解密,然后对模数n取模以得到最终的明文

最大公约数:有数字A和数字B,A和B的有1,2,3,4,5,6,7,8,9,10,11,25这些公约数,而其中最大的公约数25,也就被称为最大公约数。

素 数:只能被 1 和自身整除的正整数,如1,3,7,11,13等

互质:两个整数被称为互质(互质数、互素数)是指它们的最大公约数为1,也就是它们没有除了1以外的公共因子。 举例来说,考虑整数12和35。它们的因数分别为: 12的因数为1, 2, 3, 4, 6, 12 35的因数为1, 5, 7, 35 它们的最大公约数是1,因此12和35是互质的整数

好了,了解了这些,我们开始做一些简单题目。

第一题:

来源:BUUCTF在线评测 题目类型和名字:Crypto-----RSA 在一次RSA密钥对生成中, 假设 p=473398607161, q=4511491, e=17 求解出d作为flga提交

方法一:使用软件RSATool2v17直接秒掉,但是我并不会怎么使用,所以我喜欢使用python解。 软件下载地址:RSA-Tool 2(RSA算法辅助工具)V1.7绿色版下载 - 下载吧 (xiazaiba.com)

解得flag{125631357777427553}

方法二:使用python脚本

p = 473398607161
q = 4511491
e = 17
​
# 计算模数n
n = p * q
​
# 计算欧拉函数phi(n)、φ(n)
phi = (p - 1) * (q - 1)
​
# 计算私钥指数d,
d = pow(e, -1, phi)
#使用pow()函数计算公钥指数e在模φ(n)意义下的逆元素,即私钥指数d
#注释:φ(n) == phi   == (phi function),这三个是相同的
print("私钥指数d为:", d)
#总结:知pq,求n,求phi(n),从而使用函数pow解得d
d=125631357777427553
第二题:

来源:BUUCTF在线评测 (buuoj.cn)

题目类型及名字:Crypto------rsarsa

Math is cool! Use the RSA algorithm to decode the secret message, c, p, q, and e are parameters for the RSA algorithm.

p = 9648423029010515676590551740010426534945737639235739800643989352039852507298491399561035009163427050370107570733633350911691280297777160200625281665378483 q = 11874843837980297032092405848653656852760910154543380907650040190704283358909208578251063047732443992230647903887510065547947313543299303261986053486569407 e = 65537 c = 83208298995174604174773590298203639360540024871256126892889661345742403314929861939100492666605647316646576486526217457006376842280869728581726746401583705899941768214138742259689334840735633553053887641847651173776251820293087212885670180367406807406765923638973161375817392737747832762751690104423869019034

Use RSA to find the secret message

Math is cool! Use the RSA algorithm to decode the secret message, c, p, q, and e are parameters for the RSA algorithm. Use RSA to find the secret message 数学很酷!使用RSA算法解密秘密消息,其中c,p,q和e是RSA算法的参数。 使用RSA算法找到秘密消息。 发现不认识的英语,直接翻译,然后发现没什么用。。

同样可以使用软件解,但是我喜欢使用代码

p =  9648423029010515676590551740010426534945737639235739800643989352039852507298491399561035009163427050370107570733633350911691280297777160200625281665378483
q =  11874843837980297032092405848653656852760910154543380907650040190704283358909208578251063047732443992230647903887510065547947313543299303261986053486569407
e =  65537
c =  83208298995174604174773590298203639360540024871256126892889661345742403314929861939100492666605647316646576486526217457006376842280869728581726746401583705899941768214138742259689334840735633553053887641847651173776251820293087212885670180367406807406765923638973161375817392737747832762751690104423869019034
# 计算模数n
n = p * q
​
# 计算欧拉函数phi(n)、φ(n)
phi = (p - 1) * (q - 1)
​
# 计算私钥指数d,想要计算e的逆元素,需要使用-1作为指数
d = pow(e, -1, phi)
print("私钥d:", d)
​
d = 56632047571190660567520341028861194862411428416862507034762587229995138605649836960220619903456392752115943299335385163216233744624623848874235303309636393446736347238627793022725260986466957974753004129210680401432377444984195145009801967391196615524488853620232925992387563270746297909112117451398527453977
​
m = pow(c,d,n)
print(f"明文:{m}")
​
输出得:
私钥d: 56632047571190660567520341028861194862411428416862507034762587229995138605649836960220619903456392752115943299335385163216233744624623848874235303309636393446736347238627793022725260986466957974753004129210680401432377444984195145009801967391196615524488853620232925992387563270746297909112117451398527453977
明文:5577446633554466577768879988
flag{5577446633554466577768879988}
第三题:

来源:来源:BUUCTF在线评测 (buuoj.cn)

题目类型及名字:Crypto------RSA1

p = 8637633767257008567099653486541091171320491509433615447539162437911244175885667806398411790524083553445158113502227745206205327690939504032994699902053229 
q = 12640674973996472769176047937170883420927050821480010581593137135372473880595613737337630629752577346147039284030082593490776630572584959954205336880228469 
dp = 6500795702216834621109042351193261530650043841056252930930949663358625016881832840728066026150264693076109354874099841380454881716097778307268116910582929 
dq = 783472263673553449019532580386470672380574033551303889137911760438881683674556098098256795673512201963002175438762767516968043599582527539160811120550041 
c = 24722305403887382073567316467649080662631552905960229399079107995602154418176056335800638887527614164073530437657085079676157350205351945222989351316076486573599576041978339872265925062764318536089007310270278526159678937431903862892400747915525118983959970607934142974736675784325993445942031372107342103852
​
注释:在RSA加密算法中,dp和dq是私钥的两个部分,用于解密加密的消息。它们与私钥的另一部分一起组成了完整的私钥。具体来说:
dp是私钥的第一个部分,它是私钥指数d对模数p-1的模反元素。
dq是私钥的第二个部分,它是私钥指数d对模数q-1的模反元素。
在RSA解密过程中,首先使用dp对密文进行解密,然后使用dq对密文进行解密,最后合并这两部分解密结果以还原原始消息
import gmpy2
# 定义RSA解密所需的参数
p = 8637633767257008567099653486541091171320491509433615447539162437911244175885667806398411790524083553445158113502227745206205327690939504032994699902053229
q = 12640674973996472769176047937170883420927050821480010581593137135372473880595613737337630629752577346147039284030082593490776630572584959954205336880228469
dp = 6500795702216834621109042351193261530650043841056252930930949663358625016881832840728066026150264693076109354874099841380454881716097778307268116910582929
dq = 783472263673553449019532580386470672380574033551303889137911760438881683674556098098256795673512201963002175438762767516968043599582527539160811120550041
c = 24722305403887382073567316467649080662631552905960229399079107995602154418176056335800638887527614164073530437657085079676157350205351945222989351316076486573599576041978339872265925062764318536089007310270278526159678937431903862892400747915525118983959970607934142974736675784325993445942031372107342103852
# 使用gmpy2库的invert函数计算模意义下的逆元素
I = gmpy2.invert(q, p)
# 使用dp和dq解密密文
mp = pow(c, dp, p)
mq = pow(c, dq, q)
# 使用解密结果和中国剩余定理计算明文
# 在RSA解密中,中国剩余定理的应用需要计算模意义下的逆元素
#步骤如下:
#首先计算 (mp - mq) * I,然后对 p 取模,这一步得到了中国剩余定理中的一个部分。
#接着将上一步的结果乘以 q,再加上 mq,最终得到了解密后的明文 m
m = (((mp - mq) * I) % p) * q + mq
# 打印解密后的明文(十六进制格式)
print(hex(m))
得:0x6e6f784354467b57333163306d335f37305f4368316e343730776e7d
转换得:noxCTF{W31c0m3_70_Ch1n470wn}
网站:https://lzltool.cn/Toolkit/ConvertStringToHexadecimal
第四题:

来源:来源:BUUCTF在线评测 (buuoj.cn)

题目类型及名字:Crypto------RSA3 

共模攻击(还没学)

  • 37
    点赞
  • 10
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值