密码CTF(4)——e和phi不互素

参考

RSA中e和phi不互素

AMM算法

AMM算法简要理解

RSA系列解题研究——e与phi不互素 - 先知社区 (aliyun.com)

e与phi不互素 --- 四 + 1 + 1 + 1道题详记-CSDN博客

总述

  • gcd(e,φ(n))比较小时可以考虑iroot直接开根,当直接开根跑不出来时,考虑有限域内开方
  • gcd(e,φ(n))很大时,考虑AMM算法或有限域开方
  • 总之,大多数都可以使用有限域开方解题;但是e与(p-1)互素时,模p比较简单,而且可以是多因子(phi中互素的因子都参与,例五)

一、[LitCTF 2023]e的学问

_gcd=gcd(e,phi)=2比较小,直接iroote//_gcd次根

1.题目:

# from Crypto.Util.number import *
# m=bytes_to_long(b'xxxxxx')
# p=getPrime(256)
# q=getPrime(256)
# e=74
# n=p*q
# c=pow(m,e,n)
# print("p=",p)
# print("q=",q)
# print("c=",c)p = 86053582917386343422567174764040471033234388106968488834872953625339458483149
q = 72031998384560188060716696553519973198388628004850270102102972862328770104493
c = 3939634105073614197573473825268995321781553470182462454724181094897309933627076266632153551522332244941496491385911139566998817961371516587764621395810123

2.

import gmpy2
import libnume = 74
p = 86053582917386343422567174764040471033234388106968488834872953625339458483149
q = 72031998384560188060716696553519973198388628004850270102102972862328770104493
c = 3939634105073614197573473825268995321781553470182462454724181094897309933627076266632153551522332244941496491385911139566998817961371516587764621395810123
n = p*q# 当e约去公约数后与phi互素
def decrypt(p, q, e, c):n = p * qphi = (p - 1) * (q - 1)t = gmpy2.gcd(e, phi)print(t)d = gmpy2.invert(e // t, phi)m = pow(c, d, n)print(m)msg = gmpy2.iroot(m, t)print(msg)if msg[1]:print(libnum.n2s(int(msg[0])))decrypt(p, q, e, c)

LitCTF{e_1s_n0t_@_Prime}

二、[2023MoeCTF] bad_E

e和φ(n)不互素,但是e和p−1或者q−1互素,转化到模p 或者模q 下求解

m = c ^ d mod n
==>
m = c ^ d mod p
m = c ^ d mod q
(注:此推论满足的前提是------在c不是p或q的倍数,以及d是正整数的情况下,m = c ^ d modp 和m = c ^ d mod q 总是成立的,有兴趣的同志们可以自行查找推导过程,这里就不过多说了)

1.题目:

from Crypto.Util.number import *
p = getPrime(512)
q = getPrime(512)
e = 65537print(p) 
# 6853495238262155391975011057929314523706159020478084061020122347902601182448091015650787022962180599741651597328364289413042032923330906135304995252477571
print(q) 
# 11727544912613560398705401423145382428897876620077115390278679983274961030035884083100580422155496261311510530671232666801444557695190734596546855494472819with open("flag.txt","r") as fs:flag = fs.read().strip()m = bytes_to_long(flag.encode())
c = pow(m,e,p*q)
print(c) 
# 63388263723813143290256836284084914544524440253054612802424934400854921660916379284754467427040180660945667733359330988361620691457570947823206385692232584893511398038141442606303536260023122774682805630913037113541880875125504376791939861734613177272270414287306054553288162010873808058776206524782351475805

2.解题:

_gcd=gcd(e,phi)= 65537,比较大,可以使用AMM算法。又因为e和q-1互素,所以可以将模n转换为模q.

3.将模n转换为模q---python脚本

import gmpy2
import libnump=6853495238262155391975011057929314523706159020478084061020122347902601182448091015650787022962180599741651597328364289413042032923330906135304995252477571
q=11727544912613560398705401423145382428897876620077115390278679983274961030035884083100580422155496261311510530671232666801444557695190734596546855494472819
e=65537
c = 63388263723813143290256836284084914544524440253054612802424934400854921660916379284754467427040180660945667733359330988361620691457570947823206385692232584893511398038141442606303536260023122774682805630913037113541880875125504376791939861734613177272270414287306054553288162010873808058776206524782351475805
n = p*q
# t = gmpy2.gcd(e, (p-1)*(q-1))
# print(t)  # 65537
gcd_q = gmpy2.gcd(e,q-1)  # 1
d = gmpy2.invert(e, q-1)
m = pow(c, d, q)
print(libnum.n2s(int(m)))

moectf{N0w_Y0U_hAve_kN0w_h0w_rsA_w0rks!_f!lP0iYlJf!M3ru}

三、[2023 一带一路金砖国家] crypto1

gcd(e,phi)=16也比较小,但尝试iroot开根跑不出来,这时考虑有限域内开方来求解.

1.题目:

from Crypto.Util.number import *
from flag import flag
import gmpy2
assert(len(flag)==38)
flag = bytes_to_long(flag)p = getPrime(512)
q = getPrime(512)e = 304
enc = pow(flag,e,p*q)
print(p)
print(q)
print(enc)
#9794998439882070838464987778400633526071369507639213778760131552998185895297188941828281554258704149333679257014558677504899624597863467726403690826271979
#10684338300287479543408040458978465940026825189952497034380241358187629934633982402116457227553161613428839906159238238486780629366907463456434647021345729
#88310577537712396844221012233266891147970635383301697208951868705047581001657402229066444746440502616020663700100248617117426072580419555633169418185262898647471677640199331807653373089977785816106098591077542771088672088382667974425747852317932746201547664979549641193108900510265622890793400796486146522028

2.

先分别求在模p和模q情况下的根,

R.<x> = Zmod(p)[]
f = x ^ e - c
f = f.monic()
res1 = f.roots()
print('res1 =',res1)
​
R.<x> = Zmod(q)[]
f = x ^ e - c
f = f.monic()
res2 = f.roots()
print('res2 = ',res2)'''
这段代码是在Sage数学软件中运行的,用于求解一个在模质数p意义下的方程x^e=c的解。代码定义了一个多项式环R,请注意 R.<x> = Zmod(p)[] 这一句。这里 R 表示多项式环的名称,<x> 表示所定义的环中的变量名是x,而 Zmod(p)[] 表示在模p的意义下定义了一个多项式。其中每个多项式的系数都是p的倍数,以确保在模p的意义下进行运算时不会出现浮点运算精度的问题。接下来,代码定义了一个多项式 f = x^e - c。变量c和e在代码中的定义可能来自其他地方。通过将这个方程的领导系数归一化,再去除它,这个多项式被调整为monic的形式,并被保存在变量f中,以便计算方程的根。接下来,代码再次调用了多项式 f 的roots() 方法,这一次将得到方程的一个根的列表。具体地,最终生成的变量res1是多项式f在模p意义下的根列表。注意,如果方程没有解,则res1变量将为空列表。
'''

再使用中国剩余定理

import libnumres1 = [(9794998439882070838464987778400633526071369507639213778760131539958181412476665109234912082861186315555182138835423582044838702540615722254589975405417838, 1), (13040004482820523832593369471397517833778497118179135095460060922057247745471813715420854141, 1)]
p = 9794998439882070838464987778400633526071369507639213778760131552998185895297188941828281554258704149333679257014558677504899624597863467726403690826271979
q = 10684338300287479543408040458978465940026825189952497034380241358187629934633982402116457227553161613428839906159238238486780629366907463456434647021345729
c = 88310577537712396844221012233266891147970635383301697208951868705047581001657402229066444746440502616020663700100248617117426072580419555633169418185262898647471677640199331807653373089977785816106098591077542771088672088382667974425747852317932746201547664979549641193108900510265622890793400796486146522028
e = 304
res2 =  [(10684338300287479543408040458978465940026825189952497034380241345147625451813458569523087756155643779650342787980103143026719707309659717984620931600491588, 1), (10546228809984142588932616342715328321552379476608001942565701452107946512829920974970543251035295344551528300355346723241264610890289579898347512710457224, 1), (10482040874725218211680697533029686266663549008178103903160375044524596930137226728570965814342405902744600364128887860053217649327227406691784556292324776, 1), (7587150706925009448044848323078167245760828328035695310011484658921549852303397675427817183860064727119368187862675977689355242244610233605342877416416257, 1), (6929915755647234327756166117496179990985501469267159525699449630122977778850898949385810639276049628950031772419336027356980765474388162378519914225520495, 1), (6808250530139244545123813990883203034597988957283224721311935428815631349687956574294930913574694204299623102994534099823502106840178340882372782485458364, 1), (6614395009687937241208994970395255429016903307868654920376515166865642182499067352283924772101088740354565996920188686016365538542794213665633197273513278, 1), (6614140685746605896932899060022876834549907373367709600424726351002948121988351363544709782701044263811762583407690877268515310249161373039675771252203648, 1), (4070197614540873646475141398955589105476917816584787433955515007184681812645631038571747444852117349617077322751547361218265319117746090416758875769142081, 1), (4069943290599542302199045488583210511009921882083842114003726191321987752134915049832532455452072873074273909239049552470415090824113249790801449747832451, 1), (3876087770148234998284226468095262905428836232669272313068305929371998584946025827821526313978467409129216803164704138663278522526729122574061864535887365, 1), (3754422544640245215651874341482285949041323720685337508680791728064652155783083452730646588277111984478808133739902211129799863892519301077914732795825234, 1), (3097187593362470095363192135900298694265996861916801724368756699266080082330584726688640043693096886309471718296562260797425387122297229851091769604929472, 1), (202297425562261331727342925948779673363276181774393131219866313663033004496755673545491413210755710684239542030350378433562980039680056764650090729020953, 1), (138109490303336954475424116263137618474445713344495091814539906079683421804061427145913976517866268877311605803891515245516018476617883558087134310888505, 1), (13040004482820523832593369471397517833778497118179135095460060922057247745471813715420854141, 1)]
for i in res1:for j in res2:# 中国剩余定理m = libnum.solve_crt([int(i[0]), int(j[0])], [p, q])  # c3=libnum.solve_crt([c1,c2], [q1,q2])flag = libnum.n2s(int(m))if flag.startswith(b'flag'):print(flag)

b'flag{947b6543117e32730a93d1b43c98bc57}'

四、[0ctf 2016]RSA

1.题目:

c = 2485360255306619684345131431867350432205477625621366642887752720125176463993839766742234027524
n = 0x2CAA9C09DC1061E507E5B7F39DDE3455FCFE127A2C69B621C83FD9D3D3EAA3AAC42147CD7188C53
e = 3

2.解题:

分解n,得到:

p = 26440615366395242196516853423447
q = 27038194053540661979045656526063
r = 32581479300404876772405716877547
  • 发现 gcd(e, p-1) = gcd(e, r-1) = e = 3, gcd(e, q-1) = 1

    但用
    e*d = 1 mod (q-1)
    m = c ^ d mod q
    求不出m

所以这里为什么求不出m,而题一可以求出m ?
因为m与p或q大小比较的问题,题一中p为512bits,明显比flag大,用p便可单独出来,而这题q明显比flag小,故求不出也在情理之中了

3.

import gmpy2
from Crypto.Util.number import *
import libnum
e = 3
c = 2485360255306619684345131431867350432205477625621366642887752720125176463993839766742234027524
n = 23292710978670380403641273270002884747060006568046290011918413375473934024039715180540887338067p = 26440615366395242196516853423447
q = 27038194053540661979045656526063
r = 32581479300404876772405716877547'''
sage:
R.<x> = Zmod(p)[]
f = x ^ e - c
f = f.monic()
res1 = f.roots()R.<x> = Zmod(q)[]
f = x ^ e - c
f = f.monic()
res2 = f.roots()R.<x> = Zmod(r)[]
f = x ^ e - c
f = f.monic()
res3 = f.roots()print('res1 =',res1)
print('res2 =',res2)
print('res3 =',res3)
'''res1 = [(13374868592866626517389128266735, 1), (7379361747422713811654086477766, 1), (5686385026105901867473638678946, 1)]
res2 = [(19616973567618515464515107624812, 1)]
res3 = [(13404203109409336045283549715377, 1), (13028011585706956936052628027629, 1), (6149264605288583791069539134541, 1)]
for i in res1:for j in res2:for k in res3:m = libnum.solve_crt([int(i[0]),int(j[0]),int(k[0])],[p,q,r])flag = libnum.n2s(int(m))print(flag)

 0ctf{HahA!Thi5_1s_n0T_rSa~}

五、[第三届江西省网络安全大赛]factor

1.题目:

n = 3454083680130687060405946528826790951695785465926614724373
e = 3
c = 1347530713288996422676156069761604101177635382955634367208

2.解题:

对n进行分解

p=11761833764528579549 
q=17100682436035561357 
r=17172929050033177661 

先考虑是多因子,但是在求逆元的时候发现没有逆元,所以猜测e与phi不互素

然后求e分别与p-1,q-1,r-1的最大公约数,发现e与p-1和r-1互素,所以

n = p*r
phi = (p-1)*(r-1)

3.

import gmpy2
import libnumn = 3454083680130687060405946528826790951695785465926614724373
e = 3
c = 1347530713288996422676156069761604101177635382955634367208
p = 11761833764528579549 # 1
q = 17100682436035561357 # 3
r = 17172929050033177661 # 1# phi = (p-1)*(q-1)*(r-1)
# d = gmpy2.invert(e, phi)   #  发现不互素print(gmpy2.gcd(e, p-1))
print(gmpy2.gcd(e, q-1)) # 3
print(gmpy2.gcd(e, r-1))
d = gmpy2.invert(e, (p-1)*(r-1))
m = pow(c, d, p * r)
print(libnum.n2s(int(m)))

CMISCCTF{3_RSA}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/diannao/31576.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

redis哨兵模式下业务代码连接实现

目录 一&#xff1a;背景 二&#xff1a;实现过程 三&#xff1a;总结 一&#xff1a;背景 在哨兵模式下&#xff0c;真实的redis服务地址由一个固定ip转变为可以变化的ip,这样我们业务代码在连接redis的时候&#xff0c;就需要判断哪个主redis服务地址&#xff0c;哪个是从…

MySQL权限USAGE和ALL PRIVILEGES的含义和用法

USAGE 含义&#xff1a;USAGE权限是一个非常基础的权限&#xff0c;它实际上并不赋予用户执行任何数据库操作的权限&#xff0c;如查询、插入、更新或删除数据等。它的主要目的是允许用户连接到MySQL服务器&#xff0c;但除此之外没有其他操作权限。当你只想让用户能够登录到数…

a multiple definition link error when using gcc10.3.1

1 环境说明 硬件环境&#xff1a;LS1046A arm64 系统环境&#xff1a;openEuler release 22.03 (LTS-SP1) gcc10.3.1 2 问题现象 一个客户在设备上编译 Suricata 3.1.1 时发现链接时有很多 multiple definition 的错误&#xff0c; 类似如下&#xff1a; /usr/bin/l…

文件上传漏洞-上篇

一、概述 文件上传漏洞可以说是日常渗透测试中用得最多的一个漏洞&#xff0c;用它获得服务器权限最快最直接。在web程序中&#xff0c;经常需要用到文件上传的功能。如用户或者管理员上传图片&#xff0c;或者其它文件。如果没有限制上传类型或者限制不严格被绕过&#xff0c…

G1的收集流程

G1&#xff08;Garbage-First&#xff09;收集器的垃圾收集流程相对复杂&#xff0c;涉及多个阶段和算法。以下是G1收集器的基本收集流程&#xff1a; 初始标记阶段&#xff08;Initial Marking&#xff09;&#xff1a; 这是一个短暂的STW&#xff08;Stop-The-World&#xff…

大数据学习-Hive

介绍 分布式 SQL 计算 做数据的统计分析&#xff0c;SQL 是最方便的工具 在大数据中&#xff0c;有很多的统计分析场景&#xff0c;那么 SQL 来处理大数据是非常合适且频繁的 以后可能就是 SQL Boy 了&#xff0c;所以学习前需要有 MySQL 的基础 Hive 的功能 是一个分布式…

【软件测试入门】测试用例经典设计方法 — 因果图法

&#x1f345; 视频学习&#xff1a;文末有免费的配套视频可观看 &#x1f345; 点击文末小卡片 &#xff0c;免费获取软件测试全套资料&#xff0c;资料在手&#xff0c;涨薪更快 一、因果图设计测试用例的步骤 1、分析需求 阅读需求文档&#xff0c;如果User Case很复杂&am…

测试技术初阶

1.测试用例设计 黑盒测试用例 等价类边界值因果图判定表正交试验场景分析状态图错误推断 白盒测试用例 语句覆盖判定覆盖条件覆盖条件/判定覆盖条件组合覆盖修正判定条件覆盖点覆盖边覆盖路径覆盖 2基础体验评测 功能体验 完备性准确性易用性易学性展示样式任务路径竞手对比兼…

小程序业务逻辑回忆2

1.用户下单购票业务 购票业务中可购选4中票,普通票、学生票、vip贵宾票、指定日票。购票类型用ticket_id 进行区分,每种类型票用户都可以购买 n张,但是用户只能激活一张,其他票可用于转增。 用户下单购票时首先以user_id创建order表&#xff0c;然后用工具类生成订单号&…

k8s_服务发现专题

在 Kubernetes 中,服务发现(Service Discovery)是指如何在集群内不同的应用程序或服务之间找到并与其他服务通信。Kubernetes 提供了内置的服务发现机制,通过服务(Service)和 DNS 解析来实现。这使得在集群内部署和管理应用程序变得更加方便和高效。 我们带着以下问题开…

css恢复默认样式

重置样式为浏览器默认样式&#xff1b; .element-reset {all: revert;outline-style: revert !important;-webkit-appearance: revert !important; }<input type"button" value"跳转" class"element-reset" />

java构建一个OA审批系统

构建一个完整的OA审批系统涉及多个模块&#xff0c;包括用户管理、权限控制、审批流程设计以及前端界面等。以下是一个综合性的示例&#xff0c;展示了如何整合这些模块并实现基本功能。 ### 数据库设计 首先&#xff0c;定义一些基本的数据库表结构&#xff0c;用于存储用户…

芜湖市各地企业技术中心补助指南 附镜湖鸠江技术中心申报奖励+认定条件周期+流程

芜湖市各地企业技术中心申报周期 省企业技术中心的认定&#xff0c;原则上每年进行一次。各市经济和信息化主管部门根据省经济和信息化厅通知要求报送申请材料&#xff0c;受理截止日期以当年工作通知为准。 芜湖市各地企业技术中心补助汇编 市级&#xff08;2023年兑现政策…

电商项目测试实战之购物车页面用例设计

&#x1f345; 视频学习&#xff1a;文末有免费的配套视频可观看 &#x1f345; 点击文末小卡片&#xff0c;免费获取软件测试全套资料&#xff0c;资料在手&#xff0c;涨薪更快 一、购物车页面 二、购物车页面测试范围列表 三、购物车页面功能点需求分析 四、部分功能点的测试…

vscode CMAKE 配置调试

概述 记录使用VSCODE中的CMAKE拓展构建项目时出现的报错 CMakePresets.json&#xff1a; {"version": 6,"configurePresets": [{"name": "x64-debug","displayName": "x64-debug","cmakeExecutable":…

Hi3861 OpenHarmony嵌入式应用入门--中断按键

本篇讲解gpio的中断使用方式。 硬件原理图如下&#xff0c;与上一篇一样的电路 GPIO API API名称 说明 hi_u32 hi_gpio_init(hi_void); GPIO模块初始化 hi_u32 hi_io_set_pull(hi_io_name id, hi_io_pull val); 设置某个IO上下拉功能。 hi_u32 hi_gpio_set_dir(hi_gpio_…

cefsharp 修改请求头request.Headers,以实现某种请求验证(v100+已测试)含主要源码和注释

(一)目的:cefsharp实现修改请求头 Tip:网上搜的很多代码都无法实现(要么版本较低,方法有变,要么就行不通),较多的错误是:集合属性只读。其中一个bili网友的测试方法注解一张图,但没有具体代码。参考一下。 (二)实现方法 2.1 创建对象 ChromiumWebBrowser home…

数据库精选题(二)(引言+关系代数)

&#x1f308; 个人主页&#xff1a;十二月的猫-CSDN博客 &#x1f525; 系列专栏&#xff1a; &#x1f3c0;数据库 &#x1f4aa;&#x1f3fb; 十二月的寒冬阻挡不了春天的脚步&#xff0c;十二点的黑夜遮蔽不住黎明的曙光 目录 前言 常见概念 一、什么是数据库&#xf…

axi4 总线之 axi-full 学习记录

ARSIZE&#xff1a;读突发大小&#xff0c;给出每次突发传输的字节数支持 1、2、4、8、16、32、64、128 ARSIZE 字节数3b00013b00123b01043b01183b100163b101323b110643b111128 ARLEN&#xff1a;8 位&#xff0c;读传输的突发长度。 AXI3 只支持1~16次的突发传输&#xff08;B…

【Git】撤销远程仓库的提交(push)

参考&#xff1a;Git 撤销远程仓库的提交&#xff08;push&#xff09;和本地仓库的提交&#xff08;commit&#xff09;_git 撤销远程提交-CSDN博客 git reset --soft 想要撤销后的版本号 git push origin master -f soft 要撤销的本地代码不会变化&#xff0c;只是git仓库指…