CTFcrypto之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算法的原理

RSA算法流程

共模数攻击

假如Alice和Bob分别利用公钥e_1 ,e_2对明文M进行加密:
C_1=M^(e_1 ) (mod n)
C_2=M^(e_2 ) (mod n)

则可以分别利用私钥d_1 ,d_2进行解密:
M=C_1^(d_1 ) (mod n)
M=C_2^(d_2 ) (mod n)

假如攻击者监听获得了密文C1,C2,所有公钥都是公开的,那么攻击者在已知C1,C2,e1,e2,n的情况下,可以绕过d1,d2直接恢复出明文M。利用信息安全数学基础证明如下:
首先假设这些公钥共模且互素,即有gcd⁡(e_1,e_2 )=1,则
e_1x+e_2y=1
其中x,y皆为整数,一正一负;利用欧几里得扩展算法可以求得一组解(x,y),假设x为正,y为负,利用模运算的性质,因为

成功恢复明文M.
以下我以最近做过的一道CTFcrypt题目为例,演示RSA公共模数攻击,题目如下图,模数n长度为4096bit,
题目
附其源码veryhardRSA.py文件,公钥分别为e1=17,e2=65537

#!/usr/bin/env python

import random

N = 0x00b0bee5e3e9e5a7e8d00b493355c618fc8c7d7d03b82e409951c182f398dee3104580e7ba70d383ae5311475656e8a964d380cb157f48c951adfa65db0b122ca40e42fa709189b719a4f0d746e2f6069baf11cebd650f14b93c977352fd13b1eea6d6e1da775502abff89d3a8b3615fd0db49b88a976bc20568489284e181f6f11e270891c8ef80017bad238e363039a458470f1749101bc29949d3a4f4038d463938851579c7525a69984f15b5667f34209b70eb261136947fa123e549dfff00601883afd936fe411e006e4e93d1a00b0fea541bbfc8c5186cb6220503a94b2413110d640c77ea54ba3220fc8f4cc6ce77151e29b3e06578c478bd1bebe04589ef9a197f6f806db8b3ecd826cad24f5324ccdec6e8fead2c2150068602c8dcdc59402ccac9424b790048ccdd9327068095efa010b7f196c74ba8c37b128f9e1411751633f78b7b9e56f71f77a1b4daad3fc54b5e7ef935d9a72fb176759765522b4bbc02e314d5c06b64d5054b7b096c601236e6ccf45b5e611c805d335dbab0c35d226cc208d8ce4736ba39a0354426fae006c7fe52d5267dcfb9c3884f51fddfdf4a9794bcfe0e1557113749e6c8ef421dba263aff68739ce00ed80fd0022ef92d3488f76deb62bdef7bea6026f22a1d25aa2a92d124414a8021fe0c174b9803e6bb5fad75e186a946a17280770f1243f4387446ccceb2222a965cc30b3929L

def pad_even(x):
	return ('', '0')[len(x)%2] + x

e1 = 17
e2 = 65537


fi = open('flag.txt','rb')
fo1 = open('flag.enc1','wb')
fo2 = open('flag.enc2','wb')

data = fi.read()
fi.close()

while (len(data)<512-11):
	data  =  chr(random.randint(0,255))+data

data_num = int(data.encode('hex'),16)

encrypt1 = pow(data_num,e1,N)
encrypt2 = pow(data_num,e2,N)

fo1.write(pad_even(format(encrypt1,'x')).decode('hex'))
fo2.write(pad_even(format(encrypt2,'x')).decode('hex'))

fo1.close()
fo2.close()

写个脚本,利用前述分析过程:

# encoding: utf-8
import sys
sys.setrecursionlimit(1000000) #设置为一百万

N = 0x00b0bee5e3e9e5a7e8d00b493355c618fc8c7d7d03b82e409951c182f398dee3104580e7ba70d383ae5311475656e8a964d380cb157f48c951adfa65db0b122ca40e42fa709189b719a4f0d746e2f6069baf11cebd650f14b93c977352fd13b1eea6d6e1da775502abff89d3a8b3615fd0db49b88a976bc20568489284e181f6f11e270891c8ef80017bad238e363039a458470f1749101bc29949d3a4f4038d463938851579c7525a69984f15b5667f34209b70eb261136947fa123e549dfff00601883afd936fe411e006e4e93d1a00b0fea541bbfc8c5186cb6220503a94b2413110d640c77ea54ba3220fc8f4cc6ce77151e29b3e06578c478bd1bebe04589ef9a197f6f806db8b3ecd826cad24f5324ccdec6e8fead2c2150068602c8dcdc59402ccac9424b790048ccdd9327068095efa010b7f196c74ba8c37b128f9e1411751633f78b7b9e56f71f77a1b4daad3fc54b5e7ef935d9a72fb176759765522b4bbc02e314d5c06b64d5054b7b096c601236e6ccf45b5e611c805d335dbab0c35d226cc208d8ce4736ba39a0354426fae006c7fe52d5267dcfb9c3884f51fddfdf4a9794bcfe0e1557113749e6c8ef421dba263aff68739ce00ed80fd0022ef92d3488f76deb62bdef7bea6026f22a1d25aa2a92d124414a8021fe0c174b9803e6bb5fad75e186a946a17280770f1243f4387446ccceb2222a965cc30b3929L

def pad_even(x):
	return ('', '0')[len(x)%2] + x

#欧几里得扩展算法
def extgcd(a, b):
    if a == 0:
        return (b, 0, 1)
    else:
        g, y, x = extgcd(b % a, a)
        return (g, x - (b // a) * y, y)
#求模逆
def modinv(a, m):
    g, x, y = extgcd(a, m)
    if g != 1:
        raise Exception('modular inverse does exist!')
    else:
        return x % m

def main():
    e_1 = 17
    e_2 = 65537

    fo1 = open('flag.enc1', 'rb')
    fo2 = open('flag.enc2', 'rb')
    fo3 = open('flag_dec.txt', 'wb')

    data1 = fo1.read()
    data2 = fo2.read()
    fo1.close
    fo2.close

    c1 = int(data1.encode('hex'), 16)
    c2 = int(data2.encode('hex'), 16)

    g, x, y = extgcd(e_1, e_2)
    #求模反元素
    if x < 0:
        x = - x
        c1 = modinv(c1, N)
    elif y < 0:
        y = - y
        c2 = modinv(c2, N)
    if g == 1:
        m = (pow(c1, x, N) * pow(c2, y, N)) % N
        fo3.write(pad_even(format(m,'x')).decode('hex'))
    fo3.close

if __name__ == '__main__':


    main()

查看结果:
在这里插入图片描述
成功获取到PCTF{M4st3r_oF_Number_Th3ory},解密成功。
可见,在攻击者已知C1,C2,e1,e2,N时,可以在不知道私钥d1,d2的情况下恢复出明文M,如果不同的用户使用相同的模数。

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

相关推荐

CTFCrypto练习之RSA算法

简介 RSARSA属于非对称加密算法,因为RSARSA使用了两个不同的密钥分别用于加密和解密,这两个密钥称之为公私钥对,其中公钥用于加密,且公钥是公开的,而私钥用于解密,私钥是私有的。在公开密钥密码体制中,加密密钥(即公开密钥)PKPK是公开信息,而解密密钥(即秘密密钥)SKSK是需要保密的。加密算法EE和解密算法DD也都是公开的。虽然解密密钥SKSK是由公开密钥PKPK决定的,但却不能根据PKPK

qq_18661257的专栏 1万+

RSA与大数运算(基本原理剖析)

<br /><br />http://jcwondrous.spaces.live.com/blog/cns!5B208B2E6D12F6AF!361.trak<br /> <br />RSA 依赖大数运算,目前主流RSA算法都建立在512 到1024位的大数运算之上。<br />而大多数的编译器只能支持到64位的整数运算,即我们在运算中所使用的整数必须小<br />于等于64位,即:0xffffffffffffffff,也就是18446744073709551615,这远远达不<br />到RSA 的需要

pungin的专栏 3520

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

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

愚公智库 4万+

RSA算法实现与蒙哥马利算法(转)

原理介绍 RSA 原理: 选取两个不同的大素数p、q,并计算N=p*q,选取小素数d,并计算e,使d*e % (p-1)(q-1)=1,对于任意A<N:若B=A**d % N则A=B**e % N 可见d、e形成了非对称秘钥关系,加密者用公钥d加密,解密者可用私钥e解密,第三者即使拦截了密文B、公钥d和N,在不知道p、q的前提下,无法推算出e,从而无法获得明文A。当N取非常大...

anzailiang1060的博客 1504

RPA 财务共享中心与RPA赋能

在和集团财务官交流的时候,客户经常会提到FSSC,其中有准备建立FSSC,正在建立FSSC,以及已建成FSSC正使用的,当中会有些对FSSC的疑虑和问题,所以花费些时间对FSSC进行了深入调研,从而也有幸拜读了王兴山、陈剑、梅震、钱自严等专业人士写的几本关于FSSC的书,对FSSC的前因后果有了更深入的认识,同时结合自己在FSSC的一些项目经验,故做了本次分享。 本文章主要分享财务共享中心以及R...

weixin_40244959的博客 2750

(UE5 5.2)HISM Mobile DrawInstance在渲染层的实现浅分析

在 (UE4 4.27) UHierarchicalInstancedStaticMesh(HISM)原理分析 这篇博客大致介绍HISM组件从游戏线程到渲染线程的重建KD-Tree和剔除并提交DrawCall逻辑,但是没有分析渲染层的大致数据结构和实现. 可以看出FHierarchicalStaticMeshSceneProxy 实际存储Instance数组数据来自于FInstancedStaticMeshSceneProxy FHierarchicalStaticMeshSceneProxy只是以FClu

qq_29523119的博客 2722

CTF-RSA_共模攻击原理及脚本

CTF-RSA_共模攻击原理及脚本 共模攻击,也称同模攻击。 同模攻击利用的大前提就是,RSA体系在生成密钥的过程中使用了相同的模数n。 在CTF题目中,就是 同一明文,同一n,不同e,进行加密。 m,n相同;e,c不同,且e1 和 e2互质 出题脚本 随机生成flag import random import hashlib import string #字符串列表 a=string.printable #随机生成flag for i in range(10): flag = "" fo

fengerxi33的博客 5236

STM32与小米CyberGear微电机的CAN通信协议深度解析

本文深度解析STM32与小米CyberGear微电机的CAN通信协议,涵盖硬件连接、CAN总线配置、通信协议解析及多电机协同控制。重点介绍了基于STM32的电机控制实践,包括运动模式、速度与位置模式设置,以及数据反馈与故障诊断,为机器人及自动化设备开发提供实用指南。

www00的博客 356

CTF-RSA共模攻击

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

rhyme1213的博客 1632

A Mathematical Framework for Transformer Circuits—(一)

transformer数学理解理论

qq_42208244的博客 2653

TMS320F280049C 学习笔记21 交叉开关 Crossbar (X-BAR)

简单介绍了X-BAR。

whyorwhnt的专栏 2万+

CTF-Crypto-RSA整理

rsa基本参数 N:大整数N,我们称之为模数(modulus) p 和 q :大整数N的两个因子(factor) e 和 d:互为模反数的两个指数(exponent) c 和 m:分别是密文和明文 {N,e}称为公钥,{N,d}称为私钥 加密过程: c=m^e mod n c=pow(m,e,n) 解密过程: m=c^d mod n m=pow(c,d,n) 求解私钥d: d = gmpy2.invert(e, (p-1)*(q-1)) 一般来说,n,e是公开的,但是由于n一般是两

Love&Share 2万+

raw_count、tpm、fpkm、rpkm如何选择

转录组测序中常见的数据类型有:raw_count、tpm、fpkm、rpkm。本文进行简单辨析: 一、概念 1 raw_count RNA-seq数据中,raw_count一般是指mapped到基因外显子区域的reads数目。比如说htseq,STAR,或者RSEM等NGS分析流程计算产生的counts值。其中RSEM(RNA-Seq by Expectation-Maximization),考虑到一条read 可能会匹配多个exon位置,故而其产生的为expected_count。 2 TPM

weixin_59289660的博客 1万+

rsa,已知n,c1,c2,e1,e2,[共N攻击,共模攻击]

已知n,c1,c2,e1,e2,[共N攻击,共模攻击]

amber_o0k的博客 2306

上位机 寻边器 通讯实战

寻边器通讯接口实现 本文介绍了上位机与盖泽(Gazer)和JEL品牌寻边器的通讯接口实现方案。主要内容包括: 接口定义:创建了IAlignerOperation接口,定义了获取状态、控制运动、真空吸附等核心功能。 具体实现: 盖泽寻边器(GazerAlignerCjh):通过串口通讯,实现了回零、校准、移动位置等操作 JEL寻边器(JelAligner):同样基于串口通讯,包含错误处理、状态查询等功能 工厂模式:通过AlignerFactory工厂类根据设备品牌创建对应的实现对象。 设备加载:展示了如何在系

StevenChen的博客 369

STM32实战开发(110):基于STM32的智能地震监测系统开发

地震监测系统是自然灾害预警体系中至关重要的一部分。随着地震灾害的频发和对自然灾害预测精度要求的提高,智能地震监测系统逐渐成为研究的热点。STM32作为一款高性能的微控制器,凭借其强大的处理能力和丰富的外设接口,在地震监测领域中得到了广泛应用。本篇文章将详细介绍如何使用STM32实现一个智能地震监测系统的开发过程,涵盖硬件设计、软件编程、系统实现及相关代码。通过集成加速度传感器、地震数据采集、实时数据处理和无线数据传输功能,我们可以设计一个高效、稳定的智能地震监测系统。

2201_76125393的博客 704

Crypto(10)BUUCTF-RSA3(共模攻击)

好奇一个问题,即共模攻击有什么现实意义?发现也没有什么现实意义,因为(n,e)是已知的,通常每个用户的n是不同的,除非特殊情况吧。

m0_66039322的博客 1086

迈瑞BS系列全自动生化分析仪LIS协议接口手册(内含HL7和ASTM)

迈瑞BS系列全自动生化分析仪LIS协议接口手册,内含HL7和ASTM)

【中国剩余定理】互素与不互素的情况详解

给出 a 和 m ,一个数有逆元的充分必要条件是gcd(a,m)=1,此时逆元唯一存在,这时方程 ax ≡ 1(mod m)的最小整数解 x 称为 a 模 m 的逆元。注意这里每次求得的解都要保证是最小的解的形式,可以通过用(x%mod+mod)%mod 的形式来控制。一个整数除以3余2、除以5余3、除以7余2,求这个整数。X2除以3余0、除以5余3、除以7余0;

momo11232323的博客 4387

复分析 阿尔福斯(Ahlfors) 第三版答案 英文

答案分为十章,有部分习题没有答案,全英文复分析阿尔福斯(Ahlfors) 第三版答案

老版QQ原生表情gif动态

这是老版的QQ表情,不过全是动态的的,Windows照片查看器是不会动的,可以右击用浏览器打开查看,再说一遍是老版的,只是分享给宁愿用老版也要动态的人。

中国剩余定理模数不互素的情况

中国剩余定理 模数不互素的情况 当中国剩余定理在应用中模数不互素时,在求解MiM_iMi​对模数mim_imi​的逆元Mi′M_i'Mi′​时可能会报错说:两个数不是互素的,无法进行求解逆元的操作(我这里用的封装函数gmpy2.invert()求解逆元) 那么假定现在有一组同余式需要用到中国剩余定理求解,但是模数不互素; 将式1:x≡c1(mod m1)x\equiv c_1(mod~m_1)x≡c1​(mod m1​) 式2:x≡c2(mod m2)x\equiv

M3ng@L的博客 2656

lwip-2.0.3

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

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

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

Sciurdae的博客 2368

RSA中 底数m和模数 n 不互素是仍然成立

前言:仅个人小记。 注意到 RSA 中并不要求消息 m 要和模数 n 互素,而 RSA 所依赖的“费马定理,欧拉定理”,仿佛都要要求 m 须和模数 n 互素。这里给出针对 RSA 中 n 为两个素数乘积时的具体解释,实际上应归属于广义的欧拉定理,这里暂不讨论广义的欧拉定理。 前要知识 普通版的欧拉定理 aφ(m)%m≡1,其中a⊥m,φ(⋅)是欧拉函数{a}^{\varphi(m)} \%m\...

Zetaa的博客 4119

CTF密码学中RSA学习以及总结

关于CTF中RSA学习笔记 RSA简介 为了方便理解,先对RSA密钥体制做个简略的介绍。 选择两个大的参数,计算出模数 N = p * q 计算欧拉函数 φ = (p-1) * (q-1),然后选择一个e(1&amp;amp;amp;amp;lt;e&amp;amp;amp;amp;lt;φ),并且e和φ互质(互质:公约数只有1的两个整数) 取e的模反数d,计算方法为:e * d ≡ 1 (mod φ) (模反元素:如果两个正整数e和n互质,那么一定可以...

test 5万+

CTF Crypto RSA算法 入门总结(全)

一、初步认识 https://www.bilibili.com/video/av73858330 二、简单理解 三、深入理解 1.阮一峰——RSA算法原理(一) 2.阮一峰——RSA算法原理(二)

algae 9974

中国剩余定理

中国剩余定理: 设m1,…,mk是k个两两互素的正整数,则对任意的整数b1,…,bk,同余式组: x ≡ b1 (mod m1) …… …… …… x = bk (mod mk) 一定有解,且解是唯一的。 (1)若令m = m1*…*mk,m = mi * Mi, i = 1,…k 则同余式组的解可以表示为 x ≡ b1 * M1’ * M1 + … + bk * Mk’ * Mk (mod m) 其中Mi’为Mi模mi的逆元,即Mi’ * Mi ≡ 1 (mod mi),i = 1,…,k (2)若令N

qq_52193383的博客 1056

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的博客 3601

[CTF密码学]RSA相关题目解题方法与python脚本总结(附例题)

RSA是一种非对称加密体制 ,所谓非对称就是加密钥和解密钥不一样,要解决加解密相关问题,我们首先要弄清楚RSA加密解密流程中用到了哪些东西:**明文 m:**就是待加密的文本啦,一般也就是我们的flag。**密文 C:**加密完成后的密文,一般题目会给你,我们要做的就是根据密文解密出明文。**公钥 e(加密钥):**用来加密的密钥,是一个整数,是公开的。RSA加密的关键部分,一般不会告诉你。我们选取两个大素数并计算它们的乘积,得到n=p*q。**后面会用p,q,n来加密解密。

WANGJUNAIJIAO的博客 9560
上一篇: WeChall challenge:practice 1
下一篇: # “百度杯”CTF比赛 九月场SQLi
LUV_YOUJUN
博客等级 码龄9年 0粉丝 4原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值