跨域 LeetCode rest date Font Awesome matlab停止运行命令 查看kafka消费情况 ps字体旋转角度 matlab跳出for循环 flutter优缺点 SketchUp mysql时间戳转时间 kubernetes入门 python运算符优先级 java的substring java学习平台 java的map java环境包 java获取 运行时错误1004 ps选择反向快捷键 无限弹窗bat maya2008 地下城怎么双开 模拟人生2夜生活 彩虹岛小草黑暗之矛 朋友圈访客记录教程 程序卸载 ansys安装教程 碧桂园园宝 windows游戏编程 fireworks下载 4k对齐是什么意思 mac办公软件 摸摸头不哭表情包 firework软件 wps2012专业版 鼠标指向宏 鲁迅体 平衡德天赋
当前位置: 首页 > 学习教程  > 编程语言

差分能量分析(DPA)

2021/5/8 21:04:45 文章标签:

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

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

附件下载

相关教程

    暂无相关的数据...

共有条评论 网友评论

验证码: 看不清楚?