NewStarCTF公开赛week3密码学前两道题的wp

news2025/4/8 8:00:00

目录

  • 一、keyExchange
    • 1.原题
    • 2.考察知识点与解题思路
      • Diffie-Hellman密钥交换
    • 3.解题脚本
  • 二、Prof. Shamir's Secret
    • 1.原题
    • 2.考察知识点与解题思路
      • Shamir 门限方案
    • 3.解题脚本

一、keyExchange

1.原题

题目给出的是题目给出的是加密过程和输出:

from secret import flag, gb, g, p, Diffie_Hellman_KEY_EXCHANGE
from Crypto.Util.number import *
from base64 import b64encode
from Crypto.Cipher import AES
from hashlib import md5
from Crypto.Util.Padding import pad

plaintext = pad(flag, 16)

a = getRandomNBitInteger(1024)
shared = Diffie_Hellman_KEY_EXCHANGE(a) # the original one, not the elliptic curve version!!!!
key = md5(str(shared).encode()).digest()

cipher = AES.new(key, AES.MODE_ECB)
ciphertext = cipher.encrypt(plaintext)

print(f'师傅给你送了一个flag')
print(f'加密的flag = {b64encode(ciphertext)}')
print(f'p = {p}')
print(f'your secret key {a}')
print(f'g = {g}')
print(f'师傅的公钥 = {gb}')

可以从加密过程的说明脚本中看出,输出的信息有:经过AES加密后base64编码的flag(所以解AES前要先解码base64呀)、p、g、我方私钥a和师傅的公钥gb:

师傅给你送了一个flag
加密的flag = b'w8OCrexPPqnv2hR+xKeHhXIp0Blp1DYCV4LeZeeLpv5MzUL71raTOeOs4SQBySHH'
p = 133448764119399847876731592238604881175769007976799828874328988761588128500145459082023001027383524831194316266946485380737147372837136403065060245135035225976604193830121124575947440188318348815263642243784574567832213775382081426762862856428888257126982268557543952549848053225651398101391048467656128070913
your secret key 141940531741414073502483547551457269459744373002985569536254444581939073930343975447649087549033350166772929396986965301002444997704537487577508504709368627174241095027876996113941220579274986994026832534664179333669861059196192190040046004398523932288881838011696679341328520530265002776147308306715042734185
g = 3
师傅的公钥 = 89434791765835058026108803508194156525355359465406829253856379139334424137549915669535243140614128105195584073112084994777148895681804127886440617684648237403345873311011154293855911891719204975035914932661810961867593769891076834656437254428353814290948181922438812745384577094827728409350756648446941874382

2.考察知识点与解题思路

Diffie-Hellman密钥交换

具体的理论知识可参考博客:http://t.csdn.cn/fjnn8
Diffie-Hellman算法可以使两个用户之间安全地交换一个密钥,但不能用于加密或解密信息。(但这里感觉也不能说“安全”因为无法抵御中间人攻击?
为了方便思路与代码对照,我还是说一下理论知识和思路。
在题目中都是已知的g和p,分别是算法中的底数g和模数p。

设有两个要交换密钥(公钥)的用户A和用户B
用户A的私钥是a,计算g^a mod p = AKey,AKey是用户A要发送给用户B的公钥
用户B的私钥是b,计算g^b mod p = BKey,BKey是用户B要发送给用户A的公钥
用户A拿到B发来的BKey后,计算BKey^a mod p=key,用户B拿到用户A发来的AKey后,计算AKey^b mod p=key,这二者的值应该是相同的key,也就是两人协商出的密钥。

现在根据题目已经已知了我方私钥a、对方公钥BKey、模数p,已经可以直接计算BKey^a mod p得到双方协商出的密钥key(脚本中命名为shared)。
然后根据题目脚本中key = md5(str(shared).encode()).digest(),要将shared转str、encode后再做md5得到AES加密用的密钥key,就原样复制这条语句到解密脚本中即可。
再根据之前对题目脚本中输出内容的分析,对密文形式的flag先做base64解码。
最后用密钥key解密AES得到明文flag。

3.解题脚本

import base64
import hashlib
from Crypto.Cipher import AES

a=141940531741414073502483547551457269459744373002985569536254444581939073930343975447649087549033350166772929396986965301002444997704537487577508504709368627174241095027876996113941220579274986994026832534664179333669861059196192190040046004398523932288881838011696679341328520530265002776147308306715042734185
p=133448764119399847876731592238604881175769007976799828874328988761588128500145459082023001027383524831194316266946485380737147372837136403065060245135035225976604193830121124575947440188318348815263642243784574567832213775382081426762862856428888257126982268557543952549848053225651398101391048467656128070913
BKey=89434791765835058026108803508194156525355359465406829253856379139334424137549915669535243140614128105195584073112084994777148895681804127886440617684648237403345873311011154293855911891719204975035914932661810961867593769891076834656437254428353814290948181922438812745384577094827728409350756648446941874382
shared=pow(BKey,a,p)
key = hashlib.md5(str(shared).encode()).digest() #key=b'\xaep\x1f\xb5\x04\x9b.\x94\xd2:C\x1a\xd4<,\xce'
flag=b'w8OCrexPPqnv2hR+xKeHhXIp0Blp1DYCV4LeZeeLpv5MzUL71raTOeOs4SQBySHH'
flag=base64.b64decode(flag)  #先解码base64
cipher = AES.new(key, AES.MODE_ECB)
flag=cipher.decrypt(flag)  #对base64解码后的密文做AES解密
print(flag)

flag: flag{d1ff1e_h311m4n_is_4_p13c3_0f_c4k3}

二、Prof. Shamir’s Secret

1.原题

题目给出的是加密过程和输出:

from Crypto.Util.number import *
from secret import flag
a = getPrime(256)
b = getPrime(256)
c = getPrime(256)
d = bytes_to_long(flag)
n = getStrongPrime(2048)

def poly(x):
    return (a * x ** 3 + b * x ** 2 + c * x + d) % n

for _ in range(4):
    x = getRandomNBitInteger(256)
    print(f'({x}, {poly(x)})')

print(n)

从脚本可以看出,输出的是循环中的4个(x值, 当前x对应的poly(x)的计算值)和n:

(107156592202708719207677242145785380370925248573491581679548864240229105117413, 130345771647598884054430192964980389494531690916321281560051538057910945565624075918097771618618910263287152864051564635195578796179646674192491555857366963976329072793625649841007238934532144994966695961491116944111900519450656607199501654544809304677384301432194356761274376314501143216649135187625964931902)
(90629424458637844580841178302065768114471702341586161908858665404968070428143, 78858394764644720845979385422903377630845158220853604360871859882044655577246282808874532941560824773914594412415345616068416548364923695233972936176087206729847544516343237888024173952758718279163069742944961359652574962129434781851767007643037433981750489254639449637677610354746497770492254725894119193662)
(100626477579781167218124067468465940736522526684796828200460725563611057086831, 107938673826832098883774065383352754899611421173786919174851524067358319831595518533880365335333592351382030254987030861475878447430100862628809476494215295084769705787398168068863060859122952000010558086859754975554734850230223040925027217057055876423229204027280075168615462165634569977166298865366648414270)
(93935717805931479760310332373603550626215862380271563609987050092246456803681, 87807687834883656794449107852803757931909462710953942209358337840912886376275257864214018767300085688088981183791568376874906785193974861264511995029891797395218085734556515485224508250678274640400740193260888803386269425525930551167801371074041851406813322268615707951973495879968706624649318162995708734670)
31332583438236375592937719796184754941510418106758544436807128579095975774977164550965999210436423180868482749439792419270701760326867558983833590368116755394302102816558834270767750410927007254951332459412016857259923960095221831744199277859298274645778838122123090174549834537459028702418645316659860963695912411044490603690484176741018002722235584411422885336520840416125528921196994346534698226763483608314982898155320734426983215291745003213365884087604024203316024824786079501166114638727651689476288442288919373885358425210859822108037791909364199015379638899887715692181883916583183449343868694265742569597579

2.考察知识点与解题思路

Shamir 门限方案

关于Shamir门限的理论知识可以参考博客:http://t.csdn.cn/wvS1Z
我就是从这里学到的O(∩_∩)O
放到这题大概就是:
1)有秘密藏在了多项式里,想恢复出秘密需要“多项式的次数+1”个子密钥,这里的“多项式次数+1”就是“门限”,子密钥即多项式的计算值f(x),这里是三次多项式,又已知了4个x和4个多项式的计算结果,模数n也已知,所以可以解题。
2)将已知条件代入,利用公式计算出结果转成bytes输出即是flag。
解密公式:
Shamir门限解密公式
ps:公式中的p,在题目中对应的是n,f(i)即poly(x)的值
对应到题目,有k=4,在累加项中,j取1~4,f(i)取f(x1)~f(x4),f(i)后面累乘项的分子是用x(这里x就是字母x本身!)分别减去除当前的x值(注意是“值”,指x1/x2/x3/x4中的某一个)之外的3个x值分母是用当前x值减去除当前的x值(指x1/x2/x3/x4中的某一个)之外的3个x值。将4组运算结果累加,得到的多项式中的字母x取0(即只保留常数项),最后再去模大数n

3.解题脚本

在我的脚本中,x1~x4表示已知的4个x,rm1~rm4代表的是x对应的poly(x)的计算值,因为分子上有三个(x-i)项相乘所以得到的常数项符号位负,所以要在最前面手动添一个负号,对于分母的计算,是对模数n求乘法逆元

import gmpy2
import libnum

x1=107156592202708719207677242145785380370925248573491581679548864240229105117413
rm1=130345771647598884054430192964980389494531690916321281560051538057910945565624075918097771618618910263287152864051564635195578796179646674192491555857366963976329072793625649841007238934532144994966695961491116944111900519450656607199501654544809304677384301432194356761274376314501143216649135187625964931902

x2=90629424458637844580841178302065768114471702341586161908858665404968070428143
rm2=78858394764644720845979385422903377630845158220853604360871859882044655577246282808874532941560824773914594412415345616068416548364923695233972936176087206729847544516343237888024173952758718279163069742944961359652574962129434781851767007643037433981750489254639449637677610354746497770492254725894119193662

x3=100626477579781167218124067468465940736522526684796828200460725563611057086831
rm3=107938673826832098883774065383352754899611421173786919174851524067358319831595518533880365335333592351382030254987030861475878447430100862628809476494215295084769705787398168068863060859122952000010558086859754975554734850230223040925027217057055876423229204027280075168615462165634569977166298865366648414270

x4=93935717805931479760310332373603550626215862380271563609987050092246456803681
rm4=87807687834883656794449107852803757931909462710953942209358337840912886376275257864214018767300085688088981183791568376874906785193974861264511995029891797395218085734556515485224508250678274640400740193260888803386269425525930551167801371074041851406813322268615707951973495879968706624649318162995708734670

n=31332583438236375592937719796184754941510418106758544436807128579095975774977164550965999210436423180868482749439792419270701760326867558983833590368116755394302102816558834270767750410927007254951332459412016857259923960095221831744199277859298274645778838122123090174549834537459028702418645316659860963695912411044490603690484176741018002722235584411422885336520840416125528921196994346534698226763483608314982898155320734426983215291745003213365884087604024203316024824786079501166114638727651689476288442288919373885358425210859822108037791909364199015379638899887715692181883916583183449343868694265742569597579

m1=-rm1*x2*x3*x4*gmpy2.invert((x1-x2)*(x1-x3)*(x1-x4),n)
m2=-rm2*x1*x3*x4*gmpy2.invert((x2-x1)*(x2-x3)*(x2-x4),n)
m3=-rm3*x1*x2*x4*gmpy2.invert((x3-x1)*(x3-x2)*(x3-x4),n)
m4=-rm4*x1*x2*x3*gmpy2.invert((x4-x1)*(x4-x2)*(x4-x3),n)

m=(m1+m2+m3+m4)%n
print(libnum.n2s(int(m)))

运行脚本可以直接得到flag。
flag: flag{w0w_y0u_k0nw_sham1r_s3cret_5h4r1ng_4nd_1agrange_interpolation!!!}

在别人的博客上看到的另一种解法但没看懂,先记录一下:参考来源

import gmpy2
import libnum

x1=107156592202708719207677242145785380370925248573491581679548864240229105117413
rm1=130345771647598884054430192964980389494531690916321281560051538057910945565624075918097771618618910263287152864051564635195578796179646674192491555857366963976329072793625649841007238934532144994966695961491116944111900519450656607199501654544809304677384301432194356761274376314501143216649135187625964931902

x2=90629424458637844580841178302065768114471702341586161908858665404968070428143
rm2=78858394764644720845979385422903377630845158220853604360871859882044655577246282808874532941560824773914594412415345616068416548364923695233972936176087206729847544516343237888024173952758718279163069742944961359652574962129434781851767007643037433981750489254639449637677610354746497770492254725894119193662

x3=100626477579781167218124067468465940736522526684796828200460725563611057086831
rm3=107938673826832098883774065383352754899611421173786919174851524067358319831595518533880365335333592351382030254987030861475878447430100862628809476494215295084769705787398168068863060859122952000010558086859754975554734850230223040925027217057055876423229204027280075168615462165634569977166298865366648414270

x4=93935717805931479760310332373603550626215862380271563609987050092246456803681
rm4=87807687834883656794449107852803757931909462710953942209358337840912886376275257864214018767300085688088981183791568376874906785193974861264511995029891797395218085734556515485224508250678274640400740193260888803386269425525930551167801371074041851406813322268615707951973495879968706624649318162995708734670

n=31332583438236375592937719796184754941510418106758544436807128579095975774977164550965999210436423180868482749439792419270701760326867558983833590368116755394302102816558834270767750410927007254951332459412016857259923960095221831744199277859298274645778838122123090174549834537459028702418645316659860963695912411044490603690484176741018002722235584411422885336520840416125528921196994346534698226763483608314982898155320734426983215291745003213365884087604024203316024824786079501166114638727651689476288442288919373885358425210859822108037791909364199015379638899887715692181883916583183449343868694265742569597579

def GCRT(x,rm):
    curx,currm=x[0],rm[0]
    for (xi,rmi) in zip(x[1:],rm[1:]):
        d=gmpy2.gcd(curx,xi)
        c=rmi-currm
        assert (c%d == 0)
        K=c // d *gmpy2.invert(curx//d,xi//d)
        currm+=curx*K
        curx=curx * xi // d
        currm %=curx
    return (currm % curx ,curx)

x=[x1,x2,x3,x4]
rm=[rm1,rm2,rm3,rm4]

s,aa=GCRT(x,rm)
s%=n
print(s)
print(libnum.n2s(int(s)))

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/109686.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

【LeetCode每日一题:2011. 执行操作后的变量值~~~模拟】

题目描述 存在一种仅支持 4 种操作和 1 个变量 X 的编程语言&#xff1a; X 和 X 使变量 X 的值 加 1 –X 和 X-- 使变量 X 的值 减 1 最初&#xff0c;X 的值是 0 给你一个字符串数组 operations &#xff0c;这是由操作组成的一个列表&#xff0c;返回执行所有操作后&…

Merge-On-Write 的处理流程

简单来讲&#xff0c;Merge-On-Write 的处理流程是&#xff1a; 对于每一条 Key&#xff0c;查找它在 Base 数据中的位置&#xff08;rowsetid segmentid 行号&#xff09; 如果 Key 存在&#xff0c;则将该行数据标记删除。标记删除的信息记录在 Delete Bitmap 中&#xff…

【C++】多态(万字详解) —— 条件 | 虚函数重写 | 抽象类 | 多态的原理

&#x1f308;欢迎来到C专栏~~多态 (꒪ꇴ꒪(꒪ꇴ꒪ )&#x1f423;,我是Scort目前状态&#xff1a;大三非科班啃C中&#x1f30d;博客主页&#xff1a;张小姐的猫~江湖背景快上车&#x1f698;&#xff0c;握好方向盘跟我有一起打天下嘞&#xff01;送给自己的一句鸡汤&#x1…

Logoist - 适用于设计师以及初次使用者,快速制作精美 logo

Logoist - 适用于设计师以及初次使用者的快速制作精美 logo 工具 从简单的标识到设计开发。它只需要一点时间来创建令人印象深刻的图像和矢量图形与Logoist。 我们的一体化应用程序为您提供了您需要的一切&#xff0c;将您的创意付诸实践或寻找新的灵感!它适合专业设计师和插画…

阿里云将加速与伙伴合作 促进Web3.0生态发展

12 月 15 日&#xff0c;在Web3.0 Cloud Day Singapore 2022 活动上&#xff0c;阿里云新加坡、南亚和泰国总经理 Dr Derek Wang 表示&#xff0c;阿里云将加速和伙伴的合作以促进创新。“我们正在与我们的合作伙伴合作以实现创新。我们仍然处于 Web 3.0 的早期阶段。我们仍然需…

【蓝桥杯选拔赛真题53】Scratch破解保险柜 少儿编程scratch图形化编程 蓝桥杯选拔赛真题讲解

目录 scratch破解保险柜 一、题目要求 编程实现 二、案例分析 1、角色分析

大数据处理之ClickHouse概述及架构参考(未完)

一、概述 中移某业务拨测系统基于业务数据拨测指标及日志的分析需要&#xff0c;随着Clickhouse在OLAP领域的快速崛起&#xff0c;以及一些特性考虑&#xff0c;比如&#xff1a; 数据量会很大&#xff0c;最好需要分布式&#xff1b; 支持实时写入&#xff0c;支持快速计算&a…

数据库管理-第四十九期 Exadata的存储节点管理(20221223)

数据库管理 2022-12-23第四十九期 Exadata的存储节点管理1 咋个查看数据是否被缓存到闪存卡了没2 EM13.5的Exadata监控3 存储降级总结第四十九期 Exadata的存储节点管理 本周二&#xff0c;抗原终于阴性了&#xff0c;星期三开始就回到现场开始办公。上周既然说了Exadata关于存…

[C++: 引用】

To shine,not be illuminated. 目录 1 引用概念 2 引用特性 3 常引用 4 使用场景 4.1 引用做参数 4.2 做返回值 5 传值、传引用效率比较 6 引用和指针的区别 7 总结 1 引用概念 引用不是新定义一个变量&#xff0c;而是给已存在变量取了一个别名&#xff0c;编译器不会为…

Java+Swing+mysql会员卡管理系统

JavaSwingmysql会员卡管理系统一、系统介绍二、功能展示1.主页页面2.会员信息查询3.会员信息删除三、系统实现1.members.java四、其它1.其他系统实现一、系统介绍 使用 Java 技术开发一个会员卡管理系统&#xff0c;具体实现功能如下&#xff1a; 1. 程序启动显示主界面&#…

Vue:从组件开始学习

文章目录Vue组件生命周期根据官网文档&#xff0c;我们可以快速使用vue3创建自己的应用代码&#xff1a;npm init vuelatest&#xff0c;然后根据自己的需要来选择对应的配置&#xff1a; 默认使用vite来配置项目的。 在main.ts入口文件中&#xff0c;我们可以看到&#xff0…

非零基础自学Golang 第17章 HTTP编程(上) 17.5 知识拓展

非零基础自学Golang 文章目录非零基础自学Golang第17章 HTTP编程(上)17.5 知识拓展17.5.1 curl工具详解第17章 HTTP编程(上) 17.5 知识拓展 17.5.1 curl工具详解 【1】curl 简介 curl是一个利用URL语法在命令行下工作的文件传输工具&#xff0c;于1997年首次发行。它支持文…

Java+MySQL基于ssm的互助救援车队管理系统

此项目能够更全面的为社会贡献爱心&#xff0c;更及时的帮助求助人&#xff0c;然后在后台完成整个过程最后在通过广播好人好事&#xff0c;在高考爱心送子、养老院奉献爱心等活动更能做到统一化&#xff0c;更有序让注册的私家车主有的放矢&#xff0c;供献爱心。现在社会的信…

MyBatis-Plus(实用篇)

文章目录一、基础组件&#xff08;接口和实现类&#xff09;1、BaseMapper\<T>2、IService\<T>3、链式查询与修改4、调用Service层操作数据二、常用注解1、TableName2、TableId3、TbaleField4、TableLogic三、条件构造器1、wapper介绍2、构造器常用方法3、组装条件…

编程艺术之变成原则

编程有一个原则&#xff0c;就是尽可能去避免重复的代码。 类的开闭原则&#xff0c;类做好后&#xff0c;就尽量不要再在类上面在修改代码&#xff0c; 耦合度&#xff1a;简单的一个例子&#xff0c;活字印刷术在之前是整版印刷&#xff0c;导致&#xff0c;如果有一个字要…

作一回白嫖怪:写一个脚本自动获取ST官网积分,用积分领取奖品

环境&#xff1a;Python、selenium、ubuntu22.04 网址&#xff1a;STMCU中文官网 chrome: 版本 108.0.5359.124&#xff08;正式版本&#xff09; &#xff08;64 位&#xff09; chromeDriver: CNPM Binaries Mirror 这两个文件我打包起来了&#xff0c;0积分方便大家…

【表格合并与底纹】vue-elementul表格简单实现合并单元格,与列和行给底纹颜色

前言 这是一个很常见的需求啊&#xff0c;因为很多公司都会涉及到写表格展示数据 那么在某些公司内就会出现为了让数据更直观的感受到 而让你给某些行和列用颜色标出来。使得看起来更方便 那么这里就汇总一下常用的横竖合并以及横竖颜色底纹如何实现 效果图 这是写的一个dem…

小米便签维护过程记录——可能出现问题解决方案

在对小米便签开源代码进行研究和维护及新功能开发的同时&#xff0c;会遇到很多问题&#xff0c;将以本文进行记录总结。 导入项目 若不导入直接Open会导致默认为Project&#xff0c;不为Android。 小米标签菜单栏不显示的问题 先来看NotesListActivity类&#xff0c;这个类创…

Zookeeper 4 Zookeeper JavaAPI 操作 4.5 Curator API 常用操作【修改节点】

Zookeeper 【黑马程序员Zookeeper视频教程&#xff0c;快速入门zookeeper技术】 文章目录Zookeeper4 Zookeeper JavaAPI 操作4.5 Curator API 常用操作4.5.1 修改节点4 Zookeeper JavaAPI 操作 4.5 Curator API 常用操作 4.5.1 修改节点 直接开干 修改之前app1 的数据是本机…

PS1文件执行

PS1文件执行目录概述需求&#xff1a;设计思路实现思路分析1.power shell 管理2.shell 管理执行参考资料和推荐阅读Survive by day and develop by night. talk for import biz , show your perfect code,full busy&#xff0c;skip hardness,make a better result,wait for ch…