题目如下:

题目分析:

拿到题,发现给的e不常规,p1和p2相等,有两个不同n,两个不同c和两个不同e。给定两个密文的情况下,通常需要找到两者之间存在的关系,“合并”密文求解才能得到正确的明文。先计算phi1和phi2,然后分别计算e和phi的gcd,发现都等于14,所以这里问题考察e和phi不互素情况下的求解。

1.已知存在如下数学公等式:

1  gcd(e,phi)=b

2  e = a * b

3  ed ≡ 1 mod phi

4  me ≡ c mod n

5  abd  ≡  1 mod phi     由2和3得到,这里可以推出abd=1

6  mab  ≡   c mod  n       由2和4得到,这里可以变换成c ≡ mab mod n

存在性质:

由以上可以推出cbd ≡ mabbd mod n  即得cbd ≡ mb mod n

所以我们先要求出bd,然后就能算出mb。求bd我们可以根据5式子,所以要算出a。由题目分析我们知道b=14,所以a=e/b。代码如下:

p = p1
phi1 = (p - 1) * (q1 - 1)
phi2 = (p - 1) * (q2 - 1)
b = gmpy2.gcd(e1, phi1)
a1 = e1 // b
a2 = e2 // b
bd1 = gmpy2.invert(a1, phi1)
bd2 = gmpy2.invert(a2, phi2)

由以上我们分别求出了bd,然后就可以分别算出mb。到了这一步还是无法算出m的,我第一次看别人题解时就想,直接调用gmpy2.iroot(mb,14)不就算出来m了吗?试了,结果不行。原因?欢迎你告诉我。

无法算出mb所以我们要再找新的解题思路。于是找到了同余式组,如下:

c1 ≡ mb1 mod n1    变换得到   c1 ≡ mb1 mod (p1 * q1)

c2 ≡ mb2 mod n2 同理  c2 ≡ mb2 mod (p2 * q2)

根据同余性质:

a ≡ b mod (mn)   变换成  a ≡ b mod m且a ≡ b mod n

所以得到下列式子:

c1 ≡ mb1 mod p1

c1 ≡ mb1 mod q1

c2 ≡ mb2 mod p2

c2 ≡ mb2 mod q2

因为p1和p2相等,根据如下性质

我们可以得到c3 ≡ mb1 * mb2  mod p

代码写法如下:

mb1 = pow(c1, bd1, n1)
mb2 = pow(c2, bd2, n2)
c3 = mb1 * mb2 % p
c2 = mb2 % q2
c1 = mb1 % q1

接下来要引用中国同余定理,所以先要有所了解,百度百科解释如下:

简单来说,就是求一个整数满足一组同余式组。所以这里把c1,c2和c3‘连接’起来,求一个特解c,即c满足如下:

c3 = c % p

c2 = c % q2

c1 = c % q1

所以求特解c的代码如下:

res = solve_crt([c1, c2, c3], [q1, q2, p]) 

于是我们重新得到了c ≡ me mod n的形式:

res ≡ m14 mod q1*q2

根据上面式子我们就可以求出真正的m14,也许你会想:之前不是都求出了mb了吗?一开始我也挺疑惑的,思考发现之前的mb都是分开的,只有求出特解c之后求的

mb才是真正的m14。根据以上的求解的思路,可以得到如下式子:

因为n = q1 * q2,所以我们只要对7和phi求逆元就可以求出2d,于是就可以求出m2,接着对m2开根就可以得到m。代码如下:

n = q1 * q2
f = (q1 - 1) * (q2 - 1)
m = res % n
d2 = gmpy2.invert(7, f)
m = pow(m, d2, n)
msg = gmpy2.iroot(m, 2)[0]
print(long_to_bytes(msg))

完整代码如下:

from Cryptodome.Util.number import *
import gmpy2
from libnum import * e1 = 14606334023791426
p1 = 121009772735460235364940622989433807619211926015494087453674747614331295040063679722422298286549493698150690694965106103822315378461970129912436074962111424616439032849788953648286506433464358834178903821069564798378666159882090757625817745990230736982709059859613843100974349380542982235135982530318438330859
q1 = 130968576816900149996914427770826228884925960001279609559095138835900329492765336419489982304805369724685145941218640504262821549441728192761733409684831633194346504685627189375724517070780334885673563409259345291959439026700006694655545512308390416859315892447092639503318475587220630455745460309886030186593
c1 = 11402389955595766056824801105373550411371729054679429421548608725777586555536302409478824585455648944737304660137306241012321255955693234304201530700362069004620531537922710568821152217381257446478619320278993539785699090234418603086426252498046106436360959622415398647198014716351359752734123844386459925553497427680448633869522591650121047156082228109421246662020164222925272078687550896012363926358633323439494967417041681357707006545728719651494384317497942177993032739778398001952201667284323691607312819796036779374423837576479275454953999865750584684592993292347483309178232523897058253412878901324740104919248
n1 = p1 * q1 e2 = 13813369129257838
p2 = 121009772735460235364940622989433807619211926015494087453674747614331295040063679722422298286549493698150690694965106103822315378461970129912436074962111424616439032849788953648286506433464358834178903821069564798378666159882090757625817745990230736982709059859613843100974349380542982235135982530318438330859
q2 = 94582257784130735233174402362819395926641026753071039760251190444144495369829487705195913337502962816079184062352678128843179586054535283861793827497892600954650126991213176547276006780610945133603745974181504975165082485845571788686928859549252522952174376071500707863379238688200493621993937563296490615649
c2 = 7984888899827615209197324489527982755561403577403539988687419233579203660429542197972867526015619223510964699107198708420785278262082902359114040327940253582108364104049849773108799812000586446829979564395322118616382603675257162995702363051699403525169767736410365076696890117813211614468971386159587698853722658492385717150691206731593509168262529568464496911821756352254486299361607604338523750318977620039669792468240086472218586697386948479265417452517073901655900118259488507311321060895347770921790483894095085039802955700146474474606794444308825840221205073230671387989412399673375520605000270180367035526919
n2 = p2 * q2 p = p1
phi1 = (p - 1) * (q1 - 1)
phi2 = (p - 1) * (q2 - 1)
b = gmpy2.gcd(e1, phi1)
a1 = e1 // b
a2 = e2 // b
bd1 = gmpy2.invert(a1, phi1)
bd2 = gmpy2.invert(a2, phi2) mb1 = pow(c1, bd1, n1)
mb2 = pow(c2, bd2, n2)
c3 = mb1 * mb2 % p
c2 = mb2 % q2
c1 = mb1 % q1 res = solve_crt([c1, c2, c3], [q1, q2, p]) #crt中国同余定理,求出特解作为
print(res) n = q1 * q2
f = (q1 - 1) * (q2 - 1)
m = res % n
d2 = gmpy2.invert(7, f)
m = pow(m, d2, n)
msg = gmpy2.iroot(m, 2)[0]
print(long_to_bytes(msg))

得到flag :

中间的\xcf\x86为utf-8编码,转换得到字符:φ

最终flag为:flag{gcd_e&φ_isn't_1}

总结:

这题真的真的真的花费了我好多时间去理解,到目前我依然存在一些不理解的地方。当然我也从中学到了一些东西,比如CRT,e和phi不互素时的求解思路等。一开始我是不会做这道题的,于是我去寻找wp,发现每个wp中总是说都不够透彻,所以看了wp总觉得会了但又没完全会,于是写了这篇博客分享我的理解,随便整理思路过程。如果你觉得有所收获,可以跟我分享一下你对这题的理解(也许我理解在某个点不对呢?),这也许能帮助到我。

参考文章:

数论-模运算与同余的性质_AcmAlgorithm的博客-CSDN博客_模同余关系性质的证明

RSA--e与φ(n)不互素时_原味瓜子、的博客-CSDN博客_e与φ(n)不互素

ctfshow funnyrsa1 e与phi不互素_是真的白的博客-CSDN博客

CTFshow——funnyrsa1的wp理解的更多相关文章

  1. 2022第五空间-web部分wp+复盘总结

    打了一天,麻了,大佬tql,这次get到了不少东西,一是一个不太常见的宽字节注入,我是真的没想到,而且后面也是看了wp理解了好一会才弄明白. 0x01: 题目是一个登录框,但是基本上是过滤掉了所有的常 ...

  2. 【WP开发】正确理解页面缓存

    注:本文内容面向Runtime App. 在新建项目后,细心观察,你会发现在App类中有以下代码: // TODO: 将此值更改为适合您的应用程序的缓存大小 rootFrame.CacheSize = ...

  3. 【WP 8.1开发】How to 图像处理

    在今天的吹牛节目开始之前,先交代一件事: 关于玩WP 8.1开发所使用的VS版本问题.对版本的要求是2013的Update2,这是最低要求,只要是这个版本或以上都可以,而update3,update4 ...

  4. 【WP 8.1开发】上下文菜单

    在桌面系统中,别说是开发者,相信有资格考得过计算机一级的人都知道什么叫一下文菜单,或者叫右键菜单. 为了让操作更方便,在手机应用程序中,也应当有这样的菜单.上下文菜单之所以有”上下文“之说,是因为通常 ...

  5. 【WP 8.1开发】自定义(RAW)通知的使用

    继续前面的话题,还是推送通知.上一篇文章中遗留了RAW通知的推送没有给各位演示,特特地留到现在,不为别的,只为这个RAW通知有点意思,玩起来会比较有意思.官方文档将RAW通知译为“原始通知”,这里还是 ...

  6. [WP8.1UI控件编程]Windows Phone理解和运用ItemTemplate、ContentTemplate和DataTemplate

    2.2.5 ItemTemplate.ContentTemplate和DataTemplate 在理解ItemTemplate.ContentTemplate和DataTemplate的关系的之前,我 ...

  7. 从Lumia退役看为什么WP走向没落

    前段时间决定将自己用了三年多的Lumia 800正式退役,这是我用的时间最长的手机,虽然系统上有缺陷,但是好不妨碍他成为我最有感情的一部手机.由于之前是WinPhone 开发者的关系,这部手机是微软送 ...

  8. 转!!深入理解 Session 与 Cookie

    摘要 Session 与 Cookie 不管是对 Java Web 的初学者还是熟练使用者来说都是一个令人头疼的问题.在初入职场时恐怕很多程序员在面试的时候都被问到过这个问题.其实这个问题回答起来既简 ...

  9. 深入理解ClassLoader(五)—类的卸载

    原文地址:http://yhjhappy234.blog.163.com/blog/static/316328322011101413730764/?suggestedreading&wumi ...

随机推荐

  1. 洛谷P1395 会议 (树的重心)

    这道题考察了树的重心的性质,所有点到中心的距离之和是最小的,所以我们一遍dfs求出树的重心,在跑一次dfs统计距离之和. 1 #include<bits/stdc++.h> 2 using ...

  2. POJ3398 Perfect Service (树形DP)

    对于每个u要设置三维. dp[u][0]表示u是服务器,以u为根的最小服务器数,其子节点既可以是,也可以不是,dp[u][0]+=min(d[v][0],d[v][1]); dp[u][1]表示u不是 ...

  3. nginx启停shell脚本

    #!/bin/bash # 编写 nginx 启动脚本 # 本脚本编写完成后,放置在/etc/init.d/目录下,就可以被 Linux 系统自动识别到该脚本 # 如果本脚本名为/etc/init.d ...

  4. Windows活动目录_初识

    计算机组织形式 工作组(用户本地登录时构造SID进行权限分配): 域(统一身份验证与管理) 域注意事项 实体:域控.域用户.加入域的机子. 依赖的服务:netlogon服务 强制刷新组策略gpupda ...

  5. Vue学习之--------el与data的两种写法、MVVM模型、数据代理(2022/7/5)

    文章目录 1.el与data的两种写法 1.1.基础知识 1.2.代码实例 1.3.页面效果 2.MVVM模型 2.1. 基础知识 2.2 .代码实例 2.3.页面效果 3.数据代理 3.1. 基础知 ...

  6. 一次 Redis 事务使用不当引发的生产事故

    这是悟空的第 170 篇原创文章 官网:http://www.passjava.cn 你好,我是悟空. 本文主要内容如下: 一.前言 最近项目的生产环境遇到一个奇怪的问题: 现象:每天早上客服人员在后 ...

  7. vulnhub靶场之NOOB: 1

    准备: 攻击机:虚拟机kali.本机win10. 靶机:NOOB: 1,网段地址我这里设置的桥接,所以与本机电脑在同一网段,下载地址:https://download.vulnhub.com/noob ...

  8. MAUI新生-XAML语法基础:语法入门Element&Property&Event&Command

    一.XAML(MAUI的XAML)和HTML 两者相似,都是标签语言(也叫标记)组成的树形文档.每个标签元素,可视为一个对象,通过"键=值"形式的标签属性(Attribute),为 ...

  9. C#多线程之线程基础篇

    目录 一.概念 二.原理 硬件结构 运行时 三.基础 创建与启动 传递参数 前台/后台线程 异常处理 中断与中止 中断(Interrupt) 中止(Abort) 协作取消模式 四.异步编程模式 异步编 ...

  10. xshell登陆,查看中文日志出现乱码

    看到乱码,首先想到的是编码问题 linux默认编码格式是utf-8,windows默认gbk [root@backup]# echo $LANGen.US.UTF-8 使用fie命令可以查看到文件信息 ...