SICTF-Round4--Crypto

SignBase

task:

U0lDVEZ7ODI5MGYwZWYtNzAyYi00NTZmLTlmZjYtNGRhZjhhYTIzNWU1fQ==

exp:

https://www.ddosi.org/code/
SICTF{8290f0ef-702b-456f-9ff6-4daf8aa235e5}

Smooth

task:

from random import choice
from Crypto.Util.number import isPrime, sieve_base
from select import flag def getT1ngPrime(bits):
while True:
n = 2
while n.bit_length() < bits:
n *= choice(sieve_base)
if isPrime(n + 1):
return n + 1 e = 0x10001
p = getT1ngPrime(2048)
q = getT1ngPrime(2048)
n = p * q
c = pow(flag, e, n)
print("n =",n)
print("c =",c) # n = 11353462911659482113796537452147300926058319193410149519981293344545095869273822230953023429933867057788424748612924709948861133348747189832397098293375764081790597820832766019459982124608221261607650511397189714784056313299551817534654742174637343804047231232241364089289257964139944018168155573510980260130960125621306919129390727418251555408239157881843225479158237727969284756513805560836003067115936987292751142016846824024901372913577548599978847860303760659677939193351221798796221804998385095596961591093782162020167439948314063423204757741472210008357888290333170757522814768955797167174930629344666183821709125207308525214263797625499327774875517941662523738827284067304929843343871569023248931759251331056863803201916908875256305736551124386988450879913404808869417817363510363373493093139804372817316366990863872781848240937733101758906281563575413208242901819275013539759479445299894840593737457394207415306989963459347994339058584475533786264375696277942369426844216474662828121334192775480587740071776080691560820922589751966526187341539255661442517814436944781114380877453502120302247547983180059537220197840688418898830571100216529994749464486853212098379822895838120836692532849021875818941979891105837972315129986493
# c = 4598142980961588614870523368474306387497434303187254927457676265871592231881441246092917258758503624096206624791819316260705668875764048374035213672138915662719877795747211803584360349151646264274341548770123417923229997374982757324397146348908248704115062655445309042278469908831635522908894918382861563762003781223067210316435231509359575745828484177064520417698784251000631935361105284031848497200100561554984257265297077176545082009710252149167922123535451717313588884862304552508619154651546264753192894485610685402565486840707709012364088270364787452130288293053818329408433642977483320525542674345001200312959241276966417288770125166249156122793451000156544563900072606708005901579238109781720805374132101363788622676000360345128868422751829657184702090198806325558601552728909032627597688702884484377994243047876011323705947461799669488497113582621976154428096812072612119422667669321557427061098391558516935530727451865151957035156100271891977310043273298085691419672779758845492888551759393825925266903887942750052210444677062600227218953570162640164207895883301679126000642791876167281967081725589618329012476305157314322062703122134504285038691938912783524944917966615556902938825590064899700174139252191278691620663355243

analysis:

\[\begin{flalign}
&费马小定理\quad\quad(a,p)=1⇒a^{p-1}≡1(mod\quad p)\\
&设p-1是B-Smooth的,可设p-1=p_1p_2\cdots p_n(\forall1≤i≤n)\\
&若p_1p_2\cdots p_n两两不同,则p_1p_2\cdots p_n|B!⇒B!=k(p-1)。因此a^{B!}≡a^{k(p-1)}≡1(mod\quad p)\\
&假设N=pq,计算gcd(a^{B!}-1,N)=p即可。&
\end{flalign}
\]

exp:

import gmpy2
import libnum
from Crypto.Util.number import isPrime, sieve_base as primes c = 4598142980961588614870523368474306387497434303187254927457676265871592231881441246092917258758503624096206624791819316260705668875764048374035213672138915662719877795747211803584360349151646264274341548770123417923229997374982757324397146348908248704115062655445309042278469908831635522908894918382861563762003781223067210316435231509359575745828484177064520417698784251000631935361105284031848497200100561554984257265297077176545082009710252149167922123535451717313588884862304552508619154651546264753192894485610685402565486840707709012364088270364787452130288293053818329408433642977483320525542674345001200312959241276966417288770125166249156122793451000156544563900072606708005901579238109781720805374132101363788622676000360345128868422751829657184702090198806325558601552728909032627597688702884484377994243047876011323705947461799669488497113582621976154428096812072612119422667669321557427061098391558516935530727451865151957035156100271891977310043273298085691419672779758845492888551759393825925266903887942750052210444677062600227218953570162640164207895883301679126000642791876167281967081725589618329012476305157314322062703122134504285038691938912783524944917966615556902938825590064899700174139252191278691620663355243
n = 11353462911659482113796537452147300926058319193410149519981293344545095869273822230953023429933867057788424748612924709948861133348747189832397098293375764081790597820832766019459982124608221261607650511397189714784056313299551817534654742174637343804047231232241364089289257964139944018168155573510980260130960125621306919129390727418251555408239157881843225479158237727969284756513805560836003067115936987292751142016846824024901372913577548599978847860303760659677939193351221798796221804998385095596961591093782162020167439948314063423204757741472210008357888290333170757522814768955797167174930629344666183821709125207308525214263797625499327774875517941662523738827284067304929843343871569023248931759251331056863803201916908875256305736551124386988450879913404808869417817363510363373493093139804372817316366990863872781848240937733101758906281563575413208242901819275013539759479445299894840593737457394207415306989963459347994339058584475533786264375696277942369426844216474662828121334192775480587740071776080691560820922589751966526187341539255661442517814436944781114380877453502120302247547983180059537220197840688418898830571100216529994749464486853212098379822895838120836692532849021875818941979891105837972315129986493
e = 0x10001
x = 1
for i in primes:
x = i * x p = gmpy2.gcd(pow(2, x, n) - 1, n)
q = n // p
phi = (p - 1) * (q - 1)
d = gmpy2.invert(e, phi)
m = pow(c, d, n)
flag = libnum.n2s(int(m))
print(flag)
# SICTF{d8af7f58-49f7-490d-be49-386b8ff16361}

next_prime

task:

from Crypto.Util.number import getPrime
from gmpy2 import next_prime
from select import flag p = getPrime(1024)
q = getPrime(1024)
e = 65537
n = p * q
c = pow(flag, e, n)
gift = n * next_prime(p) * next_prime(q)
print("n =", n)
print("c =", c)
print("gift =", gift) # n = 11958388191411693159737723233868177200642855312771636589272066925180521736238782088222469544720240237292008558651656242716943228927612911153093905350043065811853776453271082678856297734699816670221066298151571078839575715976634390967727901295936522621706645886864683564184184197808626753747618171580292981571324190267014128877345111473870762554461674841623076501341477084318792110624423283610948627697772395662746329206056210266975821093875870239401934123066690637191790327090291595067248967533200784706397544202070440488806825607916659163953805033205530899551496221506129549542556866837853127119809134360611350153589
# c = 10602368727908312334676265892975307612231309319511015017178654564186172749979627738052483995870388025140270600159107954524376993980949045647370337520644299969292550299798129717198074042121264370311983929042594290226321121639097714569204574387632530578153623781118813035223106106430716561113649761388347227207862016222328885951443891878767280730866193302995220736592745950808566359750940949520997722511969961743175777398751576595421456387998438214806188903746057855596476380404784738717555105866919649086601807350830108805521710188675565963765427930594177874353694184805979235854934856122125278853834603734029710968348
# gift = 143003048136494625720615623612005913472507924053937690079082986485649969355472743235179770036996193641198750946508667945561623931811236977039763581123681134310890547763107653222776992418543178066390387385209825190685606728024120446212807710589806258669458993047631033905702244902809204039169931629358263456702579067559691338668237882496453568585374905432631312417129535623987837367199215661733043851565981435234933986864857569158677737153423060041120732727135186371678287680926662892691327401787213342106281956461499522723795617869239148528294553548775690229067500104867437905746412645684721821428282431567702986879179533855920546700706123995719114359958306882907020982377260255340490340263938995699635287224549324332962230238510191824829224191551900441011605052418697617085549543103391184965537110312684637038510114533398510307173011690076219892318860903556489256383303693074652155424333388152193775840529985682153395008472897617946636734810609200156268438329402662168752285341847607694230848883249991722691539384542468611397615969487669898094687344847452861774236267516878551680397732564006255256825307533960791695267034807439791627895625581061889926276814228469856614838307012696777026973517086921078389474757196549594972814371353

analysis:

一般来说对于N=p * q,p与q接近时可以直接通过yafu分解得到相应的p,q但是这题加入了p,p1=nextprime(p),q,q1=nextprime(q)进行混淆,但是由于p与nextprime(p)接近的缘故,我们依旧采用从平方根去中分解gift的想法,但是由于分解后的大素数我们不知道那个是n的素因数,因此需要组合校验。

平方根取中法:

exp:

from Crypto.Util.number import *
from gmpy2 import * gift = 143003048136494625720615623612005913472507924053937690079082986485649969355472743235179770036996193641198750946508667945561623931811236977039763581123681134310890547763107653222776992418543178066390387385209825190685606728024120446212807710589806258669458993047631033905702244902809204039169931629358263456702579067559691338668237882496453568585374905432631312417129535623987837367199215661733043851565981435234933986864857569158677737153423060041120732727135186371678287680926662892691327401787213342106281956461499522723795617869239148528294553548775690229067500104867437905746412645684721821428282431567702986879179533855920546700706123995719114359958306882907020982377260255340490340263938995699635287224549324332962230238510191824829224191551900441011605052418697617085549543103391184965537110312684637038510114533398510307173011690076219892318860903556489256383303693074652155424333388152193775840529985682153395008472897617946636734810609200156268438329402662168752285341847607694230848883249991722691539384542468611397615969487669898094687344847452861774236267516878551680397732564006255256825307533960791695267034807439791627895625581061889926276814228469856614838307012696777026973517086921078389474757196549594972814371353
c = 10602368727908312334676265892975307612231309319511015017178654564186172749979627738052483995870388025140270600159107954524376993980949045647370337520644299969292550299798129717198074042121264370311983929042594290226321121639097714569204574387632530578153623781118813035223106106430716561113649761388347227207862016222328885951443891878767280730866193302995220736592745950808566359750940949520997722511969961743175777398751576595421456387998438214806188903746057855596476380404784738717555105866919649086601807350830108805521710188675565963765427930594177874353694184805979235854934856122125278853834603734029710968348
e = 0x10001
n = 11958388191411693159737723233868177200642855312771636589272066925180521736238782088222469544720240237292008558651656242716943228927612911153093905350043065811853776453271082678856297734699816670221066298151571078839575715976634390967727901295936522621706645886864683564184184197808626753747618171580292981571324190267014128877345111473870762554461674841623076501341477084318792110624423283610948627697772395662746329206056210266975821093875870239401934123066690637191790327090291595067248967533200784706397544202070440488806825607916659163953805033205530899551496221506129549542556866837853127119809134360611350153589 def factor(gift):
factor_list = []
get_context().precision = 2048
sqrt_n = int(sqrt(gift))
c = sqrt_n
while True:
c += 1
d_square = c ** 2 - gift
if is_square(d_square):
d_square = mpz(d_square)
get_context().precision = 2048
d = int(sqrt(d_square))
factor_list.append([c + d, c - d])
if len(factor_list) == 2:
break
return factor_list factor_list = factor(gift)
[X1, Y1] = factor_list[0]
[X2, Y2] = factor_list[1]
assert X1 * Y1 == gift
assert X2 * Y2 == gift
p1 = gcd(X1, X2)
q1 = X1 // p1
p2 = gcd(Y1, Y2)
q2 = Y1 // p2
"""
print("p1*q1 is {0}".format((p1*q1==n)))
print("p2*q2 is {0}".format((p2*q2==n)))
print("p1*q2 is {0}".format(p1*q2==n))
print("p2*q1 is {0}".format(p2*q1==n))
p1*q1 is False
p2*q2 is False
p1*q2 is False
p2*q1 is True
"""
phi =(q1 - 1) * (p2 - 1)
d = invert(e, phi)
print(long_to_bytes(pow(c, d, n)))
# SICTF{f2a3af27-ad07-4fc2-9b69-a91304eee6a3}

Math Cocktail

task:

from secret import key
x = key
M = 94665789456132156456789461321289656332321
n = 123456789123456789
k = x + pow(x,-1,M)
result = pow(x,n,M) + pow(x,-n,M)
print("k = " + str(k))
flag = "SICTF{"+str(result)+"}"
#k = 15396893775857205606087136852231851457937

analysis:

\[\begin{flalign}
&已知k=x+{1\over x}(mod\quad M),求解x^n(mod\quad M)+{1\over x^{n}}(mod\quad M)\\
&由k=x+{1\over x}(mod\quad M)⇒kx=x^2+1\\
&解方程解出x进行带入求解result即可。&
\end{flalign}
\]

exp:

# sage
M = 94665789456132156456789461321289656332321
n = 123456789123456789
k = 15396893775857205606087136852231851457937
# 定义多项式环,在mod M环内求解x
P.<x> = PolynomialRing(Zmod(M))
f = x**2 + 1 - k*x
# 求解方程式中的x,并且保证求解的x是正整数
x = int(f.monic().roots(multiplicities=False)[0])
result = pow(x,n,M) + pow(x,-n,M)
print(f"SICTF{{{result}}}")
# SICTF{83812289150322223053501552731270409032921}

SICTF 2024 Round4 Crypto的更多相关文章

  1. javax.crypto.BadPaddingException: Given final block not properly padded 解决方法

    下面的 Des 加密解密代码,在加密时正常,但是在解密是抛出错误: javax.crypto.BadPaddingException: Given final block not properly p ...

  2. 使用crypto模块实现md5加密功能(解决中文加密前后端不一致的问题)

    正常情况下使用md5加密 var crypto = require('crypto'); var md5Sign = function (data) { var md5 = crypto.create ...

  3. javax.crypto.BadPaddingException: Given final block not properly padded

    一.报错 写了一个加密方法,在Windows上运行没有问题,在Linux上运行时提示如下错误: javax.crypto.BadPaddingException: Given final block ...

  4. Liunx-https-java.lang.NoClassDefFoundError: javax/crypto/SunJCE_b

    错误信息: java.lang.NoClassDefFoundError: javax/crypto/SunJCE_b at javax.crypto.KeyGenerator.a(DashoA13* ...

  5. node crypto md5加密,并解决中文不相同的问题

    在用crypto模块时碰到了加密中文不相同的问题,多谢群里面@蚂蚁指定 1:解决中文不同的问题 function md5Pay(str) { str = (new Buffer(str)).toStr ...

  6. Crypto++ 动态链接编译与实例测试

    测试用例的来源<Crypto++入门学习笔记(DES.AES.RSA.SHA-256)> 解决在初始化加密器对象时触发异常的问题: CryptoPP::AESEncryption aesE ...

  7. python3 crypto winrandom import error

    早就听说3的包很成熟了,自从从2.7过渡上来后还是碰到各种不适应,可以想象更早的时候问题该要多么多,特别一些必备库经典库如果没有跟进得多痛苦. [code lang="python" ...

  8. Crypto++入门学习笔记(DES、AES、RSA、SHA-256)(加解密)

    转自http://www.cppblog.com/ArthasLee/archive/2010/12/01/135186.html 最近,基于某些原因和需要,笔者需要去了解一下Crypto++库,然后 ...

  9. nodejs 核心模块crypto

    crypto用于加密解密 'use strict' var crypto=require('crypto'); var data={age:18} var key='dt';//定义一个钥匙 var ...

  10. maven install 时提示“程序包 javax.crypto不存在”

    但是javax.crypto是在jdk的jre\lib目录下的 解决方案: <compilerArguments> <bootclasspath>${java.home}/li ...

随机推荐

  1. RabbitMq高级特性之延迟队列 通俗易懂 超详细 【内含案例】

    RabbitMq高级特性之延迟队列 介绍 消息进入队列后不能立即被消费,到达指定时间后才可被消费 实现 结合以下两种即可达到延迟队列 RabbitMq高级特性之TTL过期时间 RabbitMq高级特性 ...

  2. 7E头的那些事儿(帧格式分析实例)

    0. 前言 作为一名嵌入式工程师,经常需要通过UART与外设打交道,而对于串行总线来说,往往我们必须要进行帧同步.通常的做法是把信令包含在2个0x7E的中间. 除此之外还有HDLC.PPP等协议也会到 ...

  3. 第三方软件测评实验室-CNAS

    一家获得中国合格评定国家认可委员会CNAS认证资质的第三方软件测评机构,能够提供以下专业服务 1. 登记测试报告:用于政府项目申报.高新认证.创新产品认定.首版次申报.招投标和报奖. 2. 信息系统验 ...

  4. 最详细STL(三)list

    list就是链表啦,他的一个结点由两个指针域,一个数据域组成.list可以在任何位置以O(n)的复杂度插入元素,头部和尾部的插入的复杂度为O(1).然而list也有一个致命的缺点,因为链表的空间申请是 ...

  5. 【Docker学习系列】Docker学习1-docker安装

    从本篇开始,凯哥将和大家一起学学docker.本篇是docker学习系列第一篇:安装docker. docker安装前提条件:目前,centos发行版中的内核支持Docker.Docker运行在Cen ...

  6. python pyqt6 QComboBox 设定下拉框背景颜色

    设定QComboBox 的背景颜色,边框设定,以及下拉框的背景颜色以及边框设定, selection-background-color 不生效可忽略 xxx_source = QComboBox(se ...

  7. HTML – Naming Conversion

    有些是市场的规范, 有些是我的规范 Tag Name Lower Case 参考: W3Schools Attributes Name Lower Case 参考: W3Schools Always ...

  8. C++ 指针动态内存分配

    动态内存分配 动态内存分配:即由程序员手动的进行内存空间的分配.内存空间的释放的内存管理操作 C++代码中,变量.数组等对象的创建,是由C++自动分配内存的,称之为(自动)静态内存分配 (自动)静态内 ...

  9. acme+cloudflare生成免费证书(自动续期)

    acme DNSapi acme DNSapi的作用是在申请证书时使用dns交易,acme可以通过dnsapi在对应的dns管理平台提交对应的dns记录.玩过证书的朋友都知道,证书申请时有三种验证方式 ...

  10. OPENLDAP部署完整版(Linux)附一键式脚本

    (一)环境信息1,系统环境2,域信息(本章节使用)(二)应用部署1,ladp部署1. yum方式安装OpenLDAP服务2.拷贝数据库配置配置文件,并启动服务3.slappasswd生成OpenLDA ...