
侧信道分析(SCA)已经成为网络安全、硬件安全和密码工程领域的一个关键课题。不同于软件漏洞利用或暴力破解方法,侧信道攻击利用的是数字过程在现实世界中的物理表现,如功耗波动、电磁辐射或执行时间等。这些微妙的线索可以通过仔细分析来提取敏感信息,如加密密钥,即使是对于高度安全的设备。
本文深入探讨了电磁与功率侧信道分析,解释攻击向量、现实案例、检测和缓解技术,并提供动手代码示例,以展示不同时技能水平的实际应用。本文面向初学者和高级用户,不仅帮助理解SCA,还提供策略来保护您的设备或评估它们的安全性。
**侧信道分析(SCA)**指的是利用计算设备执行加密或敏感操作时出现的无意的信息泄漏。SCA不是针对软件漏洞或攻击数学算法,而是利用物理属性——“侧信道”——来推断秘密。这些属性可以包括功耗变化、发射的电磁(EM)波、时间差异、声信号,甚至是光或热。
一个简单的类比是,将犯罪企图破坏保险箱方法类比为不是通过操控锁,而是通过倾听微妙的点击声(时间、机械运动)或测量组合盘转动时的振动(声学或EM辐射)。SCA利用的是设备在执行安全过程时显示出的细微之处。
功率侧信道攻击关注的是观察设备在执行加密操作时的功耗。由于大多数算法基于密钥的位数执行不同的代码路径和数据处理例程,功耗会发生微小但可测量的变化。
相比于功率SCA需要接入供电线路,电磁侧信道攻击使用天线和探头来窃听集成电路在进行逻辑操作时辐射出的EM波。EM-SCA有时可以更具焦点且入侵性较小,因为攻击者不必对电源线进行物理干扰。
SCA的成功依赖于可测量性和相关性:
**注意:**攻击者不需要设备的代码或破解其软件防御;“泄漏”是由于物理和电路而产生的。
一个里程碑意义的DPA结果是在执行AES加密的智能卡上。通过观察智能卡在加密上百个已知明文值时的功耗,研究人员在未破解算法本身的情况下提取了AES密钥。
研究人员展示了通过仅仅接近某些智能卡并采用专门调谐的探头,他们可以在加密操作中捕捉到EM辐射并破解密钥。
时间侧信道,比如幸运13攻击,通过检测TLS服务器在处理某些不正确或格式错误的加密数据包时花费的微小时间差,揭示底层密钥的信息。
许多带有“安全元素”的物联网芯片如果其物理硬件不包括防篡改或噪声屏蔽,依然可能受到攻击——即使是由爱好者使用消费级示波器也能通过功率分析提取密钥。
注意:始终合法合规地进行侧信道分析(即便是对自己的设备)。以下示例仅供安全研究、CTF和学习使用。
要进行基础SCA,需要:
+----------------------+
| 微控制器/SoC |---[分流电阻]--[电源]
| (目标设备) |
| |
| [触发GPIO]---------+
+----------------------+
|
[探头]
|
+-------------+
| 示波器 |
+-------------+
|
[USB至PC]
假设您已捕获到波形数据(功率或EM测量的CSV或二进制文件),您可以使用Python(带numpy、scipy和matplotlib)进行基本分析。
对于一些USB连接的示波器,您可以使用pyvisa库列出设备。
import pyvisa
rm = pyvisa.ResourceManager()
print("已连接的仪器:")
for resource in rm.list_resources():
print(resource)
假设你有1000个包含功率轨迹的CSV文件。我们来计算平均功率波形。
import numpy as np
import glob
import matplotlib.pyplot as plt
trace_files = glob.glob('traces/*.csv')
accum = None
count = 0
for fname in trace_files:
data = np.loadtxt(fname, delimiter=',')
if accum is None:
accum = data
else:
accum += data
count += 1
mean_trace = accum / count
plt.plot(mean_trace)
plt.xlabel("样本编号")
plt.ylabel("功率(单位)")
plt.title("加密操作的平均功率轨迹")
plt.show()
假设你尝试使用假设的中间值(例如S盒输出)和汉明重量泄漏模型来恢复一个AES密钥字节。利用轨迹和已知明文:
def hamming_weight(x):
return bin(x).count('1')
plaintexts = ... # 已知输入字节数组
traces = ... # 2D numpy数组:形状为(num_traces, trace_length)
guesses = range(256)
max_corr = np.zeros(256)
for key_guess in guesses:
# 根据密钥猜测(S盒等)预测功率负载
model_vals = np.array([hamming_weight(some_sbox[pt ^ key_guess]) for pt in plaintexts])
# 对每个时间样本进行相关
for t in range(traces.shape[1]):
corr = np.corrcoef(traces[:, t], model_vals)[0, 1]
if abs(corr) > max_corr[key_guess]:
max_corr[key_guess] = abs(corr)
print("最佳密钥猜测:", np.argmax(max_corr))
(以上为示意;在实际攻击中,使用了更复杂的模型和预处理。)
如果您的数据采集设备显示为串行或USB设备:
lsusb
dmesg | grep tty
从串行连接的示波器记录数据(假设设备为/dev/ttyUSB0):
sudo minicom -D /dev/ttyUSB0 -b 115200
或用于连续记录:
cat /dev/ttyUSB0 > powertrace.log &
鉴于SCA的非侵入性和算法独立性,传统的软件补丁是不够的。有效的对策跨越硬件设计、软件算法和操作程序。
电磁与功率侧信道分析代表了攻击者工具中一些最具创新性和复杂性的技术。它们利用每个物理实现都会泄露这一现实情况,无论是通过功率消耗或电磁辐射。
随着嵌入式设备、物联网、智能卡和硬件加密广泛应用,理解SCA不再是小众;它是必需的——无论您是在设计安全硬件、编写加密代码,还是进行安全审计。
保持警惕,采用最新实践,进行硬件感知工程和定期、强健的测试是抵御侧信道攻击的最佳防护措施。随着这一领域的快速发展,构建抵御SCA的安全设备是一个不断变化且至关重要的目标。
MDPI安全与安全,“电磁与功率侧信道分析:调查与实验室设置”
https://www.mdpi.com/2410-387X/4/4/30
Ericsson博客,“如何阻止侧信道分析攻击”
https://www.ericsson.com/en/blog/2023/4/side-channel-analysis
The Conversation,“什么是侧信道攻击?网络安全研究人员解释计算机如何在不被黑客攻击的情况下泄露秘密”
https://theconversation.com/what-is-a-side-channel-attack-a-cybersecurity-researcher-explains-how-computers-can-leak-secrets-without-being-hacked-286121
Paul Kocher等,“差分功率分析”
https://www.cryptography.com/public/pdf/DPA.pdf
Wikipedia,“侧信道攻击”
https://en.wikipedia.org/wiki/Side-channel_attack
物联网安全基金会,“侧信道攻击抵抗的实用考虑”
https://www.iotsecurityfoundation.org/best-practice-guidelines/side-channel-attack-resistance/
(如果您认为这篇文章有用,请与您的同事分享或在评论中留下您关于SCA的经验或问题!)