做题杂记222

news/2024/5/20 0:36:49 标签: 密码学, 安全, ctf

文章目录

    • 题1
    • 题2
    • 题3
    • 题4

一些较简单的题目。里面有些小点,稍不留意跑起来也挺费时。

题1

leak
题目描述:

#!/usr/bin/env python
# -*- coding: utf-8 -*-
from Crypto.Util.number import *
from secret import FLAG

m = bytes_to_long(FLAG)


def getpq(nbit):
    p = getPrime(nbit)
    q = getPrime(nbit)
    if p > q:
        return p, q
    else:
        return q, p


p, q = getpq(512)
P = (p - q) & ((1 << 130) - 1)
n = p * q
leak_p = p >> 256
c = pow((1 + P * n), m, n ** 3)

print('n =', n)
print('leak_p =', leak_p)
print("c =", c)

n = 135133139540786818977969958456509467902948924003478556140490841984247464940261764739984274397650928404945721248284577232814352745333641188749824519153271662051302477973525156608141358709265683759057060630360909926255299541198485901065352661702656282587105799982740927802530997159098015074633017964344230291287
leak_p = 115314121469787984258489158421056136177545051135641551928888818017665807264468
c = 1836794759996264077871820946090708779709415760553736759453665641907562256633157424959089180650539327925671892742819931875681606982615287882656254828326465758462357812873839261469783652663796071814218493268788421243190729887313099383264588659922912876424206670310928514588754069909128149471326084547056385690037197908766053620702238356084124023146075698878494434053246157524775269473152458661801907641122308756667762880284617915774590075511686821816948174618196839335059944389423693187930672934293905608970421003536691336581450927887931599275461176935079227494931457562345640133982771901848553204154760760399724074615092290799119053032875792219794072963200108352944441876206386518960615891547166767499506114294860833404421893612197040731184031783165365621722947731966143226777081983415797778111715332055871302609049501876860012070502369090417942239749695034267695710324328867728296996779

题目分析:
高位攻击爆破 8 位得 p , 之后得到 P l e a k = ( 1 + P ∗ n ) m   %   n 3 = C m 2 ∗ ( P ∗ n ) 2 + C m 1 ∗ ( P ∗ n ) + 1 l e a k   %   n 2 = m ∗ P ∗ n l e a k , n , P 均已知, m 也便出来了 高位攻击爆破8位得p,之后得到P\\ leak = (1 + P * n) ^ m \ \% \ n^3 \\ = C_m^{2} * (P * n)^2 + C_m^1 * (P * n) + 1\\ leak \ \%\ n^2 = m * P * n\\ leak,n,P均已知,m也便出来了\\ 高位攻击爆破8位得p,之后得到Pleak=(1+Pn)m % n3=Cm2(Pn)2+Cm1(Pn)+1leak % n2=mPnleak,n,P均已知,m也便出来了

n = 135133139540786818977969958456509467902948924003478556140490841984247464940261764739984274397650928404945721248284577232814352745333641188749824519153271662051302477973525156608141358709265683759057060630360909926255299541198485901065352661702656282587105799982740927802530997159098015074633017964344230291287
leak_p = 115314121469787984258489158421056136177545051135641551928888818017665807264468
c = 1836794759996264077871820946090708779709415760553736759453665641907562256633157424959089180650539327925671892742819931875681606982615287882656254828326465758462357812873839261469783652663796071814218493268788421243190729887313099383264588659922912876424206670310928514588754069909128149471326084547056385690037197908766053620702238356084124023146075698878494434053246157524775269473152458661801907641122308756667762880284617915774590075511686821816948174618196839335059944389423693187930672934293905608970421003536691336581450927887931599275461176935079227494931457562345640133982771901848553204154760760399724074615092290799119053032875792219794072963200108352944441876206386518960615891547166767499506114294860833404421893612197040731184031783165365621722947731966143226777081983415797778111715332055871302609049501876860012070502369090417942239749695034267695710324328867728296996779

P.<x> = PolynomialRing(Zmod(n))
leak_p <<= 8
for i in range(2 ** 8,1,-1):
    print(i)
    high_p = leak_p + i
    f = (high_p << 248) + x
    root = f.small_roots(2 ** 248,0.4,0.01)
    if root:
        print((high_p << 248) + int(root[0]))
        
p = 13352463043552409670211183534740157814546713901105410408023687926498813469217507846107364405269402732967687839808637375591530105677153038557366731161035343
q = n // p
P = (p - q) & ((1 << 130) - 1)
P_m_n = c % (n ** 2) - 1
m = (P_m_n // n // P)
print(long_to_bytes(m))
# DASCTF{365d0d2cda3a3836a19bf1f46760d875}

题2

题目描述:

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

def genprime():
    while True:
        r = getRandomNBitInteger(64)
        p = r ** 6 + 8 * r ** 4 - 41 * r ** 3 + 14 * r ** 2 - 116 * r + 31387 # 384bits
        q = r ** 5 - 9 * r ** 4 + 17 * r ** 3 - 311 * r ** 2 - 16 * r + 14029 # 320bits,n = 704bits
        if isPrime(p) and isPrime(q):
            return p, q

def enc(flag, n):
    m = bytes_to_long(flag)
    return pow(m, 31387, n)

p, q = genprime()
n = p * q
c = enc(flag, n)
print(n)
print(c)

n = 73553176031506251642448229714220151174734540964434813056145000616720019024269982417494553771890010861489245572362590935764438928110836109730139595790550323300572059713433794357690270439325805603980903813396260703
c = 6035303231100318215656164353047198868742763055193754611914191674005776329646395050293747516587004104241717689072827492745628156828285466831779549229513115371571798719567117034735830671759951028004405762435531685
e = 31387

题目分析:
n = p ∗ q = r 11 + . . . r ≈ n 1 / 11 , 在 n 1 / 11 附近爆破出 r ,至此得到 p , q , 得 f l a g n = p * q = r^{11} + ... \\ r \approx n^{1 / 11},在n^{1 / 11}附近爆破出r,至此得到p,q,得flag n=pq=r11+...rn1/11,n1/11附近爆破出r,至此得到p,q,flag

from gmpy2 import *
from Crypto.Util.number import *
n = 73553176031506251642448229714220151174734540964434813056145000616720019024269982417494553771890010861489245572362590935764438928110836109730139595790550323300572059713433794357690270439325805603980903813396260703
c = 6035303231100318215656164353047198868742763055193754611914191674005776329646395050293747516587004104241717689072827492745628156828285466831779549229513115371571798719567117034735830671759951028004405762435531685
e = 31387

r_prox = iroot(n,11)[0]
for r in range(r_prox-2000,r_prox + 2000):
    p = r ** 6 + 8 * r ** 4 - 41 * r ** 3 + 14 * r ** 2 - 116 * r + 31387  # 384bits
    q = r ** 5 - 9 * r ** 4 + 17 * r ** 3 - 311 * r ** 2 - 16 * r + 14029  # 320bits,n = 704bits
    if p * q == n:
        d = invert(e,(p-1)*(q-1))
        print(long_to_bytes(pow(c,d,n)))
        
# CnHongKe{m0re_fuN_RSA!!!}

题3

题目描述:

from flag import FLAG
from Crypto.Util.number import *
import gmpy2
import random

while True:
    p = int(gmpy2.next_prime(random.randint(10**399, 10**400-1)))
    q = int(str(p)[200:]+str(p)[:200])
    if gmpy2.is_prime(q):
        break

m = bytes_to_long(FLAG)
n = p*q
e = 65537
c = pow(m,e,n)

with open("enc","wb") as f:
    f.write(str(c))
    f.write("\n")
    f.write(str(n))

#182812482972168423884795132699225934365072979206288632257180603530046820174392675977209758378734399146216742345585898385168866887000708558119959898992294085847474548306743585711154035585848291290988967352517174312220756638881837930962458861193652684492265539096477345065113556380573776423787885892688197584678128636231428194711357642971544417113415626331810909274966752557628893585198569815939514862013512237657828262360291726912615575646318630641527418369988268899879152029186728850816178597399494254385226049249357897840618728804680238123954207656671747782543031545429711152272581734051959578453680011676521727918037340906791388178004979453256050227967701258768070039292546964652071924183467364467145178290753361477912582242961929982420950384199259355122986865808523351306098081481072454093823090
#438980397031315392229453908048509540832246041631432878509579665664182747463100230160823865621798053164989325086085003940181731721089701380743698761443812523024144817205902380903062054138730658451286904347536210833160924917347633148983052015550354913154312162901555870494273903714349869746793861874257201085777893961715468950661641778512110325457371446203379767458862059193946434683324578530163650541637261158037041205642428802942295011562277084687025213626698849526240663754073508102229066475773893638716845176469070938803298515155140240970836387785401085919369741520890271902332951669953411373633688944162470994856654604872287103746922041844065053274059990595496159866206551119361036237431289830985174384522423364811997241255005514248198447925396378192915553898993758660041223393168707380580012437

题目分析:
设 a b _ h i g h 为 p 的前半段, a b _ l o w 为 p 的后半 即 a b _ h i g h = p / / 1 0 200 , a b _ l o w = p % 1 0 200 令 a b = a b _ h i g h ∗ a b _ l o w p = a b _ h i g h ∗ 1 0 200 + a b _ l o w q = a b _ l o w ∗ 1 0 200 + a b _ h i g h ⇒ n = a b ∗ 1 0 400 + ( a b _ h i g h 2 + a b _ l o w 2 ) ∗ 1 0 200 + a b 设ab\_high为p的前半段,ab\_low为p的后半\\ 即ab\_high = p // 10^{200}, ab\_low = p \% 10^{200}\\ 令ab = ab\_high * ab\_low\\ p = ab\_high * 10^{200} + ab\_low\\ q = ab\_low * 10^{200} + ab\_high\\ \Rightarrow n = ab * 10 ^{400} + (ab\_high^{2} + ab\_low^{2}) * 10^ {200} + ab\\ ab_highp的前半段,ab_lowp的后半ab_high=p//10200,ab_low=p%10200ab=ab_highab_lowp=ab_high10200+ab_lowq=ab_low10200+ab_highn=ab10400+(ab_high2+ab_low2)10200+ab
得到:

在这里插入图片描述
通过对n移位等操作可以得到ab高位和低位,考虑到可能有进位,取高199位,之后爆破一位即可得到完整ab,ab知道便可得到 a b _ h i g h 2 + a b _ l o w 2 ab\_high^2 + ab\_low^2 ab_high2+ab_low2,如此a,b也能分别求出来了

from gmpy2 import *
from Crypto.Util.number import *
c=182812482972168423884795132699225934365072979206288632257180603530046820174392675977209758378734399146216742345585898385168866887000708558119959898992294085847474548306743585711154035585848291290988967352517174312220756638881837930962458861193652684492265539096477345065113556380573776423787885892688197584678128636231428194711357642971544417113415626331810909274966752557628893585198569815939514862013512237657828262360291726912615575646318630641527418369988268899879152029186728850816178597399494254385226049249357897840618728804680238123954207656671747782543031545429711152272581734051959578453680011676521727918037340906791388178004979453256050227967701258768070039292546964652071924183467364467145178290753361477912582242961929982420950384199259355122986865808523351306098081481072454093823090
n=438980397031315392229453908048509540832246041631432878509579665664182747463100230160823865621798053164989325086085003940181731721089701380743698761443812523024144817205902380903062054138730658451286904347536210833160924917347633148983052015550354913154312162901555870494273903714349869746793861874257201085777893961715468950661641778512110325457371446203379767458862059193946434683324578530163650541637261158037041205642428802942295011562277084687025213626698849526240663754073508102229066475773893638716845176469070938803298515155140240970836387785401085919369741520890271902332951669953411373633688944162470994856654604872287103746922041844065053274059990595496159866206551119361036237431289830985174384522423364811997241255005514248198447925396378192915553898993758660041223393168707380580012437
e=65537

ab_high = n // (10 ** 601) #
ab_low = n % (10 ** 200)
ab = ab_high * (10 ** 200) + ab_low

for i in range(10):
    print(i)
    ab = ab_high * 10 ** 201 + i * 10 ** 200 + ab_low
    a2b2 = (n - ab * (10 ** 400 + 1)) // 10 ** 200
    a_add_b = iroot(abs(a2b2 + 2 * ab),2)

    if a_add_b[1]:
        a_sub_b = iroot(abs(a2b2 - 2 * ab),2)[0]
        a = (a_add_b[0] + a_sub_b) // 2
        b = ab // a
        p = a * (10 ** 200) + b
        q = b * (10 ** 200) + a
        d = invert(e,(p-1)*(q-1))
        print(long_to_bytes(pow(c,d,n)))
# CMISCCTF{easy_math_game_hhhhhhh}        

题4

题目描述:

import gmpy2
from Crypto.Util.number import bytes_to_long
from fractions import Fraction

flag = "***"

assert gmpy.is_prime(p) * gmpy.is_prime(q) > 0
assert Fraction(p, p + 1) + Fraction(q + 1, q) == Fraction(2 * s - X, s + Y)
print('p / (p + 1) + (q + 1) / q) == (2 * s - %s) / (s + %s)' % (X, Y))

n = p * q
c = pow(bytes_to_long(bytes(flag, "utf-8")), 0x10001, n) # 转字节
print('n =', n)
print('c =', c)
'''
p / (p + 1) + (q + 1) / q) == (2 * s - 153801856029563198525204130558738800846256680799373350925981555360388985602786501362501554433635610131437376183630577217917787342621398264625389914280509) / (s + 8086061902465799210233863613232941060876437002894022994953293934963170056653232109405937694010696299303888742108631749969054117542816358078039478109426)
n = 161010103536746712075112156042553283066813155993777943981946663919051986586388748662616958741697621238654724628406094469789970509959159343108847331259823125490271091357244742345403096394500947202321339572876147277506789731024810289354756781901338337411136794489136638411531539112369520980466458615878975406339
c = 15380535750650959213679345560658190067564859611922563753882617419201718847747207949211621591882732604480600745000879508274349808435529637573773711729853565120321608048340424321537282281161623712479117497156437792084977778826238039385697230676340978078264209760724043776058017336241110097549146883806481148999
'''

题目分析:
p p + 1 + q + 1 1 = 2 s − X s + Y   2 n + p + q + 1 n + q = 2 s − X s + Y   假设 2 s − X = 2 n + p + q + 1 s + Y = n + q 又 n = p ∗ q 三个等式解方程得 p , q , 最后得 f l a g \frac{p}{p+1}+\frac{q+1}{1}=\frac{2s-X}{s+Y}\\ \ \\ \frac{2n+p+q+1}{n+q}=\frac{2s-X}{s+Y}\\ \ \\ 假设2s-X=2n+p+q+1\\ s+Y=n+q\\ 又 n = p * q\\ 三个等式解方程得p,q,最后得flag\\ p+1p+1q+1=s+Y2sX n+q2n+p+q+1=s+Y2sX 假设2sX=2n+p+q+1s+Y=n+qn=pq三个等式解方程得p,q,最后得flag

from z3 import *
from gmpy2 import *
from Crypto.Util.number import *
n = 161010103536746712075112156042553283066813155993777943981946663919051986586388748662616958741697621238654724628406094469789970509959159343108847331259823125490271091357244742345403096394500947202321339572876147277506789731024810289354756781901338337411136794489136638411531539112369520980466458615878975406339
c = 15380535750650959213679345560658190067564859611922563753882617419201718847747207949211621591882732604480600745000879508274349808435529637573773711729853565120321608048340424321537282281161623712479117497156437792084977778826238039385697230676340978078264209760724043776058017336241110097549146883806481148999
x = 153801856029563198525204130558738800846256680799373350925981555360388985602786501362501554433635610131437376183630577217917787342621398264625389914280509
y = 8086061902465799210233863613232941060876437002894022994953293934963170056653232109405937694010696299303888742108631749969054117542816358078039478109426

ss = Solver()
p,q,s = Ints('p q s')
ss.add(2 * n + p + q + 1 == 2 * s - x)
ss.add(n + q == s + y)
ss.add(n == p * q)
if ss.check() == sat:
    print(ss.model())
    
p = 12774247264858490260286489817359549241755117653791190036750069541210299769639605520977166141575653832360695781409025914510310324035255606840902393222949771
q = 12604273285023995463340817959574344558787108098986028639834181397979984443923512555395852711753996829630650627741178073792454428457548575860120924352450409
s = 161010103536746712075112156042553283066813155993777943981946663919051986586388748662616958741697621238654724628406094469789970509959159343108847331259823112877911744430783479794351273206923447354336803583953484448372097816077196309188969276642688889403610864534620155124825996688886945889074240416915144846504
e = 65537
d = invert(e,(p - 1)*(q - 1))
print(long_to_bytes(pow(c,d,n)))
# flag{2a5a9c6fe94da5ef7edeffebb506b29a}

考点:p已知一半位数爆破8位,开根,拼接,解方程

唉,最近好忙,开学了事好多啊,一些要深入的知识点也还没看。作业还没做,去苟作业了。


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

相关文章

Redis 集合(Set)快速指南 | Navicat

Redis 支持通过多种数据类型来存储项目集合。其中&#xff0c;包括列表、集合和哈希。上周的博文介绍了列表&#xff08;List&#xff09;数据类型并重点介绍了一些用于管理列表&#xff08;List&#xff09;的主要命令。在今天的文章中&#xff0c;我们将转向关注集合&#xf…

RedisTemplate的操作和用法

Redis 含义 redis是以k-v存储的非关系型数据库&#xff0c;它的数据类型有String、list、map、set、zset RedisTemplate的配置 pom.xml <!-- Redis 相关依赖 --><dependency><groupId>org.springframework.boot</groupId><artifactId>sprin…

从零基础学习PyQt5软件app开发

常见的GUI框架的梳理 GUI&#xff0c;全称为图形⽤户界⾯&#xff0c;⼜称为图形⽤户接⼝&#xff0c;是⼀种⼈与计算机通信的界⾯显示格式。 ⽤户打开应⽤程序或⽹站时看到的第⼀个东⻄&#xff0c;并与之交互。 ⽤户界⾯通常包括许多视觉元素&#xff0c;如图标、按钮、图形…

使用 WSLg 的 vGPU 硬件加速新特性创建重度混合生产环境

使用 WSLg 的 vGPU 硬件加速新特性创建重度混合生产环境 本文首发于&#xff1a;白泽阁-使用 WSLg 的 vGPU 硬件加速新特性创建重度混合生产环境 一、不同版本的WSL Windows Subsystem for Linux&#xff08;简称WSL&#xff09;是一个在 Windows 10\11 上能够运行原生Linux…

【CCF】第30次csp认证——202305-1重复局面

202305-1重复局面&#xff1a; 问题描述 国际象棋每一个局面可以用大小为 88 的字符数组来表示&#xff0c;其中每一位对应棋盘上的一个格子。六种棋子王、后、车、象、马、兵分别用字母 k、q、r、b、n、p 表示&#xff0c;其中大写字母对应白方、小写字母对应黑方。棋盘上无…

软件测试中常见的难题

1、需求定义&#xff1a; 需求可能不完整或者不准确&#xff0c;这会导致测试人员无法测试应用程序的所有功能。 例如&#xff1a;在一个电子商务网站上&#xff0c;可能需要测试的某些操作并未在需求中列出&#xff0c;导致测试人员无法测试到这些操作。 对策&#xff1a;测…

linux mysql数据库备份

在 Linux 上备份 MySQL 数据库&#xff0c;您可以使用 mysqldump 命令来执行数据库备份。以下是使用 mysqldump 命令进行 MySQL 数据库备份的步骤&#xff1a; 登录到 Linux 服务器&#xff1a; 首先&#xff0c;通过 SSH 或其他远程连接方式登录到您的 Linux 服务器。 运行 m…

基于springboot漫画管理系统springboot001

摘 要 随着信息技术和网络技术的飞速发展&#xff0c;人类已进入全新信息化时代&#xff0c;传统管理技术已无法高效&#xff0c;便捷地管理信息。为了迎合时代需求&#xff0c;优化管理效率&#xff0c;各种各样的管理系统应运而生&#xff0c;各行各业相继进入信息管理时代&…