密码侧信道分析实验-计时工攻击
备注:密码侧信道分析课程的课内实验,仅供学习参考。不一定正确。
【实验目的】
1、掌握计时攻击的基本原理;
2、掌握计时攻击方法进行密钥猜测攻击的基本原理和方法;
3、掌握字符串验证过程中计时攻击的基本原理和方法。
【实验人数】
每组1人
【系统环境】
Windows
【编程语言】
Python
【实验原理】
计时攻击是侧信道攻击( Side Channel Attack, 简称SCA) 的一种。攻击者试图通过分析加密算法的时间执行来推导出密码。每一个逻辑运算在计算机需要时间来执行,根据输入不同,精确测量执行时间,根据执行时间反推出密码。
一个最简单的计时攻击的例子,某个函数负责比较用户输入的密码和存放在系统内密码是否相同,如果该函数是从第一位开始比较,发现不同就立即返回,那么通过计算返回的速度就知道了大概是哪一位开始不同的,这样就实现了电影中经常出现的按位破解密码的场景。密码破解复杂度成千上万倍甚至百万千万倍的下降。最简单的计时攻击防御方法是:“发现错误的时候并不立即返回,而是设一个标志位,直到完全比较完两个字符串再返回”。
下面两种不同的字符串比较方式:
1.正常的字符串比较方法。一旦遇到一个不同的字符就返回失败了,所以,理论上来说,只有前面2个字符相同字符串的比较时间,要比前面有10个字符相同的比较时间要长。你会说,这能相差多少呢?可能几微秒吧。但是,我们可以放大这个事。比如,在Web应用时,记录每个请求的返回所需赶时间(一般是毫秒级),如果我们重复50次,我们可以查看平均时间或是总时间,以了解哪个字符返回的时间比较长,如果某个我们要尝试的字符串的时间比较长,我们就可以确定地得出这个这字符串的前面一段必然是正确的。
2.改进的字符串比较方法。通过异或操作 1^1=0 , 1^0=1 , 0^1=1 ,0^0=0,来比较每一位,如果每一位都相等的话,两个字符串肯定相等,最后存储累计异或值的变量 必定为 0,否则为 1。
【实验内容】
1、完成detime-student.py程序中正常字符串比较方法different_time_compare(val1, val2)函数与改进的字符串比较方法constant_time_compare(val1, val2)函数,比较两个函数在比较相同字符串与不同字符串之间的用时差别,并分析原因。
(1)补充different_time_compare函数与constant_time_compare函数
(2)different_time_compare函数比较相同字符串
(3)different_time_compare函数比较不相同字符串
(4)constant_time_compare函数比较相同字符串
(5)constant_time_compare函数比较不相同字符串
# -*- coding: utf-8 -*-
"""
Created on Fri Sep 17 15:21:17 2021
@author: lilin
"""
# -*- coding: utf-8 -*-
"""
Created on Fri Sep 17 11:01:37 2021
@author: lilin
"""
import random
import time
#字符串长度
length = 8000000 #值太小会出现计时偏差错误
def different_time_compare(val1, val2):
"""
存在计时攻击的字符串比较方法
"""
t1 = time.time()
if len(val1) != len(val2):
return False
#补充:用正常的字符串比较方法比较
for i in range(len(val1)):
if val1[i] != val2[i]:
t2