如题
岗位职责
面试流程就是初面+CTF出题(密码+Web)+人力,到人力那儿就挂了,具体原因说是与岗位要求不符,是短信回复。
但是出的这两道题还是花了心思的,周末两天时间出的,我先把题目放上来,出题细节明天发。密码学是侧信道攻击,Web是任意代码执行
密码-侧信道攻击
1.出题思路
1.1.生成模板轨迹:
生成两个模板轨迹 T 0 \mathbf{T}_0 T0和 T 1 \mathbf{T}_1 T1,分别对应比特值 0 和 1。使用随机噪声生成模板轨迹。
1.2.插入明文信息:
将明文信息(flag)转换为二进制位串。
根据每个位的值选择对应的模板轨迹,并加入随机噪声生成目标能量轨迹。
1.3.生成能量轨迹文件和图:
保存生成的能量轨迹到文件,并绘制能量轨迹图。
2.解题思路
2.1.加载能量轨迹文件和模板轨迹:
参赛者加载提供的能量轨迹文件和模板轨迹文件。
2.2.恢复比特值:
对每个能量轨迹计算其与模板轨迹 T 0 \mathbf{T}_0 T0和 T 1 \mathbf{T}_1 T1的欧几里得距离,恢复比特值。
2.3.转换为明文信息:
将恢复的二进制位串转换为明文信息。
3.题目信息
3.1题目名称:能量追踪
技术背景
在实际操作中,每当设备执行加密运算时,其功耗会发生微小的变化。这些变化虽然细微,但通过精密的仪器可以记录下来。侧信道攻击利用了这些功耗变化,通过分析和对比,逐步还原出加密过程中使用的密钥或明文信息。图片为flag加密过程中不同阶段的能量消耗情况。
import numpy as np
# 加载模板轨迹文件
template_trace_0 = np.load('template_trace_0.npy')
template_trace_1 = np.load('template_trace_1.npy')
# 加载能量轨迹文件
traces = np.load('energy_traces_with_flag.npy')
def bits_to_text(bits):
chars = [bits[i:i+8] for i in range(0, len(bits), 8)]
text = ''.join([chr(int(char, 2)) for char in chars])
return text
# 提示:参赛者需要推导如何从能量轨迹恢复二进制位,再将二进制位转换回明文 flag
# 题目包含附件总共4个
1.energy_traces_with_flag.npy
2.energy_traces_with_flag.png
3.template_trace_0.npy
4.template_trace_1.npy
4.解题过程
import numpy as np
from scipy.spatial.distance import euclidean
# 加载能量轨迹文件
traces = np.load('energy_traces_with_flag.npy')
# 加载模板轨迹文件
template_trace_0 = np.load('template_trace_0.npy')
template_trace_1 = np.load('template_trace_1.npy')
# 恢复私钥(明文 flag 的二进制形式)
def recover_private_key(traces, template_trace_0, template_trace_1):
private_key = []
for trace in traces:
# 计算轨迹与两个模板轨迹的欧几里得距离
dist_0 = euclidean(trace, template_trace_0)
dist_1 = euclidean(trace, template_trace_1)
# 选择距离较小的模板轨迹对应的比特位
private_key.append(0 if dist_0 < dist_1 else 1)
return private_key
# 将恢复的二进制形式转换为明文 flag
def bits_to_text(bits):
chars = [bits[i:i+8] for i in range(0, len(bits), 8)]
text = ''.join([chr(int(char, 2)) for char in chars])
return text
# 恢复私钥并转换为明文
private_key = recover_private_key(traces, template_trace_0, template_trace_1)
recovered_bits_str = ''.join(map(str, private_key))
recovered_plaintext = bits_to_text(recovered_bits_str)
print(f"Recovered plaintext: {recovered_plaintext}")
所以,本题的flag为flag{To_be_both_a_speaker_of_words_and_a_doer_of_deeds_xuruihan_is_the_author}
具体出题思路明天发公众号