题目来源:buuCTF-crypto-RSA1
题目:

p = 8637633767257008567099653486541091171320491509433615447539162437911244175885667806398411790524083553445158113502227745206205327690939504032994699902053229
q = 12640674973996472769176047937170883420927050821480010581593137135372473880595613737337630629752577346147039284030082593490776630572584959954205336880228469
dp = 6500795702216834621109042351193261530650043841056252930930949663358625016881832840728066026150264693076109354874099841380454881716097778307268116910582929
dq = 783472263673553449019532580386470672380574033551303889137911760438881683674556098098256795673512201963002175438762767516968043599582527539160811120550041
c = 24722305403887382073567316467649080662631552905960229399079107995602154418176056335800638887527614164073530437657085079676157350205351945222989351316076486573599576041978339872265925062764318536089007310270278526159678937431903862892400747915525118983959970607934142974736675784325993445942031372107342103852

很明显,给了密文c和一些参数,解密求m

一切以解题为目的的抄代码都是耍流氓,我们还是要从数学理论上去解决它,最后再根据数学理论来写代码。

公式推导:

先摆出已知条件:

c≡memodnc≡m^{e} mod nc≡memodn
m≡cdmodnm≡c^{d} mod nm≡cdmodn
ϕ(n)=(p−1)∗(q−1)ϕ(n)=(p−1)∗(q−1)ϕ(n)=(p−1)∗(q−1)
d∗e≡1modϕ(n)d∗e≡1 mod ϕ(n)d∗e≡1modϕ(n)
dp≡dmod(p−1)dp≡d mod (p−1)dp≡dmod(p−1)
dq≡dmod(q−1)dq≡d mod (q−1)dq≡dmod(q−1)

目的很明确,要想得到m,就要得到cdc^{d}cd

利用中国剩余定理,我们可以得到
m1≡cdmodp,m2≡cdmodqm1≡c^{d} mod p,m2≡c^{d} mod qm1≡cdmodp,m2≡cdmodq

这里肯定有很多人不理解,简单证明一下

由m≡cdmodnm≡c^{d} mod nm≡cdmodn,可以得到式子m=cd+k∗nm=c^{d}+k∗nm=cd+k∗n
又因为n=p∗qn=p∗qn=p∗q
所以可以得到m=cd+p∗q∗km=c^{d}+p∗q∗km=cd+p∗q∗k

上述式子,同时取余q和p,可以分别得到
m1≡cdmodp,m2≡cdmodqm1≡c^{d} mod p,m2≡c^{d} mod qm1≡cdmodp,m2≡cdmodq

带入上面的公式,可以得到cd=kp+m1c^{d}=kp+m1cd=kp+m1

我们把这个带入m2可以得到

m2≡(kp+m1)modqm2≡(kp+m1) mod qm2≡(kp+m1)modq

等式两边同时减去m1,可以得到

(m2−m1)≡kpmodq(m2−m1)≡kp mod q(m2−m1)≡kpmodq

这里因为gcd(p,q)=1gcd(p,q)=1gcd(p,q)=1

所以可以求p的逆元,得到(m2−m1)∗p−1≡kmodq(m2−m1)∗p^{−1}≡k mod q(m2−m1)∗p−1≡kmodq
所以这里得到如下式子

k≡(m2−m1)∗p−1modqk≡(m2−m1)∗p^{−1} mod qk≡(m2−m1)∗p−1modq
cd=kp+m1c^{d}=kp+m1cd=kp+m1

我们上下两个式子合并,得到

cd=((m2−m1)∗p−1modq)∗p+m1c^{d}=((m2−m1)∗p^{−1} mod q)*p+m1cd=((m2−m1)∗p−1modq)∗p+m1,
最后带入m≡cdmodnm≡c^{d} mod nm≡cdmodn

得到m≡(((m2−m1)∗p−1modq)∗p+m1)modnm≡(((m2−m1)∗p^{−1} mod q)*p+m1) mod nm≡(((m2−m1)∗p−1modq)∗p+m1)modn
现在只剩最后一步了,即这里的m1和m2怎么求?这时候我们有

d≡dpmod(p−1),d≡dqmod(q−1)d≡d^{p} mod (p−1),d≡d^{q} mod (q−1)d≡dpmod(p−1),d≡dqmod(q−1)

分别带入m1,m2,有

m1≡cdqmod(q−1)modq,m1≡c^{dq mod (q−1)} mod q,m1≡cdqmod(q−1)modq,
m2≡cdpmod(p−1)modpm2≡c^{dp mod (p−1)} mod pm2≡cdpmod(p−1)modp

这里肯定有人又不理解为什么可以直接带入了,我们再证明一下,这里用到了费马小定理即假如p是质数,且gcd(k,p)=1gcd(k,p)=1gcd(k,p)=1,则
k(p−1)≡1modpk(p−1)≡1 mod pk(p−1)≡1modp

所以如果我们有等式

d=dp+k∗(p−1)

我们直接带入,有

m2≡cdp+k∗(p−1)modpm2≡c^{dp+k∗(p−1) }mod pm2≡cdp+k∗(p−1)modp

这里的指数,我们拆开,为

m2≡cdp∗ck∗(p−1)modpm2≡c^{dp}∗c^{k∗(p−1) }mod pm2≡cdp∗ck∗(p−1)modp

这里的

ck∗(p−1)≡1modpc^{k∗(p−1)}≡1 mod pck∗(p−1)≡1modp(用了刚才说的费马小定理)
所以
m2≡c^{dp} mod p$

那么m1根据对称性也可以同理得到

m1≡cdqmodqm1≡c^{dq} mod qm1≡cdqmodq

最终,我们拥有了如下的条件:
m1≡c^{dq }mod q
m2≡c^{dp} mod p
m≡(((m2−m1)∗p−1 mod q)p+m1) mod n

一切就绪,等号右边的全部都是已知的,开算
上代码

import libnum
def egcd(a, b):if (b == 0):return 1, 0, aelse:x, y, q = egcd(b, a % b)  # q = GCD(a, b) = GCD(b, a%b)x, y = y, (x - (a // b) * y)return x, y, qdef mod_inv(a, b):return egcd(a, b)[0] % b  # 求a模b得逆p = 8637633767257008567099653486541091171320491509433615447539162437911244175885667806398411790524083553445158113502227745206205327690939504032994699902053229
q = 12640674973996472769176047937170883420927050821480010581593137135372473880595613737337630629752577346147039284030082593490776630572584959954205336880228469
dp = 6500795702216834621109042351193261530650043841056252930930949663358625016881832840728066026150264693076109354874099841380454881716097778307268116910582929
dq = 783472263673553449019532580386470672380574033551303889137911760438881683674556098098256795673512201963002175438762767516968043599582527539160811120550041
c = 24722305403887382073567316467649080662631552905960229399079107995602154418176056335800638887527614164073530437657085079676157350205351945222989351316076486573599576041978339872265925062764318536089007310270278526159678937431903862892400747915525118983959970607934142974736675784325993445942031372107342103852invq=mod_inv(p,q)
mp=pow(c,dp,p)
mq=pow(c,dq,q)
m=((mp-mq)*invq%p)*q+mq
print(libnum.n2s(m))

最终得到答案

CTF-RSA1(已知p、q、dp、dq、c)相关推荐

  1. [crypto]-51-RSA私钥pem转换成der, 在将der解析出n e d p q dp dq qp

    1.将pem转换成der openssl base64 -d -in test_priv.pem -out 1.data user1:~/work/crypto$ openssl base64 -d ...

  2. RSA:由p,q,dp,dq,c求明文的算法

    1.例题:[BUUCTF]RSA1 2.例题writeup 3. python解密: import gmpy2 I = gmpy2.invert(q,p) mp = pow(c,dp,p) mq = ...

  3. 已知命题公式(¬p→q)→(¬q∨p)

    已知命题公式(¬p→q)→(¬q∨p)(\lnot p\rightarrow q)\rightarrow(\lnot q \lor p)(¬p→q)→(¬q∨p) 构造真值表 p,q (¬p→q)(\ ...

  4. 【CTF reverse Java逆向】JEB3.19逆向方案(已知2022.02.14可用)

    声明:仅供Java逆向学习参考! 解决方案 下载参考链接1提供的JEB.在power shell运行.\jeb_wincon.bat启动JEB. 进入界面后,如果让你提供license key,就运行 ...

  5. RSA已知密文和公钥

    方法一:利用RsaCtfTool工具(kali虚拟机中) 已知公钥(自动求私钥)–publickey,密文–uncipherfile 命令:python RsaCtfTool.py --publick ...

  6. 已知三角形三点坐标求角度_高中数学:椭圆相关角度的最值问题

    圆锥曲线中的最值问题主要包括长度最值.角度最值及面积最值等. 例题:如图1,已知椭圆的中心在坐标原点,焦点在x轴上,长轴 的长为4,左准线与x轴的交点为M, . (1)求椭圆的方程: (2)若直线 , ...

  7. 【小米校招笔试】假如已知有n个人和m对好友关系(存于数字r)。如果两个人是直接或间接的好友(好友的好友的好友...),则认为他们属于同一个朋友圈,请写程序求出这n个人里一共有多少个朋友圈。

    2016年小米校招笔试第三题(西安站) 3 假如已知有n个人和m对好友关系(存于数字r).如果两个人是直接或间接的好友(好友的好友的好友...),则认为他们属于同一个朋友圈,请写程序求出这n个人里一共 ...

  8. MATLAB已知坐标均匀取电,基于MATLAB带钢卷取电液伺服控制系统的分析(word文档良心出品)(11页)-原创力文档...

    系统动力学结课作业-基于MATLAB的 带钢卷取电液控制系统的研究 姓名: 王紫民 流水号:学号: 专业: 机械工程 日期: 2014.05.10 基于MATLAB^钢卷取电液伺服控制系统的分析 一. ...

  9. matlab画曲面二次,如何用matlab绘制二次B样条三维曲面(已知控制点和节点矢量)?...

    该楼层疑似违规已被系统折叠 隐藏此楼查看此楼 小弟初来乍到,现在需要用matlaB绘制二次B样条曲面,现在已知信息: 小弟做这个已经一个星期了,现在无任何进展,现在是万分着急,希望高手们给小弟指点一二 ...

最新文章

  1. Scrapy基础(一) ------学习Scrapy之前所要了解的
  2. PHP气缸种类,气缸分类方法有哪些及气缸的种类
  3. CCF201612-1 中间数(100分)
  4. flume 1.7在windows下的安装与运行
  5. 为什么道理都懂,却还是一事无成
  6. mysql 主从同步不一致_涨知识!MySQL 主从同步原理原来是这样的
  7. 子网规划与组网实验_【干货】从0到1,“大型WLAN组网”基础知识分享~
  8. 上海纽约大学发布2019届毕业生就业报告,出国深造比高达67%
  9. 基于Spring Security的认证授权_自定义登录页面_Spring Security OAuth2.0认证授权---springcloud工作笔记127
  10. MFC中的问题记录 2012-2-20
  11. 数据分析第一步 | 做好数据埋点
  12. 别嘲笑老同志了!网络诈骗,19岁小鲜肉最容易中招
  13. WPF备忘录(1)有笑脸,有Popup
  14. Python Lex Yacc手册
  15. 现在商业社会,跨界打劫随处可见,一家家政公司跨界疯狂赚钱模式!
  16. iOS13.3如何越狱 checkra1n越狱工具0.9.7beta如何使用
  17. 飞塔防火墙×××之隧道分离 (Split Tunneling)
  18. 算法工程师,个人优缺点
  19. Android 有盟分享组件开发—微信未知错误 1
  20. FM1906段码屏驱动

热门文章

  1. windows 安装python3 Eclipse 配置python插件
  2. nginx启动无反应
  3. 分享 :CSS常见面试题
  4. 【Java基础】 ⾯向对象编程三⼤特性 --封装、继承、多态
  5. 素数和(5分) 题目内容: 我们认为2是第一个素数,3是第二个素数,5是第三个素数,依次类推。 现在,给定两个整数n和m,0<n<=m<=200,你的程序要计算第n个素数到第m个素数之间所有的素数的
  6. 大数据血缘分析系统设计(三)
  7. L1-079 天梯赛的善良 (20 分)python
  8. Machine Learning---PNN
  9. JPEG图像压缩详解
  10. 第一次做鸭子的感受!