adworld-crypto-equation-2

2023-11-07

参考:大佬的题解
拿到了一张上半部分被遮掉的RSA的私钥照片,以及一份密文

openssl私钥结构

version | pad | n | pad | e | pad | d | pad | p | pad | q | pad | x1 | pad | x2 | pad | x3

其中 pad 表示填充信息,用来表示接下来的大数所占字节数等信息
pad 以 '\x02’开头,后接信息有两种情况

  • ‘\x81’或’\x82’ + length表示接下来的length所占字节数为1或2,length表示后面的数据所占字节数,例如’\x02\x81\x30’,表示后面的大数占用0x30个字节
  • length,例如’\x02\x30’,表示后面的大数占用0x30个字节

x 1 = d    %    ( p − 1 ) x_1 = d\; \%\;(p-1) x1=d%(p1)
x 2 = d    %    ( q − 1 ) x_2 = d\; \%\;(q-1) x2=d%(q1)
x 3 = q − 1    %    p x_3=q^{-1}\;\%\;p x3=q1%p,大佬的题解中这一块似乎写的不对

利用已知信息恢复私钥

已知信息

Os9mhOQRdqW2cwVrnNI72DLcAXpXUJ1HGwJBANWiJcDUGxZpnERxVw7s0913WXNtV4GqdxCzG0pG5EHThtoTRbyX0aqRP4U/hQ9tRoSoDmBn+3HPITsnbCy67VkCQBM4xZPTtUKM6Xi+16VTUnFVs9E4rqwIQCDAxn9UuVMBXlX2Cl0xOGUF4C5hItrX2woF7LVS5EizR63CyRcPovMCQQDVyNbcWD7N88MhZjujKuSrHJot7WcCaRmTGEIJ6TkU8NWt9BVjR4jVkZ2EqNd0KZWdQPukeynPcLlDEkIXyaQx

将其用base64解码后得到:

b':\xcff\x84\xe4\x11v\xa5\xb6s\x05k\x9c\xd2;\xd82\xdc\x01zWP\x9dG\x1b
\x02A\x00\xd5\xa2%\xc0\xd4\x1b\x16i\x9cDqW\x0e\xec\xd3\xddwYsmW\x81\xaaw\x10\xb3\x1bJF\xe4A\xd3\x86\xda\x13E\xbc\x97\xd1\xaa\x91?\x85?\x85\x0fmF\x84\xa8\x0e`g\xfbq\xcf!;\'l,\xba\xedY
\x02@\x138\xc5\x93\xd3\xb5B\x8c\xe9x\xbe\xd7\xa5SRqU\xb3\xd18\xae\xac\x08@ \xc0\xc6\x7fT\xb9S\x01^U\xf6\n]18e\x05\xe0.a"\xda\xd7\xdb\n\x05\xec\xb5R\xe4H\xb3G\xad\xc2\xc9\x17\x0f\xa2\xf3
\x02A\x00\xd5\xc8\xd6\xdcX>\xcd\xf3\xc3!f;\xa3*\xe4\xab\x1c\x9a-\xedg\x02i\x19\x93\x18B\t\xe99\x14\xf0\xd5\xad\xf4\x15cG\x88\xd5\x91\x9d\x84\xa8\xd7t)\x95\x9d@\xfb\xa4{)\xcfp\xb9C\x12B\x17\xc9\xa41'

以上信息是我已经将\x02分出来之后的信息

我们会发现最后一段里面含有’\x02’,为什么它不能作为pad呢?
该’\x02’后接了’i’
‘i’ 的 ascii 码为105,意味着后面大数所占字节数为105,然后后面的数据长度不足105,所以该’\x02’并不是pad

那么根据上面的信息,我们已经得出来了x1, x2, x3

d ∗ e ≡ 1    %    ( p − 1 ) ( q − 1 ) d * e \equiv 1\;\%\;(p-1)(q-1) de1%(p1)(q1)
d ∗ e ≡ 1    %    ( p − 1 ) d*e \equiv 1\;\%\;(p-1) de1%(p1)
d ∗ e ≡ 1    %    ( q − 1 ) d*e \equiv 1\;\%\;(q-1) de1%(q1)
x 1 ∗ e ≡ 1    %    ( p − 1 ) x_1*e \equiv 1\;\%\;(p-1) x1e1%(p1), 因为 x 1 = d    %    ( p − 1 ) x_1=d\;\%\;(p-1) x1=d%(p1)
x 1 ∗ e − 1 = r 1 ∗ ( p − 1 ) x_1*e - 1 = r_1*(p-1) x1e1=r1(p1)
因为 x 1 < p − 1 x_1<p-1 x1<p1,所以近似的 r 1 < e r_1 < e r1<e
同理可得 r 2 < e r_2 < e r2<e
那么有 p = ( x 1 ∗ e − 1 ) / r 1 + 1 p = (x_1*e-1)/r_1+1 p=(x1e1)/r1+1, q = ( x 2 ∗ e − 1 ) / r 2 + 1 q = (x_2*e-1)/r_2+1 q=(x2e1)/r2+1
且要保证 x 3 = q − 1    %    p x_3 = q^{-1}\;\%\;p x3=q1%p

e的常见值有3, 65537。
这里若是e=3的话,情况太少,所以选择e=65537试探

import gmpy2
import base64
import sys

from Crypto.Util.number import isPrime, inverse
from Crypto.PublicKey import RSA
from Crypto.Cipher import PKCS1_v1_5


# sys.stdout = open('./data/x.txt', 'w')


# s = 'Os9mhOQRdqW2cwVrnNI72DLcAXpXUJ1HGwJBANWiJcDUGxZpnERxVw7s0913WXNtV4GqdxCzG0pG5EHThtoTRbyX0aqRP4U/hQ9tRoSoDmBn+3HPITsnbCy67VkCQBM4xZPTtUKM6Xi+16VTUnFVs9E4rqwIQCDAxn9UuVMBXlX2Cl0xOGUF4C5hItrX2woF7LVS5EizR63CyRcPovMCQQDVyNbcWD7N88MhZjujKuSrHJot7WcCaRmTGEIJ6TkU8NWt9BVjR4jVkZ2EqNd0KZWdQPukeynPcLlDEkIXyaQx'
# print(base64.b64decode(s.encode('utf8')))

# Crypto自带的bytes_to_long一直报错,就自己写了一个 
def bytes_to_int(x):
    ans = 0
    for data in x:
        ans <<= 8
        ans += ord(data)
    return ans

x1 = bytes_to_int('\xd5\xa2%\xc0\xd4\x1b\x16i\x9cDqW\x0e\xec\xd3\xddwYsmW\x81\xaaw\x10\xb3\x1bJF\xe4A\xd3\x86\xda\x13E\xbc\x97\xd1\xaa\x91?\x85?\x85\x0fmF\x84\xa8\x0e`g\xfbq\xcf!;\'l,\xba\xedY')
x2 = bytes_to_int('\x138\xc5\x93\xd3\xb5B\x8c\xe9x\xbe\xd7\xa5SRqU\xb3\xd18\xae\xac\x08@ \xc0\xc6\x7fT\xb9S\x01^U\xf6\n]18e\x05\xe0.a"\xda\xd7\xdb\n\x05\xec\xb5R\xe4H\xb3G\xad\xc2\xc9\x17\x0f\xa2\xf3')
x3 = bytes_to_int('\xd5\xc8\xd6\xdcX>\xcd\xf3\xc3!f;\xa3*\xe4\xab\x1c\x9a-\xedg\x02i\x19\x93\x18B\t\xe99\x14\xf0\xd5\xad\xf4\x15cG\x88\xd5\x91\x9d\x84\xa8\xd7t)\x95\x9d@\xfb\xa4{)\xcfp\xb9C\x12B\x17\xc9\xa41')

def genKey(x1, x2, x3):
    e = 65537
    n1 = x1 * e - 1
    n2 = x2 * e - 1
    p = 0; q = 0
    # 尝试求 r1
    for r in range(e - 1, 0, -1):
        if n1 % r == 0:
            p = (n1 // r) + 1
            if gmpy2.is_prime(p):
                break
    # 尝试求 r2
    for r in range(e - 1, 0, -1):
        if n2 % r == 0:
            q = (n2 // r) + 1
            if gmpy2.is_prime(q):
                break
    print(p)
    print(q)
    n = p * q
    phi = (p - 1) * (q - 1)
    d = inverse(e, phi)
    assert inverse(q, p) == x3
    return RSA.construct((n, e, int(d), p, q))

def solve():
    rsa_key = genKey(x1, x2, x3)
    key = PKCS1_v1_5.new(rsa_key)
    with open('./data/flag.enc', 'rb') as fp:
        return key.decrypt(fp.read(), '')
    
if __name__ == "__main__":
    print(solve())    

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

adworld-crypto-equation-2 的相关文章

  • 一文详解编程中的随机数

    一文详解编程中的随机数 随机数的类型 真随机数生成器 TRNG True Random Number Generator 伪随机数生成器 PRNG Pseudo Random Number Genrator 随机数的使用 真随机数 开发中常
  • (全网最详细攻略)【Crypto++】在Visual studio2022中运行Cryptopp

    文章目录 前言 一 Cryptopp是什么 1 Cryptopp CRYPTO 官方文档wiki 二 下载Cryptopp 2 Crypto 下载地址 3 下载PEM包 三 在VS2022中使用Cryptopp库 4 处理crypto 源文
  • 【crypto】基于crypto.js的web前端加解密系统实现

    文章目录 一 概念介绍 1 1 crypto js介绍 1 2 加密 哈希 编码 1 2 1 加密 解密 1 2 2 散列 哈希 1 2 3 BASE64编解码 二 加解密思想 以md5为例 三 前端加密系统实现代码 3 1 加解密 3 2
  • 【CTF】Crypto Writeup【思路已经告诉你了】

    题目 标题 思路已经告诉你了 THERE IS A WORD len WORD 4 md5 WORD key cf9c6242ecfbc924842c8a2095e44c5a SHA256 SHA256 WORD FLAG KEY SHA2
  • openssl生成椭圆曲线的私钥是如何做到每次不同的?

    目录 例子 排查 随机算法 小结 例子 生成一个私钥只需要3步 1 获得指定曲线的group 如比特币的secp256k1 2 group和key绑定 3 用key来生成私钥 先上一段代码例子 key1 EC KEY new if key1
  • 【CTF\Crypto】聪明的小羊

    聪明的小羊 题目 解题思路 在线的解密工具 离线的解密工具 心得 题目链接 题目 一只小羊翻过了2个栅栏 fa fe13f590lg6d46d0d0 解题思路 观察题目中的关键信息 2个栅栏 所以我们怀疑题目可能是个栅栏密码 我们看见题目中
  • ctf密码学习题总结

    1 变异凯撒 加密密文 afZ r9VYfScOeO UL RWUc 格式 flag 一看题中说的是凯撒加密 我就赶快使用工具列出了所有的组合 然而发现没有一个是我想要的 于是乎 又重新审题 说的是变异凯撒 看来不能轻敌 得自己动手尝试喽
  • CryptoJS 加密的使用方法

    因为公司的项目中用到了接口加密解密 所以百度了一下前端JS加密相关的文章 发现谷歌的CryptoJS挺好用的 因为项目用的是vue框架 记录一下项目中使用经验 首先使用npm安装CryptoJS npm install crypto js
  • 在 MinGW 5.3.0 中,“mutex”不是“std”的成员

    我正在使用 MinGW 5 3 0 和 Crypto 5 6 5 C MinGW gt g std c 11 s D WIN32 WINNT 0x0501 LOG cpp U STRICT ANSI Decclass cpp IC MinG
  • 使用 Crypto++ 的 AES 示例 [关闭]

    Closed 这个问题不符合堆栈溢出指南 目前不接受答案 我一直在互联网上搜索goodc AES 代码示例 教程 教授加密技术的基础知识和库的使用 但到目前为止我还没有运气获得像样的材料 好 易于理解 只是移动学习的基础知识 官方文件加密
  • 如何将 Crypto++ 库添加到 Qt 项目

    我下载了 Crypto 源代码并在 Visual Studio 2013 中编译了 cryptlib 项目 然后将生成的 lib 文件添加到我的 Qt 项目中 这使得我的 pro 文件如下所示 QT core gui QT sql grea
  • 与XTR-DH Crypto++的密钥协议

    我尝试在此示例中应用 XTR DH 进行密钥协议 Alice Initialize the Diffie Hellman class with a random prime and base AutoSeededRandomPool rng
  • 将 Crypto++ AES 加密移植到 PHP 的 mcrypt 时密钥大小不正确

    早些时候 我设法将一些 C CryptoPP Rijndael 128 CBC 代码移植到 MCrypt PHP 但现在我遇到了 CFB 模式的问题 C 和 PHP 结果不匹配 第一个字节匹配 但这可能是巧合 其他一切都不是 通过一些诊断
  • Crypto++ 在 algparam.h 中给出编译器错误

    我在一个相当大的文件中有以下几行 include
  • 如何在CTR模式下寻找并解密部分码流?

    我对 cryptopp 中的部分解码有疑问 使用 AES 256 CTR 编码源 CTR Mode lt AES gt Encryption e e SetKeyWithIV key 32 iv string encrypt string
  • C# 中的 RSA 签名和使用 Crypto++ 的 C++ 验证

    由于该类 我正在尝试在 C 中签署一些字节RSAC加密服务提供者 https msdn microsoft com fr fr en en en en library system security cryptography rsacryp
  • 在 Crypto++ 中使用原始 RSA 算法加密和解密消息?

    我在用Crypto http git github com weidai11 cryptopp git密码学相关作品的图书馆 任务的子部分是加密和解密文本 该消息的长度最多为 256 个字符 包含字母数字 空格 点和特殊字符 这段代码适用于
  • 使用 Crypto++ 库以 CBC 模式实现 AES128

    在输入文件中我有 第一行是一个以十六进制编码的密钥 长度为 16 个字节 在第二行加密消息 CBC 模式下的 AES128 在加密消息前面添加随机 iv 这就是我尝试解密的方法 include
  • 通过套接字发送公钥的安全方法

    通过套接字向另一个用户发送 RSA PublicKey 的安全方法是什么 我正在考虑将密钥导出到 ByteQueue 并将字节数组发送给用户 他可以在其中再次构造公钥 或者这是否会泄露可能被滥用的信息 Generate keys AutoS
  • 使用 Crypto++ 和 .NET 的 CFB 模式下的 TripleDES

    我正在尝试使用 TripleDES 使用 C 应用程序获得相同的结果 该应用程序具有Crypto https www cryptopp com 和 NET应用程序使用三重DESCryptoServiceProvider https msdn

随机推荐

  • CodeForces - 6B

    题目链接 import java util Scanner public class Main public static void main String args Scanner sc new Scanner System in int
  • 计算机网络复习资料

    选择与填空 概述 从通信双方信息交互的方式来看 通信有三种基本的方式 分别是单向通信 双向交替通信 和 双向同时通信 如果收发两端之间的传输距离为 10km 信号在媒体上的传输速率为 2 105km s 数据长度为 1000B 数据发送速率
  • @Param注解的用法

    1 概述 首先明确这个注解是为SQL语句中参数赋值而服务的 Param的作用就是给参数命名 比如在mapper里面某方法A int id 当添加注解后A Param userId int id 也就是说外部想要取出传入的id值 只需要取它的
  • 【思科、华为、华三这三大认证,选哪个考最好?】

    说起考证 大多数网络工程师心里都要抖上一抖 对于没考证的网工来说 一听就头痛 怎么谁都有了 就自己没有 对于考了证的网工来说 一听也头痛 怎么这刚考了一个 其他同事考了三个 今天我主要想和你聊的是 思科 华为 华三这三大认证的前景分析 以及
  • 下面一段代码竟然引起反复打开的时候IE进程挂起

    var lchs close window onunload function if lchs fresh if window screenLeft gt 10000 logout else logout window onbeforeun
  • vscode中如何让结果显示在弹出cmd框中

    1 首先修改配置文件launch json终端的 externalConsole true 这个必须为true 注意 后面不能带逗号 2 执行的时候按F6 按F5的时候还是一样显示在旁边的终端窗口中 但是 按F6就会显示在弹出的cmd窗口中
  • 什么叫工作?

    当时公司招了大批应届本科和研究生毕业的新新人类 平均年龄25岁 那个新的助理 是经过多次面试后 我亲自招回来的一个女孩 名牌大学本科毕业 聪明 性格活泼 私下里我得承认 我招她的一个很重要的原因 除了她在大学里优秀的表现之外 还因为她写了一
  • 文件操作命令

    文章目录 touch 命令 命令格式 常用用法 stat命令 命令格式 常用用法 cat命令 命令格式 常用用法 more命令 命令格式 常用用法 less命令 命令格式 常用用法 head命令 命令格式 常用用法 tail命令 命令格式
  • Python中重写(override)

    Python中重写 override Python中 有重写 override 的概念 但是没有严格意义上的重载 overload 类继承时 子类可以重新定义父类中已有的方法 称为重写 Override 在Python中 没有像其他语言 如
  • 前端高频面试题 Day03

    1 Vue computed 和 watch 区别 对于Computed 它支持缓存 只有依赖的数据发生了变化 才会重新计算 不支持异步 当Computed中有异步操作时 无法监听数据的变化 computed的值会默认走缓存 计算属性是基于
  • (CUDA)快速GPU开发------Device函数应用

    Device函数表示的是仅仅在设备 Device 端能够使用的函数 Device函数可以是任何的函数 这样可以通过每一个线程来运行一个Device函数来达到并行的目的 在本文中聚焦软件开发速度 故而不讨论计算性能问题 目录 适用项目 开发方
  • 震惊,竟然能通过表达式计算VO,再也不用手打Getter计算方法了,程序员福利

    我有一个问题 假设我们从给前端返回一个VO 但是VO中的某些属性需要通过计算得来的 如果我们每次都要在实体类中直接计算的话 不利于代码维护性 每次改变计算方法都要重新修改方法 十分麻烦 所以我就想能不能通过一个数学表达式来计算实体类中的属性
  • H20安装

    首先进入一个你自己文件夹 例如 home h2o 1 官网下载 wget c http h2o release s3 amazonaws com h2o rel weierstrass 7 h2o 3 14 0 7 zip 2 解压 安装z
  • 云鲸扫拖一体机器人说明书_活久见,会自己洗拖布的云鲸扫拖机器人

    一 前言 随着科技的发展 从20世纪最重要的发明解放生产力的洗衣机开始 各种自动设备逐渐走入了人们的家庭 但是与西方国家不同家用吸尘器在国内一直不温不火难以成为每一个家庭的必备 中国人日常的清洁工具依旧是扫帚 拖把 抹布 PS 可能是国人不
  • 新手教程04:Gvim快捷键小结

    前言 零基础初学数字IC 学会什么写什么 与大家一起进步 本文主要总结一些Gvim的快捷键 1 H J K L 左 下 右 上 2 w 跳转到下一个单词 b 跳转到上一个单词 3 y 复制 P 粘贴 yy 复制一行 yj 复制当前行和下一行
  • 盘点适合女生的IT方向!谁说女生不能学IT

    IT行业发展趋势越来越好 很多女生也想转行学习IT 但又担心没有合适自己的专业 潜意识觉得IT都是男生学的 今天就来给大家盘点一下 女生在互联网行业的学习方向 女生学IT超酷 的 1 UI设计 UI设计非常注重细节和美感 女性在视觉美感 色
  • 51单片机入门教程(3.2)——数码管的显示实现(0-9)

    连线图 注意 unsigned char code LedChar 10 0xC0 0xF9 0xA4 0xB0 0x99 0x92 0x82 0xF8 0x80 0x90 编写注意辨别LED灯管 共阳数码管 共阴数码管 include
  • fiddler移动端抓包使用教程(详解)

    目录 导读 前言 抓包 什么是抓包 哪些场景下需要抓包 Fiddler Fiddler抓包原理 安装 Fiddler移动端抓包 第一步 允许远程计算机连接 第二步 设置手机网络代理 第三步 允许捕获HTTPS连接 第四步 手机安装证书 写在
  • 嵌入式软件—RK3568开发环境搭建

    一 RK3568 1 1 开发板特点 BSP比较大 对于电脑内存和存储空间要求高 四核CPU 22nm工艺 1 2 BSP BSP Board Support Package 板级支持包 类似于PC系统中BIOS和驱动程序的集合 BSP包含
  • adworld-crypto-equation-2

    参考 大佬的题解 拿到了一张上半部分被遮掉的RSA的私钥照片 以及一份密文 openssl私钥结构 version pad n pad e pad d pad p pad q pad x1 pad x2 pad x3 其中 pad 表示填充