XnMatrix vue pyqt routing x86 mui Web Uploader java两个数组合并 eclipse显示左边目录 java解析pdf jquery获取兄弟节点 vue与html5 python函数参数 python的re模块 javaindexof javastringbuilder java删除 java截取 linux格式化命令 microkms pyh kms神龙 神剪辑教程 虚拟打印机安装 ps蒙版抠图详细教程 linux格式化硬盘 xlwt maya骨骼绑定 ibeacon定位 安装telnet 楷体gbk 移动硬盘检测工具 qq三国辅助 网络适配器在哪 文字底纹怎么设置 mysql数据恢复 天天手游模拟器 python时间 steam库存 wps表格分页设置
当前位置: 首页 > 学习教程  > 编程语言

差分能量分析(DPA)

2021/5/8 21:04:45 文章标签: 测试文章如有侵权请发送至邮箱809451989@qq.com投诉后文章立即删除

能量分析攻击的基本思想是通过分析密码设备的能量消耗获得其密钥。本质上,这种攻击利用了两类能量消耗依赖性:数据依赖性和操作依赖性。能量分析攻击利用了这样一个事实:密码设备的瞬时能量消耗依赖于设备所处理的数据和设备所执行的操作。 …

能量分析攻击的基本思想是通过分析密码设备的能量消耗获得其密钥。本质上,这种攻击利用了两类能量消耗依赖性:数据依赖性和操作依赖性。能量分析攻击利用了这样一个事实:密码设备的瞬时能量消耗依赖于设备所处理的数据和设备所执行的操作。
DPA攻击利用了一个事实:密码设备的能量消耗依赖于算法执行过程中所处理的中间值。DPA使用的是差分数理统计方法,需要采集多组功耗曲线,将其作为先验函数,而将猜测的密钥组根据一定的规则所产生的分类规则作为后验函数,找出两组函数所具有信息量的相关性,如果相关性强,则说明猜测准确。Kocher最早提出的DPA分析模型为:

Δ [ j ] = ∑ i = 1 n D ( C i , K s ) T i [ j ] ∑ i = 1 n D ( C i , K s ) − ∑ i = 1 n ( 1 − D ( C i , K s ) ) T i [ j ] ∑ i = 1 n ( 1 − D ( C i , K s ) ) \Delta[j] = \frac{\sum_{i=1}^nD(C_i, K_s)T_i[j]} {\sum_{i=1}^nD(C_i, K_s)} - \frac{\sum_{i=1}^n(1 - D(C_i, K_s))T_i[j]} {\sum_{i=1}^n(1 - D(C_i, K_s))} Δ[j]=i=1nD(Ci,Ks)i=1nD(Ci,Ks)Ti[j]i=1n(1D(Ci,Ks))i=1n(1D(Ci,Ks))Ti[j]
≈ 2 ( ∑ i = 1 n D ( C i , K s ) T i [ j ] ∑ i = 1 n D ( C i , K s ) − ∑ i = 1 n T i [ j ] m ) \approx 2(\frac{\sum_{i=1}^nD(C_i, K_s)T_i[j]} {\sum_{i=1}^nD(C_i, K_s)} - \frac{\sum_{i=1}^nT_i[j]} {m}) 2(i=1nD(Ci,Ks)i=1nD(Ci,Ks)Ti[j]mi=1nTi[j])

其中, D ( C i , K s ) D(C_i, K_s) D(Ci,Ks)是功耗区分函数, C i C_i Ci是输入的明文或输出的密文, K s K_s Ks是所猜测的轮密钥, T i [ j ] T_i [j] Ti[j]表示所采集的功耗, i i i 为功耗曲线的条数, j j j为各功耗曲线中的采样点。在功耗曲线采集完毕后,猜测一个轮密钥,将区分函数 D ( C i , K s ) D(C_i, K_s) D(Ci,Ks)与所有功耗曲线 T i [ j ] T_i [j] Ti[j]进行上式的相关处理,当轮密钥猜测错误时,区分函数将所有的功耗曲线进行随机分类,其差分结果将显示随机噪声。当轮密钥猜测正确时,所引起的差分峰值就会显现出来。
图1 正确密钥对应的差分值
图2 错误密钥对应的差分峰值

一个简单的小例子
/*
以AES为例,以S盒输出值的汉明重量作为能量迹分组依据,预设密钥:43;
由于明文数量有限,极端情况下可能出现所有能量迹被划分到同一组,使得结果出错;
所以在本次实现中遍历了汉明重量为0-8的所有可能分组
*/

#include <stdio.h>
#include <math.h>

#define N1 20
 

int HW(int num)
{
	int count = 0;
	int bit;

	for (int i = 3; i >= 0; i--)
    {
		bit = num % 2;
		if (bit == 1)
			count++;
		num = num / 2;
	};

	return count;
}


//AES S-box
int sbox[256] = 
{
    0x63, 0x7c, 0x77, 0x7b, 0xf2, 0x6b, 0x6f, 0xc5, 0x30, 0x01, 0x67, 0x2b, 0xfe, 0xd7, 0xab, 0x76,
    0xca, 0x82, 0xc9, 0x7d, 0xfa, 0x59, 0x47, 0xf0, 0xad, 0xd4, 0xa2, 0xaf, 0x9c, 0xa4, 0x72, 0xc0,
    0xb7, 0xfd, 0x93, 0x26, 0x36, 0x3f, 0xf7, 0xcc, 0x34, 0xa5, 0xe5, 0xf1, 0x71, 0xd8, 0x31, 0x15,
    0x04, 0xc7, 0x23, 0xc3, 0x18, 0x96, 0x05, 0x9a, 0x07, 0x12, 0x80, 0xe2, 0xeb, 0x27, 0xb2, 0x75,
    0x09, 0x83, 0x2c, 0x1a, 0x1b, 0x6e, 0x5a, 0xa0, 0x52, 0x3b, 0xd6, 0xb3, 0x29, 0xe3, 0x2f, 0x84,
    0x53, 0xd1, 0x00, 0xed, 0x20, 0xfc, 0xb1, 0x5b, 0x6a, 0xcb, 0xbe, 0x39, 0x4a, 0x4c, 0x58, 0xcf,
    0xd0, 0xef, 0xaa, 0xfb, 0x43, 0x4d, 0x33, 0x85, 0x45, 0xf9, 0x02, 0x7f, 0x50, 0x3c, 0x9f, 0xa8,
    0x51, 0xa3, 0x40, 0x8f, 0x92, 0x9d, 0x38, 0xf5, 0xbc, 0xb6, 0xda, 0x21, 0x10, 0xff, 0xf3, 0xd2,
    0xcd, 0x0c, 0x13, 0xec, 0x5f, 0x97, 0x44, 0x17, 0xc4, 0xa7, 0x7e, 0x3d, 0x64, 0x5d, 0x19, 0x73,
    0x60, 0x81, 0x4f, 0xdc, 0x22, 0x2a, 0x90, 0x88, 0x46, 0xee, 0xb8, 0x14, 0xde, 0x5e, 0x0b, 0xdb,
    0xe0, 0x32, 0x3a, 0x0a, 0x49, 0x06, 0x24, 0x5c, 0xc2, 0xd3, 0xac, 0x62, 0x91, 0x95, 0xe4, 0x79,
    0xe7, 0xc8, 0x37, 0x6d, 0x8d, 0xd5, 0x4e, 0xa9, 0x6c, 0x56, 0xf4, 0xea, 0x65, 0x7a, 0xae, 0x08,
    0xba, 0x78, 0x25, 0x2e, 0x1c, 0xa6, 0xb4, 0xc6, 0xe8, 0xdd, 0x74, 0x1f, 0x4b, 0xbd, 0x8b, 0x8a,
    0x70, 0x3e, 0xb5, 0x66, 0x48, 0x03, 0xf6, 0x0e, 0x61, 0x35, 0x57, 0xb9, 0x86, 0xc1, 0x1d, 0x9e,
    0xe1, 0xf8, 0x98, 0x11, 0x69, 0xd9, 0x8e, 0x94, 0x9b, 0x1e, 0x87, 0xe9, 0xce, 0x55, 0x28, 0xdf,
    0x8c, 0xa1, 0x89, 0x0d, 0xbf, 0xe6, 0x42, 0x68, 0x41, 0x99, 0x2d, 0x0f, 0xb0, 0x54, 0xbb, 0x16
};


int main()
{
    int inputs[N1] = {41, 35, 62, 4, 33, 44, 22, 46, 18, 16, 9, 49, 49, 59, 41, 43, 51, 38, 27, 60};		

    float traces[N1];

    //恢复出的密钥
    int recoverykey = 0;

    //恢复出的密钥对应的差分峰值
    float max_differ = 0.0;

    for(int i = 0; i < N1; i++)
    {
        //43为预设的密钥,将明文异或密钥过S盒的汉明重量放大5倍作为模拟能量迹
        traces[i] = (float)(HW(sbox[inputs[i] ^ 43]) * 5);
    }

    for(int hwflag = 0; hwflag < 9; hwflag++)
    {
        for(int guesskey = 0; guesskey < 256; guesskey++)
        {
            int flag0 = 0, flag1 = 0;

            float traces0 = 0.0, traces1 = 0.0;

            for(int i = 0; i < N1; i++)
            {
                int temp = HW(sbox[inputs[i] ^ guesskey]);

                if(temp < hwflag)
                {
                    traces0 += traces[i]; 
                    
                    flag0++;
                }

                else
                {
                    traces1 += traces[i]; 
                    
                    flag1++;
                }
            }

            float differ = fabs((traces0 / flag0) - (traces1 / flag1));

            if(max_differ < differ)
            {
                max_differ = differ;

                recoverykey = guesskey;
            }
        }

        printf("hwflag = %d, Key is: %d\n", hwflag, recoverykey);
    }
    
    return 0;
}

[1] Kocher P, Jaffe J, Jun B. Introduction to differential power analysis and related attacks. http://www.cryptography.com/resources/whitepapers/DPA.html [2013-6-10].
[2] 郑新建, 张翌维, 沈绪榜. SPA和DPA攻击与防御技术新进展. 小型微型计算机系统, 2009, 30(4): 726-731.


本文链接: http://www.dtmao.cc/news_show_995021.shtml

附件下载

相关教程

    暂无相关的数据...

共有条评论 网友评论

验证码: 看不清楚?