首页 > 其他分享 >RSA 进阶 中

RSA 进阶 中

时间:2023-11-27 11:35:53浏览次数:36  
标签:gmpy2 进阶 open pow RSA txt data def

数论

二项式定理

费马小定理

基础练习

[金盾信安杯2023]babyrsa

题目:

#! /usr/bin/env python
from libnum import *
from Crypto.Util.number import getPrime, bytes_to_long, long_to_bytes
from secret import p1, q1, p2, q2, e, d, flag, N
from random import randint

def round1(m):
	e = 10
	N = open('round1.txt', 'r').read()
        N = eval(N)
	c = []
	for n in N:
		c.append(pow(m, e, n))
	FILE = open('round1.txt', 'a+')
	FILE.write('#' * 100 + '\n')
	FILE.write(str(c)+'\n')
	FILE.close()
	return c, N

def round2(m, n):
	e1 = 65537
	e2 = 84731
	c1 = pow(m, e1, n)
	c2 = pow(m, e2, n)
	c = [c1, c2]
	open('round2.txt', 'w').write(str(c) + '\n')


def round3(m, n):
	assert p1 * q1 == n
	rand = randint(1, n - 1)
	test_enc = pow(rand, e, n)
	assert pow(test_enc, d, n) == rand
	key = e * d
	new_e = 65537
	c = pow(m, new_e, n)
	f = open('round3.txt', 'w')
	f.write(str(key) + '\n')
	f.write(str(c) + '\n')
	f.close()

def round4(m, n):
	p, q = p2, q2
	e = 65537
	c = pow(m, e, n)
	f = open('round4.txt', 'w')
	f.write(str(c) + '\n')
	f.write(str(pow(p + q, 2019, n)) + '\n')
	f.write(str(pow(p + 2019, q, n)) + '\n')
	f.close()

n1, n2, n3, n4 = N
print 'n1 =', n1
# n1 = 11177704342647691670070109831808378482821379302566268464943167206480241387551242120970561253786504223799891058773501288553907233379501460184102021531940602831324488818584481982166938165369946708273616214479706319082928159418133324715707808391767322038274030554057692976849636562898606740933056248870247255267420120488136713203337167713048960270135675134979523980774070773134748108563438318851158022122836766753248988837577239024669497444315476147384635493684855045085484618938995056978709390818568630471778630936743950045419782341697342117812959693992029294299582179507853091511833090186389981102903683178276414062363

round1(n2)
round2(n3, n2)
round3(n4, n3)
round4(bytes_to_long(flag), n4)

思路:
低加密指数广播攻击+共模攻击+已知n和e*d+数论推导
解:

import gmpy2
import sympy
from functools import reduce
from Crypto.Util.number import *

# .txt删除了[]、L和部分换行
path1 = r'D:\Downloads\Crypto-babyrsa\round1 - n.txt'
path2 = r'D:\Downloads\Crypto-babyrsa\round1 - c.txt'
path3 = r'D:\Downloads\Crypto-babyrsa\round2 - n.txt'
path4 = r'D:\Downloads\Crypto-babyrsa\round3.txt'
path5 = r'D:\Downloads\Crypto-babyrsa\round4.txt'

# 中国剩余定理
def chinese_remainder(modulus,remainders):
    sum = 0
    prod = reduce(lambda a,b:a*b,modulus)
    for m_i,r_i in zip(modulus,remainders):
        p = prod // m_i
        sum += r_i * (inverse(p,m_i)*p)
    return sum % prod

# 低加密指数广播攻击
def de_round1():
    e = 10
    n = []
    c = []
    with open(path1, 'r') as f:
        data = f.read()
        n = data.split("L, ")
        n = [item.rstrip('L') for item in n]
        n = list(map(lambda x: int(x), n))

    with open(path2, 'r') as f:
        data = f.read()
        c = data.split("L, ")
        c = [item.rstrip('L') for item in c]
        c = list(map(lambda x: int(x), c))

    pow_m_e = chinese_remainder(n,c)
    m = gmpy2.iroot(pow_m_e, e)[0]
    # print(m)
    return m
    
# 共模攻击
def de_round2(n):
    e1 = 65537
    e2 = 84731
    c = []
    with open(path3, 'r') as f:
        data = f.read()
        c = data.split("L, ")
        c = [item.rstrip('L') for item in c]
        c = list(map(lambda x: int(x), c))
    
    r , s1 , s2 = gmpy2.gcdext(e1,e2)
    m = (gmpy2.powmod(c[0],s1,n)*gmpy2.powmod(c[1],s2,n)) % n
    # print(m)
    return m
    
# 已知n和e*d
def de_round3(n):
    e = 65537
    with open(path4, 'r') as f:
        data = f.readlines()
        data = [line.strip("\n") for line in data]
        data = list(map(lambda x: int(x), data))
        ed = data[0]
        c = data[1]
    
    p = 0
    q = 2
    k = ed - 1
    while q:
        k=k//2
        p=gmpy2.gcd(gmpy2.powmod(q,k,n)-1,n)%n
        if p>1:
            q = n//p
            break
        else:
            q=int(sympy.nextprime(q))
    
    z = (p-1)*(q-1)
    d = gmpy2.invert(e,z)
    m = gmpy2.powmod(c,d,n)
    # print(m)
    return m

# 数论推导
def de_round4(n):
    e = 65537
    with open(path5, 'r') as f:
        data = f.readlines()
        data = [line.strip("\n") for line in data]
        data = list(map(lambda x: int(x), data))

    c = data[0]
    hint1 = data[1]
    hint2 = data[2]
    p = gmpy2.gcd(hint1 - pow(hint2-2019, 2019, n), n)
    # p = gmpy2.gcd(hint2 - pow(2019, n, n), n)
    q = n // p
    z = (p-1)*(q-1)
    d = inverse(e, z)
    m = gmpy2.powmod(c, d, n)
    return m

if __name__ == "__main__":
    n2 = de_round1()
    n3 = de_round2(n2)
    n4 = de_round3(n3)
    m = de_round4(n4)
    print(bytes.fromhex(hex(m)[2:]))

flag{y0U_R_th3_ch0sen_on3_1n_the_field_of_Crypt0gr4phy}




参考链接:
https://blog.csdn.net/XiongSiqi_blog/article/details/130175464

标签:gmpy2,进阶,open,pow,RSA,txt,data,def
From: https://www.cnblogs.com/darkcyan/p/17858882.html

相关文章

  • Java开发者的Python快速进修指南:面向对象进阶
    在上一期中,我们对Python中的对象声明进行了初步介绍。这一期,我们将深入探讨对象继承、组合以及多态这三个核心概念。不过,这里不打算赘述太多理论,因为我们都知道,Python与Java在这些方面的主要区别主要体现在语法上。例如,Python支持多重继承,这意味着一个类可以同时继承多个父类的属性......
  • 2-3 函数进阶(参数、返回值、作用域)
    ​ 概要:参数的补充函数名,函数名到底是什么?返回值和print函数的作用域 1.参数的补充补充的内容包含:内存地址相关、面试题相关等,在特定情况下也可以让代码更加简洁,提升开发效率。 1.1参数内存地址相关在开始开始讲参数内存地址相关之前,我们先来学习一个技......
  • 【2024省选冲刺计划】数据结构相关-线段树进阶
    线段树进阶0x01李超线段树FZPJ4519[2021冬令营模拟]上古遗迹【题目背景】“沙……沙……沙……”独行者的脚步一次次被刻进沙漠中,干冷的风携沙尘在男子的四围穿过。“该死……这沙尘什么时候才能消停会儿……”男子止不住地咳嗽,随即停了下来,开始查看便携式投影设备上的信......
  • 【Flask笔记】4大章60页md笔记第5篇:Flask模板的进阶使用和案例(图文和代码)
    本文的主要内容:flask视图&路由、虚拟环境安装、路由各种定义、状态保持、cookie、session、模板基本使用、过滤器&自定义过滤器、模板代码复用:宏、继承/包含、模板中特有变量和函数、Flask-WTF表单、CSRF、数据库操作、ORM、Flask-SQLAlchemy、增删改查操作、案例、蓝图、单元测......
  • offline RL | IQL:通过 sarsa 式 Q 更新避免 unseen actions
    题目:OfflineReinforcementLearningwithImplicitQ-Learning,SergeyLevine组,2022ICLR,568。pdf版本:https://arxiv.org/pdf/2110.06169.pdfhtml版本:https://ar5iv.labs.arxiv.org/html/2110.06169openreview:https://openreview.net/forum?id=68n2s9ZJWF8github:h......
  • Java开发者的Python快速进修指南:面向对象进阶
    在上一期中,我们对Python中的对象声明进行了初步介绍。这一期,我们将深入探讨对象继承、组合以及多态这三个核心概念。不过,这里不打算赘述太多理论,因为我们都知道,Python与Java在这些方面的主要区别主要体现在语法上。例如,Python支持多重继承,这意味着一个类可以同时继承多个父类的属......
  • cryptohack RSA部分
    1.Salty:此题为rsa加密中e=1的情况,由于\(ed(modphi)=1\),所以d自然是等于1的,不用分解n就解出了dfromCrypto.Util.numberimportlong_to_bytese=1k=1ct=44981230718212183604274785925793145442655465025264554046028251311164494127485n=110581795715958566206600392161360......
  • 【Python进阶笔记】md文档笔记第6篇:Python进程和多线程使用(图文和代码)
    本文从14大模块展示了python高级用的应用。分别有Linux命令,多任务编程、网络编程、Http协议和静态Web编程、html+css、JavaScript、jQuery、MySql数据库的各种用法、python的闭包和装饰器、mini-web框架、正则表达式等相关文章的详细讲述。全套md格式笔记和代码自取:请移步这里......
  • JAVA进阶 —— 方法引用
    原文链接:https://blog.csdn.net/hdakj22/article/details/129453599一、内容概述方法引用可以拆分为方法和引用两方面:方法引用:把已经有的方法拿过来用,当作函数接口中抽象方法的方法体。::(方法引用符)但是要注意:并不是所有的方法都可以直接引用,需要满足以下四种条件引用......
  • TechTalk | 突破 “成本洞察” ,探索趣丸科技 FinOps 的进阶之路
    《趣丸科技FinOps进阶的探索与实践》作为快速发展的互联网公司,趣丸科技在业务增长的同时,积极开展了成本优化和FinOps的落地工作,并在实践中取得不错的成效。FinOps的发展,涉及了账单波动、FinOps的边际效应、成本模型、依赖工具等多个关键问题。我们始终保持在技术探索的前沿,从......