2023省赛-CRYPTO-RSA

news/2024/5/19 22:48:07 标签: CTF

2023省赛-CRYPTO-RSA

  • RSA
    • 一、题目分析
    • 二、开始
      • 1、题目
      • 2、分析
      • 3、solve.py
      • 4、get flag

RSA

一、题目分析

1、标题:RSA

2、关键字:共模攻击变形

3、比赛:2023年省赛

4、工具:python

二、开始

1、题目

from Crypto.Util.number import getPrime, long_to_bytes, bytes_to_long
from gmpy2 import gcdext, iroot, invert

def genFlag(prefix='flag'):
    from uuid import uuid4

    flag = '%s{%s}'%(prefix, uuid4())
    return flag

def task():
    flag = genFlag().encode()
    nbits = 1024

    m = bytes_to_long(flag)

    print(m.bit_length())

    p = getPrime(nbits//2)
    q = getPrime(nbits//2)
    n = p*q


    e1 = getPrime(17)
    e2 = getPrime(15)


    c1 = pow(pow(m, 3*e1, n), e1, n)
    c2 = pow(pow(m, 3*e2, n), e2, n)

    print(f'n1 = {n}')
    print(f'e1 = {e1}')
    print(f'c1 = {c1}\n')

    print(f'n2 = {n}')
    print(f'e2 = {e2}')
    print(f'c2 = {c2}\n')

'''

n1 = 80711311928352902694710422970688903606000218692452273911269506769045761705914159133473529264067420955208544069064894951745789822539451286660678312774363283201953736629540550292370742491108053112199867197895749984341885442147728874118323739015205440938518279504759997984775115237492397919379649329850180516261
e1 = 122887
c1 = 59033614245900316909832395678886393276053552915366208621342665332906000721989599030642668957599760516307635849097487785938534526719743083784460303954510364242152451728228357026496644050040514126525518041776661349930706074330888887527845299823685416190405985296818688531105417063538797056226598104927423951627

n2 = 80711311928352902694710422970688903606000218692452273911269506769045761705914159133473529264067420955208544069064894951745789822539451286660678312774363283201953736629540550292370742491108053112199867197895749984341885442147728874118323739015205440938518279504759997984775115237492397919379649329850180516261
e2 = 17257
c2 = 24570094655507396044175375285895366917522198543208218187367223947903249085115185954083311837533185455954612955943018854461433930046296166535549766237187235744710407038811075574034164364122395012692826524642415319528298639367539163546531362754569139791468430890745419711862360528332490543816870699102197775513

'''

    



if __name__ == '__main__':
    task()

2、分析

(1)初步看是共模攻击,即n相同,不同的c1、c2、e1、e2

(2)再分析下加密过程,发现加密的m不同,m是经过一次RSA的。

(3)比赛的时候直接懵逼了,没有想到去推演下计算过程,而是一根筋的去想怎么还原出第一次加密的结果再进行一次共模攻击,结果就没有结果了。

(4)赛后请教了做出来的兄弟,原来就是最简单的数学。

已知n,e1,e2,c1,c2,且

c1 ≡ (m^{3e1}\quad mod \quad n)^{e1} \quad mod \quad n
c2 ≡ (m^{3e2}\quad mod \quad n)^{e2} \quad mod \quad n

简单的数学,初中水平吧,就可以得到

c1 ≡ m^{3{e1}^2}\quad mod \quad n
c2 ≡ m^{3{e2}^2}\quad mod \quad n

c1 ≡ ({m^3})^{{e1}^2}\quad mod \quad n
c2 ≡ ({m^3})^{{e2}^2}\quad mod \quad n

这下就又是我们熟悉的共模攻击了,只是m变成了m的三次方。e变成了各自e的平方。那思路就很清晰了:

第一步:共模攻击求出m的三次方

第二步:开立方得到m,case close。

3、solve.py

#!python3
# -*- coding: utf-8 -*-
# @Time : 2023/6/22 12:30
# @Author : A.James
# @FileName: solve.py



# 共模攻击
import gmpy2
import libnum
from Crypto.Util.number import *

n = 80711311928352902694710422970688903606000218692452273911269506769045761705914159133473529264067420955208544069064894951745789822539451286660678312774363283201953736629540550292370742491108053112199867197895749984341885442147728874118323739015205440938518279504759997984775115237492397919379649329850180516261
e1 = 122887
e2 = 17257
c1 = 59033614245900316909832395678886393276053552915366208621342665332906000721989599030642668957599760516307635849097487785938534526719743083784460303954510364242152451728228357026496644050040514126525518041776661349930706074330888887527845299823685416190405985296818688531105417063538797056226598104927423951627
c2 = 24570094655507396044175375285895366917522198543208218187367223947903249085115185954083311837533185455954612955943018854461433930046296166535549766237187235744710407038811075574034164364122395012692826524642415319528298639367539163546531362754569139791468430890745419711862360528332490543816870699102197775513
e3 = e1**2
e4 = e2**2

s0, s1, s2 = gmpy2.gcdext(e3, e4) #求s1,s2,扩展欧几里得算法
if s1 < 0:
    s1 = -s1
    c1 = gmpy2.invert(c1, n)#求c1的模反数
elif s2 < 0:
    s2 = -s2
    c2 = gmpy2.invert(c2, n)#求c2的模反数
m = gmpy2.powmod(c1, s1, n)*gmpy2.powmod(c2, s2, n) % n
print (m)
print ('-------')
m11 = gmpy2.iroot(m,3)
print (m11)
print ('-------')
m12 = m11[0]
print (m12)
print ('-------')
print (long_to_bytes(m12))
#print '[-]flag is:',libnum.n2s(m)

4、get flag

flag{aad084d1-9593-4e8d-968f-5ea2c382b730}


http://www.niftyadmin.cn/n/457636.html

相关文章

华为项目管理的方法和精髓是什么?

华为在项目团队管理的精髓可以简单总结为精细化管理与人性化管理相结合的双重效益。由于华为公司的严格纪律和刻苦的工作风格&#xff0c;如果单单从收入水平和生活质量来衡量的话&#xff0c;可以肯定地说&#xff0c;华为员工的幸福指数是并不算太高的&#xff1b;但是因为华…

什么是事件委托

文章目录 导文文章重点具体而言&#xff0c;事件委托包含两个主要角色&#xff1a;通过使用事件委托&#xff0c;可以实现以下优势&#xff1a; 代码示例 导文 事件委托是一种在软件开发中常用的设计模式&#xff0c;用于处理事件和回调函数。它允许一个对象&#xff08;委托对…

【CXL】学习资源整理

&#x1f525;点击查看精选 PCIe 系列文章&#x1f525; &#x1f525;点击进入【芯片设计验证】社区&#xff0c;查看更多精彩内容&#x1f525; &#x1f4e2; 声明&#xff1a; 作者主页&#xff1a;【MangoPapa的CSDN主页】。本文首发于CSDN&#xff0c;转载或引用请注明出…

悬赏一个关于离散线性时变系统的稳定性证明问题

对于离散的线性时变系统 Δ k 1 ( I − α k G k ) Δ k \Delta_{k1}(I-\alpha_kG_k)\Delta_{k} Δk1​(I−αk​Gk​)Δk​&#xff0c;其中 α k ∈ R \alpha_k \in R αk​∈R&#xff0c; G k G_k Gk​未知但 ∣ ∣ G k ∣ ∣ ≤ c ||G_k|| \leq c ∣∣Gk​∣∣≤c&#…

驱动开发:内核注册表增删改查

注册表是Windows中的一个重要的数据库&#xff0c;用于存储系统和应用程序的设置信息&#xff0c;注册表是一个巨大的树形结构&#xff0c;无论在应用层还是内核层操作注册表都有独立的API函数可以使用&#xff0c;而在内核中读写注册表则需要使用内核装用API函数&#xff0c;如…

基于open62541库的OPC UA协议节点信息查询及多节点数值读写案例实践

目录 一、OPC UA协议简介 二、open62541库简介 三、 opcua协议的多点查询、多点读写案例服务端opcua_server 3.1 opcua_server工程目录 3.2 程序源码 3.3 工程组织文件 3.4 编译及启动 四、opcua协议的多点查询、多点读写案例客户端opcua_client 4.1 opcua_client工程目录 4…

游戏开发日志17(保存技能树信息)

最开始的想法是这样的&#xff1a;在GameManage中写一个public List<SkillData> skillsnew List<SkillData>();与unity中的SkillData资源文件联系起来&#xff0c;在Save类中创建 public List<bool> IsUnlockednew List<bool>(); public List<int&g…

【Django入门】《第四讲》数据库开发以及Models.py编写规则

文章目录 简介创建一个ModelField类型完整性约束Model方法数据库迁移数据的操作(更新、删除、添加)1. 添加数据2. 更新数据3. 删除数据4. 关联表查询结论简介 在Django中,models.py是定义数据模型的地方。Django的ORM(Object-Relational Mapping)系统会根据models.py中的…