NepCTF2023 Crypto SecureAgg 出题思路&wp

感觉挺神奇的,去年还是NepCTF的参赛者,今年就换成出题人的身份了。

[NepCTF2023] Crypto SecureAgg official Writeup

前段时间看了一些联邦学习安全聚合中的内容,于是就打算趁热打铁出一道相关的应用密码学题目。

考虑招新赛的难度,也不打算弄太复杂吧,对基础方案进行了一定的简化。本题考查联邦学习中最基础的安全聚合方案。当然,如果不太了解这些,也是没有关系滴,读一读代码,稍微分析一下也是完全可以做滴!

安全聚合的目标,也就是本题的主要目标在于:给出一组用户的加密数据,如何获取原始数据的聚合结果。

题目的关键在于对每一个用户数据的加密用如下的方式: 关键就在于这里的一加一减。

我们的目的是要求,那么我们试着求一下看看会发生什么。 是用户i与j的共享密钥,那么在求和过程中对于任意两个用户,必有相加从而抵消掉。

从而式子中只剩 最后 给出一份参考代码

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
from pwn import *
from Crypto.Util.number import *
from hashlib import sha256
from Crypto.Cipher import AES
from Crypto.Util.Padding import unpad
from base64 import b64decode

context.log_level = 'debug'

#sh=remote('0.0.0.0',1337)
sh=remote('nepctf.1cepeak.cn',30298)
sla = lambda a,b :sh.sendlineafter(str(a),str(b))
sa = lambda a,b :sh.sendafter(str(a),str(b))
lg = lambda name,data : sh.success(name + ": 0x%x" % data)
se = lambda payload: sh.send(payload)
rl = lambda : sh.recvline()
rv = lambda n : sh.recv(n)
sl = lambda payload: sh.sendline(payload)
ru = lambda a :sh.recvuntil(str(a))
rud = lambda a :sh.recvuntil(str(a),drop=True)

ru('M=')
M=int(rl().strip().decode())

for i in range(20):
ru('#Round %d\n'%(i+1))
exec(rl().strip().decode())
exec(rl().strip().decode())
enc=b64decode(enc)
key=(sum(enc_list)-len(enc_list)*514)*inverse(114,M)%M
aes_key=sha256(str(key).encode()).digest()[:16]
aes=AES.new(aes_key,AES.MODE_CBC,iv=bytes(range(16)))
dec=aes.decrypt(enc)
sla('message: ',unpad(dec,16).decode())

sh.interactive()

NepCTF2023 Crypto SecureAgg 出题思路&wp

https://litao6666.github.io/202308/67f1406d.html

Author

zealot

Posted on

2023-08-16

Updated on

2023-08-17

Licensed under