CTF-Crypto-RSA共模攻击和模不互素攻击

ctf入门RSA共模攻击 RSA共模攻击 一.题目描述 假设有一条信息m,由两个不同的用户使用公钥进行RSA加密(两个用户的e一般不同,模数n一般相同) c1 = m^e1 mod n c2 = m^e2 mod n 得到了两个不同的密文c1,c2 因为公钥是公开的(e1,e2,n)已知 那么攻击者一共知道如下信息 gcd(e1, e2) = 1 m = c1^d1 mod n m = c2^d2 mod n 即通过以上信息求解出明文m 该题目题干为: #coding:utf-8 import gmpy2 import libnu 阅读详情

RSA共模攻击

利用场景

俩次加密使用了相同的N,有不同的e和c。即已知条件:e1,e2,c1,c2,n;

根据

gcd(e1, e2) = 1
m = c1^d1 mod n
m = c2^d2 mod n

求m。

推导过程

先引入 欧几里德扩展算法 :

​ 扩展欧几里得算法用于求解两个整数的最大公约数(GCD)以及相应的贝祖等式(Bézout’s identity)。

​ 对于俩个整数e1和e2,如果它们的最大公约数为1,即gcd(e1, e2) = 1,那么存在整数s1和s2,使得

e1*s1 + e2*s2 = 1

这个等式表达了 e1 和 e2 的线性组合等于 1,其中 s1 和 s2 是整数。

所以根据欧几里德扩展算法,已知e1*s1 + e2*s2 = 1。

因为

c1 = m^e1 mod n
c2 = m^e2 mod n 

所以

(c1^s1*c2^s2) mod n = ((m^e1 mod n)^s1*(m^e2 mod n)^s2) mod n

即

(c1^s1*c2^s2) mod n = (m^(e1^s1 + e2^s2)) mod n

所以

(c1^s1*c2^s2) mod n = (m^(1)) mod n

即

c1^s1*c2^s2= m

可以得证 m

注意的点:

因为 e1*s1 + e2*s2 = 1 这里可知 s1和s2中有一个为负数,在计算时需要判断哪一个为负数并进行模反转。

利用公式:

gcd, s, t = gmpy2.gcdext(e1, e2)

这里使用了 gmpy2 库中的 gcdext 函数来计算两个整数 e1 和 e2 的最大公约数以及相应的 Bézout 系数。贝祖系数就是 s1和 s2;

例题分析

[SWPUCTF 2021 新生赛]crypto2

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

已知条件c1,c2,e1,e2,n,且e1和e2互素。

EXP:

from Crypto.Util.number import long_to_bytes
from gmpy2 import gmpy2, invert

c1 = 100156221476910922393504870369139942732039899485715044553913743347065883159136513788649486841774544271396690778274591792200052614669235485675534653358596366535073802301361391007325520975043321423979924560272762579823233787671688669418622502663507796640233829689484044539829008058686075845762979657345727814280
c2 = 86203582128388484129915298832227259690596162850520078142152482846864345432564143608324463705492416009896246993950991615005717737886323630334871790740288140033046061512799892371429864110237909925611745163785768204802056985016447086450491884472899152778839120484475953828199840871689380584162839244393022471075
e1 = 3247473589
e2 = 3698409173
n = 103606706829811720151309965777670519601112877713318435398103278099344725459597221064867089950867125892545997503531556048610968847926307322033117328614701432100084574953706259773711412853364463950703468142791390129671097834871371125741564434710151190962389213898270025272913761067078391308880995594218009110313
gcd, s, t = gmpy2.gcdext(e1, e2)
if s < 0:
    s = -s
    c1 = invert(c1, n)
elif t < 0:
    t = -t
    c2 = invert(c2, n)
m = pow(c1, s, n) * pow(c2, t, n) % n
print(long_to_bytes(m))
参考文章:https://1ablades.github.io/2017/08/09/RSA%E5%85%B1%E6%A8%A1%E6%94%BB%E5%87%BB/
https://ctf-wiki.org/crypto/asymmetric/rsa/rsa_module_attack/#_7	

RSA共享素数

攻击原理

当存在两个公钥的 N 不互素时,我们显然可以直接对这两个数求最大公因数,然后直接获得 p,q,进而获得相应的私钥。

例题分析

[羊城杯 2021]Bigrsa

题目

from Crypto.Util.number import *
from flag import *

n1 = 103835296409081751860770535514746586815395898427260334325680313648369132661057840680823295512236948953370895568419721331170834557812541468309298819497267746892814583806423027167382825479157951365823085639078738847647634406841331307035593810712914545347201619004253602692127370265833092082543067153606828049061
n2 = 115383198584677147487556014336448310721853841168758012445634182814180314480501828927160071015197089456042472185850893847370481817325868824076245290735749717384769661698895000176441497242371873981353689607711146852891551491168528799814311992471449640014501858763495472267168224015665906627382490565507927272073
e = 65537
m = bytes_to_long(flag)
c = pow(m, e, n1)
c = pow(c, e, n2)

print("c = %d" % c)

# output
# c = 60406168302768860804211220055708551816238816061772464557956985699400782163597251861675967909246187833328847989530950308053492202064477410641014045601986036822451416365957817685047102703301347664879870026582087365822433436251615243854347490600004857861059245403674349457345319269266645006969222744554974358264
    

n1 和 n2 都不能直接分解,且n1和n2互质。

EXP:

from Crypto.Util.number import *

n1 = 103835296409081751860770535514746586815395898427260334325680313648369132661057840680823295512236948953370895568419721331170834557812541468309298819497267746892814583806423027167382825479157951365823085639078738847647634406841331307035593810712914545347201619004253602692127370265833092082543067153606828049061
n2 = 115383198584677147487556014336448310721853841168758012445634182814180314480501828927160071015197089456042472185850893847370481817325868824076245290735749717384769661698895000176441497242371873981353689607711146852891551491168528799814311992471449640014501858763495472267168224015665906627382490565507927272073
e = 65537
c = 60406168302768860804211220055708551816238816061772464557956985699400782163597251861675967909246187833328847989530950308053492202064477410641014045601986036822451416365957817685047102703301347664879870026582087365822433436251615243854347490600004857861059245403674349457345319269266645006969222744554974358264

q = GCD(n1,n2)
p1 = n1 // q
p2 = n2 // q

d1 = inverse(e, (q-1)*(p1-1))
d2 = inverse(e, (q-1)*(p2-1))

print(long_to_bytes(pow(pow(c, d2, n2), d1, n1)))
小指数rsa 多线程版writeup 下载flag.enc 和pubkey.pem文件 将pem文件拖入openssl得到n(modulus)和e(exponent)  openssl rsa -pubin -text -modulus -in pubkey.pem n=C09778534564847D8CC4B420E9335867EC783E6CF5F05CA03EEEDC2563D0EB2A9EBA8F1952A2670B 阅读详情

相关推荐

CTF ——crypto ——RSA原理及各种题型总结

RSA原理及各种题型总结 Table of Contents 一,原理: 信息传递的过程: rsa加密的过程: 二,CTF 中的 常见的十种类型: 1,已知 p ,q,e 求 d? 2,已知 n(比较小),e 求 d? 3,已知 公钥(n, e) 和 密文 c 求 明文 m? 4,已知密文文件 flag.enc / cipher.bin /flag.b64和 公钥文件 ...

小锤队长的博客 7万+

CTF-RSA共模攻击

RSA共模攻击原理和一道CTF中RSA共模攻击例题。

rhyme1213的博客 1632

ctfshow crypto rsa部分题目简单题解

下载点击打开附件e = 65537题目中给了e,n,c的值。使用在线网址分解n得到p,q编写脚本运行得出flag。

2301_81105268的博客 1835

[NPUCTF2020]共 模 攻 击

数学分析

shshss64的博客 2023

BUUCTF_Crypto进阶:RSA多组n与c的共模攻击与模不互素实战

本文深入解析了BUUCTF中RSA多组n与c的共模攻击与模不互素实战技巧。通过数学原理剖析和Python代码实现,详细介绍了如何利用gcd计算公共因子p,快速分解模数并解密密文。文章还提供了CTF实战中的优化技巧和防御措施,帮助读者掌握RSA加密的安全漏洞与攻击方法。

weixin_29324401的博客 225

CTF-Crypto-RSA攻击实战:从共模到模不互素的密钥破解

比如有个题目给出了三个模数N1、N2、N3,其中N1和N2共享一个质因数,N2和N3又共享另一个质因数。当N1和N2不互质时,我们可以通过计算gcd(N1,N2)快速找到它们的公共质因数q,然后分别求出p1=N1/q和p2=N2/q。后来发现题目用了多层加密,需要先用共模攻击解出中间层,再用模不互素攻击解最外层。把共模攻击和模不互素攻击的解题脚本标准化,遇到类似题目时只需替换参数就能快速解题。共模攻击和模不互素攻击虽然都是针对RSA的攻击方法,但适用场景和条件截然不同。来看个真实CTF题目的解题过程。

weixin_31648507的博客 220

CTF密码学之RSA攻击算法

我们开始学习 RSA 的各种攻击算法及其数学原理。希望大家在学习的过程中更多的去关注攻击算法实现的原理,而不仅仅只在于 copy 攻击代码。

蚁景网安学院 7074

ctf python大法好_CTF中RSA攻击方法总结

RSA近期因为一些比赛以及其他原因,总结了一些RSA方面的东西,于是在这里与大家分享,希望大家能有所收获,如有不当之处敬请批评指正。0x01 前言这里就不讨论数论的基础了,进行RSA的题目解答,至少要懂得基本的数论知识的,如果不了解数论的基本知识的话,网上相关内容还是挺多的。RSA基于一个简单的数论事实,两个大素数相乘十分容易,将其进行因式分解确实困难的。在量子计算机还没有成熟的今天,RSA算法凭...

weixin_39978282的博客 1798

CTF——针对RSA的共模攻击

0x00 背景 在今年的5space比赛中做到一道比较简单的RSA题。由于没怎么接触过crypto的题目(别的题都好难,做不出来呀233),在这里写一下解法,顺便记录一下有关RSA共模攻击的知识。 那么什么是共模攻击呢,大致就是我们可以获取到同一个明文m的经过两个公钥e1,e2加密的密文c1,c2,并且有c1=pow(m,e1,n);c2=pow(m,e2,n) 那么,若e1,e2互素,由扩展欧几里得算法,存在e1*s1+e2*s2==1。我们就可以求m≡m^(e1\*s1+e2\*s2)≡(m^e1)^s

baidu_36110484的博客 3602

RSA共模攻击原理与实战:从CTF到现实漏洞的深度解析

RSA作为非对称加密的基石,其安全性依赖于大整数分解的困难性。其加密过程基于模幂运算,即使用公钥指数和模数对明文进行加密。然而,当同一模数被重复用于加密同一消息时,即使使用不同的公钥指数,也可能引入严重的安全风险。这种风险源于数论中的扩展欧几里得算法和贝祖定理,使得攻击者能够在无需分解模数或获取私钥的情况下,仅通过两组密文和对应的公钥指数恢复出原始明文,这即是共模攻击的核心原理。该攻击的技术价值在于揭示了密码学实现中参数误用的危险性,它完全绕过了RSA的基础安全假设。在应用场景上,无论是CTF竞赛中的密码学

weixin_30905981的博客 709

【愚公系列】2022年04月 密码学攻击-RSA之共模和模不互素

RSA中N模数存在有共模和不共模,你能通过简单的算法把模数中的Q,P分离出来吗 我们的任务分为2个部分: 了解共模的原理,获得flag。 了解模不互素的原理,获得flag 此题为共模类型题,了解解题思路,获得flag 打开题目2中的task_cha,得到题目 根据题目可得 C1=24820838937466182485444267370237504001245434520824363343985049860235017106394020609491066932794628969688390297120

愚公智库 4万+

CTF Crypto之RSA篇

继续上篇的Crypto基础,这篇主要着重练习RSA的各种题型解题回顾一下rsa的加解密过程未知数p、q、e/d。

m0_64481831的博客 1293

别再瞎调参数了!分子动力学模拟新手必看的力场选择与验证实战指南

本文为分子动力学模拟新手提供力场选择与验证的实战指南,详细解析主流力场特性及适用场景,并通过水分子案例演示完整的验证流程。文章重点对比SPC/E、TIP3P和OPLS-AA三种力场在GROMACS中的表现,帮助读者避免常见参数调整误区,提升模拟准确性。

weixin_26934905的博客 420

RSA解密之大素数分解和共模攻击的Python实现

CTF密码学中关于RSA解密的部分解题思路及过程,包括:大素数分解、RSA共模攻击的解析和Python实践。

weixin_45616281的博客 6407

别再只盯着Text-VQA了!这4个主流VQA数据集(含中英双语)的保姆级下载与对比指南

本文深入解析了Text-VQA、ST-VQA、OCR-VQA和EST-VQA这4个主流视觉问答数据集的特性与应用场景,提供了详细的下载与预处理指南。通过对比分析,帮助开发者根据项目需求选择最适合的数据集,避免因选型不当导致的模型性能问题,特别适合需要处理中英双语或多模态文本理解的AI项目。

weixin_42524708的博客 354

初学树莓派——(九)DHT11数据传入ONENET

目录 前言 DHT11实现本地温湿度监测 DHT11.py 接线图 效果图 温湿度数据上传至ONENET 新建产品 新建设备 ONENET.py 测试 Shell脚本配置 效果图 前言 本文分部分实现温湿度上传至OneNet云平台,本地数据监测,数据上传 新建一个文件夹,文件夹内包含DHT11.py、ONENET.py、tmp_data.txt、hum_data.txt DHT11实现本地温湿度监测 DHT11.py import RPi.GPIO as GPIO

会点灯的大力水手的博客 2609

【ctf学习】RSA共模攻击

e1和e2互质的情况下,由拓展欧几里得定理。已知n,c1,e1,c2,e2。根据这个原理来写解密脚本。

小飒的博客 1399

【Unity3D框架】GameFramework框架完全教程《全网最全》-专栏文章目录

最近准备学习框架,了解到GameFramework框架是国产Unity3D框架,准备学习一下,但是奈何全网关于这个框架的教程实在太少。为了让自己学习方便一些,也为了让后来者乘凉。将框架以自己的理解整理目录,并且补全教程。觉得教程有帮助别忘了一键三连哦。

CSDN博客专家,Unity3D高级软件工程师,《Unity 3D从入门到实战》作者。 2万+

CTF入门学习笔记——Crypto密码(现代密码)

🚀🚀打开附件得到一个py文件,我们打开看一下。🚀🚀当两组公钥使用相同的模数N、不同的私钥同时对同一组明文进行加密时,就可以通过共模攻击求解明文,同时需要满足两组公钥e是互质的。🚀🚀当同时生成了多个公钥,如果生成的公钥中有两组N使用了相同的素数,我们就能通过这两组N的最大公因数得到p,q,从而获得私钥。🚀🚀我们简单分析一下,发现这是使用同一个e = 9,不用的n进行加密,首先考虑广播攻击,代码如下所示。🚀🚀我们简单分析一下,发现两组N是相同的,e不同且互素,所以考虑使用共模攻击,代码如下所示。

weixin_66578482的博客 3873

SPAD IMX479规格_分辨率

当然IMX479具备IMX459几乎全部的数字架构,但也有一个缺点就是贵,这个让头部的主机厂有些犹豫,毕竟大家都在集中火力想把车载LiDAR玩进千元机。如果用一片IMX479是不太可能实现千元内部的,当然国产也在奋起直追,特别在前面的几家SPAD厂商都具备开发IMX479的实力,但相对来说落地可能更是当下所考虑的,IMX479的迭代是基于IMX459,小编已经注意到国内有一两家已经在挑战479的规格了,如果国产SPAD没有大规模量产就直接流片IMX479的规格,可能就有点忽略市场的反馈闭环。

致力于lidar应用开发 2410

Trae 保姆级使用指南,零基础小白也能实现编程。

Trae 使用指南 Trae AI 使用 零基础编程 满血版 DeepSeek-R1&V3 AI IDE 深度理解中文开发场景 傻瓜式编程 编程入门 开发入门

Mr.L-OAM的博客 5798

Crypto之RSA(一)

最近在学习CTF中Crypto,整理一些关于RSA的知识点,以及在以往比赛中出现的题目。 完美的密码技术因为有不完美的人类参与而无法实现完美的安全性。 简单介绍RSA RSA是1977年由 罗纳德·李维斯特(Ron Rivest)、阿迪·萨莫尔(Adi Shamir)和伦纳德·阿德曼 (Leonard Adleman)一起提出的。当时他们三人都在麻省理工学院工作。RSA就是他们三人姓氏开头字母拼在一起组成的,三个人名字要有印象,有些题目会用这三个名字,这样可以帮助我们快速判断题目。 RSA公开密钥密码体制的

XXJya的博客 4049

基于STM32L4XX、HAL库的ESP32-C3-WROOM-02-N4 WIFI模块驱动程序设计

支持802.11 b/g/n Wi-Fi (2.4GHz)RISC-V 32位单核处理器,主频高达160MHz。封装尺寸:18mm × 20mm × 3mm。工作温度范围:-40°C ~ 85°C。// 设置WiFi模式为STA。支持Bluetooth 5 (LE)// 发送AT指令测试通信。// 检查响应是否包含OK。内置4MB SPI Flash。// 连接TCP服务器。// 发送HTTP请求。// 初始化UART。// 建立TCP连接。低功耗设计,适合IoT应用。

zhusl6688的博客 377

【CTF Writeup】Crypto题型之经典RSA算法破解全解析

本文重点:ctf writeup是什么?ctf是什么意思?CTF靶场、CTF比赛,CTF网络安全大赛

wangluo12138的博客 1330

C# 开发实战:深度解析 13.56MHz 射频卡读写应用

本文详细介绍了如何在 C# 环境下开发 13.56MHz 射频卡的读写应用。通过 ACR122U 作为硬件设备,结合 C# 提供的 COM 组件或 SDK,我们能够实现对射频卡的读取与写入功能。在实际开发中,开发者还需要根据具体应用场景选择合适的卡片类型与设备,并注意性能优化和异常处理。随着技术的发展,RFID 技术的应用场景会越来越广泛,开发者可以根据不同需求,灵活扩展读写功能,实现更加智能化和自动化的系统。

这里只有干货:从 Modbus 通信到 MES 对接,从 YOLO 训练到工控机部署,带你搞定工业软件开发全流程。 1580

lwip-2.0.3

lwip是瑞典计算机科学院(SICS)的Adam Dunkels 开发的一个小型开源的TCP/IP协议栈。实现的重点是在保持TCP协议主要功能的基础上减少对RAM 的占用。

CTF 中RSA的常见解析

0x01 前言 这里就不讨论数论的基础了,进行RSA的题目解答,至少要懂得基本的数论知识的,如果不了解数论的基本知识的话,网上相关内容还是挺多的。 RSA基于一个简单的数论事实,两个大素数相乘十分容易,将其进行因式分解确实困难的。在量子计算机还没有成熟的今天,RSA算法凭借其良好的抵抗各种攻击的能力,在公钥密码体制中发挥着中流砥柱的作用。然而即便RSA算法目前来说是安全可靠的,但是错误的...

weixin_43404314的博客 3141

精雕软件(JDpaint) 5.5 绿色版

精雕软件(JDpaint) 5.5 绿色版精雕软件(JDpaint) 5.5 绿色版精雕软件(JDpaint) 5.5 绿色版

上一篇: 极客大挑战2023 Reverse wp
下一篇: CTF-Crypto-RSA指数攻击-低加密指数广播攻击
Sciurdae
博客等级 码龄4年 1263粉丝 89原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Sciurdae

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值