SICTF 2024 Round4 Crypto
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:
&费马小定理\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:
&已知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的更多相关文章
- javax.crypto.BadPaddingException: Given final block not properly padded 解决方法
下面的 Des 加密解密代码,在加密时正常,但是在解密是抛出错误: javax.crypto.BadPaddingException: Given final block not properly p ...
- 使用crypto模块实现md5加密功能(解决中文加密前后端不一致的问题)
正常情况下使用md5加密 var crypto = require('crypto'); var md5Sign = function (data) { var md5 = crypto.create ...
- javax.crypto.BadPaddingException: Given final block not properly padded
一.报错 写了一个加密方法,在Windows上运行没有问题,在Linux上运行时提示如下错误: javax.crypto.BadPaddingException: Given final block ...
- Liunx-https-java.lang.NoClassDefFoundError: javax/crypto/SunJCE_b
错误信息: java.lang.NoClassDefFoundError: javax/crypto/SunJCE_b at javax.crypto.KeyGenerator.a(DashoA13* ...
- node crypto md5加密,并解决中文不相同的问题
在用crypto模块时碰到了加密中文不相同的问题,多谢群里面@蚂蚁指定 1:解决中文不同的问题 function md5Pay(str) { str = (new Buffer(str)).toStr ...
- Crypto++ 动态链接编译与实例测试
测试用例的来源<Crypto++入门学习笔记(DES.AES.RSA.SHA-256)> 解决在初始化加密器对象时触发异常的问题: CryptoPP::AESEncryption aesE ...
- python3 crypto winrandom import error
早就听说3的包很成熟了,自从从2.7过渡上来后还是碰到各种不适应,可以想象更早的时候问题该要多么多,特别一些必备库经典库如果没有跟进得多痛苦. [code lang="python" ...
- Crypto++入门学习笔记(DES、AES、RSA、SHA-256)(加解密)
转自http://www.cppblog.com/ArthasLee/archive/2010/12/01/135186.html 最近,基于某些原因和需要,笔者需要去了解一下Crypto++库,然后 ...
- nodejs 核心模块crypto
crypto用于加密解密 'use strict' var crypto=require('crypto'); var data={age:18} var key='dt';//定义一个钥匙 var ...
- maven install 时提示“程序包 javax.crypto不存在”
但是javax.crypto是在jdk的jre\lib目录下的 解决方案: <compilerArguments> <bootclasspath>${java.home}/li ...
随机推荐
- .NET MAUI 布局
先看一段代码的效果: <?xml version="1.0" encoding="utf-8" ?> <ContentPage xmlns=& ...
- 远程采集服务器指标信息(二)通过telnet执行远程命令
远程采集服务器信息,比如说磁盘信息.内存信息. 现介绍java通过telnet执行命令采集服务器信息,比如说执行df.ls.top. 这里在linux环境通过root或者其他用户登录执行解析方式有点出 ...
- Xinference实战指南:全面解析LLM大模型部署流程,携手Dify打造高效AI应用实践案例,加速AI项目落地进程
Xinference实战指南:全面解析LLM大模型部署流程,携手Dify打造高效AI应用实践案例,加速AI项目落地进程 Xorbits Inference (Xinference) 是一个开源平台,用 ...
- Ynoi2016镜中的昆虫
[Ynoi 2016] 镜中的昆虫 简化题意 给定长为 \(n\) 序列 \(a\) , 两种操作 \(m\) 次: 1 l r x : 将 \([l , r]\) 修改为 \(x\) 2 l r : ...
- Linux 主流图形显示系统
在 Linux 系统中,主流的图形显示系统主要有以下几种: X Window System (X11) 简介 X Window System,通常简称为 X 或 X11,是历史最悠久.最广泛使用的图形 ...
- 扩展KMP (ex_KMP)
一些约定: 字符串下标从1开始 s[1,i]表示S的第一个到第i个字符组成的字符串 解决的题型: 给你两个字符串A,B(A.size()=n,B.size()=m),求p数组 p[i]表示最大的len ...
- python之re库,正则表达
一.前言 为什么要学re库呢?这里主要学他的正则表达,在编写安全脚本的时候肯定要遇到一些不规则的匹配规则,当然编写爬虫也少不了正则匹配去找到一些具有特殊特征的字符串.因此这是十分必要的,然而.re库使 ...
- 人脸识别 face detect & recognize
前言 最近有一个项目要升级. 它是一个在线教育的 web app. 由于学生年龄小, 不适合用 username/password 这种方式做登入. 所以项目开始之初是使用 RFID 来登入的. 但由 ...
- POJ-3176 Cow Bowling(基础dp)
The cows don't use actual bowling balls when they go bowling. They each take a number (in the range ...
- [33](CSP 集训)CSP-S 模拟 4
A 商品 对于任意一组相邻的数 \((l,r)\ (l\le r)\),可以发现,不管怎么压缩,都会有 \(l\le r\),也就是说,相邻两个数的大小关系是不变的 那么我们就可以把 \(\sum(| ...