论文笔记:公钥密码算法的硬件实现及侧信道攻击研究(RSA部分)

论文笔记:公钥密码算法的硬件实现及侧信道攻击研究

作者:王晖(天津大学,2017届硕士学位论文)

RSA 算法计算流程

1.  密钥对生成(软件实现)  
•  选取两个大素数 p 和 q;  
•  计算𝑛  = 𝑝 × 𝑞,以及 n 的欧拉函数𝜙(𝑛) = (𝑝 − 1) ∙ (𝑞 − 1);  
•  随机选取一个整数𝑒 (1  < 𝑒  < 𝜙(𝑛)),满足𝑔𝑐𝑑(𝑒, 𝜙(𝑛)) = 1;  
•  计算私钥 d,满足𝑑 × 𝑒 ≡ 1 𝑚𝑜𝑑 𝜙(𝑛);  
•  其中 n, e  可以公开为公钥;p, q 可以抛弃但不能泄露,  d 需要保密
为私钥。 

2.  加密过程  
•  加密方拥有公钥信息 n, e,首先需要将明文信息数字化,即转换成
二进制数据,保证每次加密明文信息 m 的长度小于log2𝑛;  
•  加密方对明文 m 进行加密,即进行模幂运算𝑐  = 𝑚^e 𝑚𝑜𝑑 𝑛; 
•  加密方将加密好的密文 c 通过可信通信渠道发送给解密方。  

3.  解密过程  
•  解密方拥有私钥信息 d;  
•  解密方接收密文信息 c;  
•  解密方对密文 c 进行解密操作,即𝑚  = 𝑐^d 𝑚𝑜𝑑 𝑛。 

显然,加解密过程的基本运算单元都是:message = 𝑚𝑒𝑠𝑠𝑎𝑔𝑒^k𝑒𝑦 𝑚𝑜𝑑 𝑛。最后通过设计状态机调用模幂模块,分别能够实现 RSA 的加解密过程。RSA整个模块在 Xilinx ISE 开发环境中基于 Xilinx Virtex-5 FPGA 进行了实现。

RSA 算法的硬件设计

采用 Verilog 硬件描述语言,基于 Xilinx Virtex-5 系列 FPGA (xc5vlx50)实现了 1024 位 RSA 的加解密过程。本设计分别采用 FIOS 模乘算法实现底层模乘运算,Boscher 的盲化 BNP 模幂算法实现模幂运算,最终基于模幂模块实现 1024 位的 RSA 加解密处理器。
在这里插入图片描述


模乘单元中的 dat_sram8 用来存放模数 N;dat_sram6 用来存放算法密钥;消息输入可以通过data_i 引脚线写入模乘单元中的 dat_sram4 中。 其它 RAM 分别用来存放模乘的操作数、中间值和运算结果。选择信号 select 用来选择具体存放操作数、中间值以及运算结果的 RAM。这样一来,只需要控制 select 信号就能在模幂运算过程中避免了数据的连续搬运,从而节省了模幂运算时间。
在这里插入图片描述


模幂单元采用的算法为 Boscher 在 2009 年提出的一种能够抵御 DFA, DPA 和DFA 攻击的模幂算法——盲化 BNP 模幂算法。
在这里插入图片描述
模幂单元的核心运算单元为模乘运算单元,通过状态机 FSM 调度模乘单元来实现模幂运算。模幂单元的架构设计如图 4-2 所示。
在这里插入图片描述
clk 为时钟信号,cen 为外部片选信号,rst_b 为复位信号,wen为外部控制读写信号, data_i 为数据读入信号,data_o 为数据读出信号。

addr 信号为外部控制和地址信号:
• addr [12]: 控制开始信号 —— 执行外部对内部 RAM 的读写与内部模乘或模幂执行。
• addr [11]: 模乘、模幂的选择信号 —— 1 为模乘;0 为模幂。
• addr [10]: RAM 选择信号 —— 0 为选择 dat sram9;1 为选择其它 RAM。
• addr [9:4]: 模乘单元的 select 信号 —— HRMM 内部 RAM 的选择信号,同时负责指定操作数与运算结果的存放位置。

侧信道攻击:选择消息 CPA 攻击方法

文章选择消息为三种即 n - 1,1 和 n + 11,并且用它们来攻击盲化 BNP 模幂算法(从右至左),并将使用基于PPMCC2 的 CPA 方法进行功耗的分析。算法描述如前文表 4-2 所示。

通过选择消息(𝑎 ∙ 𝑛 ± 1)^b,从表 4-2 中算法可知,密钥当前位只与算法第 6 步模乘操作有关。
• 若𝑑i= 0,第 6 步执行:𝑅[1] = 𝑅[1] ∙ 𝑅[2]𝑚𝑜𝑑 𝑁;
• 若𝑑i= 1,第 6 步执行:𝑅[0] = 𝑅[0] ∙ 𝑅[2]𝑚𝑜𝑑 𝑁;

因此,密钥值可通过判断什么操作数被执行来获取,𝑅[0]和𝑅[1]互相独立,它们的值之间不会互相干扰。如果𝑅[2]在循环迭代中被置为 1,寄存器𝑅[0]和𝑅[1]会在下次循环迭代中保持当前值不变:
• 若𝑑𝑖= 0,算法第 6 步在循环 i 到 m - 1 执行:𝑅[1] = 𝑅[1] ∙ 1𝑚𝑜𝑑 𝑁;
• 若𝑑i= 1,算法第 6 步在循环 i 到 m - 1 执行:𝑅[0] = 𝑅[0] ∙ 1𝑚𝑜𝑑 𝑁;

此时,当明文选择消息 M = 1 时寄存器 R[0]的值一直等于随机数 r。有两种方式能将R[2]设为 1。

  • 第一种:直接在算法输入部分初始化寄存器 R[2]为 1;
  • 第二种:使𝑅[2]*𝑅[2] 𝑚𝑜𝑑 𝑁 = 1。因为(𝑛 ± 1)^2 𝑚𝑜𝑑 𝑁 = 1 ,若算法输入为 n ± 1,则R[2]会在第一次循环后等于 1。

算法执行在 M 分别等于 1, n ± 1 的情况下,如表 4-4 所示(算法 4-2 中第 6 步在不同选择消息下的具体操作)。假定𝑑 = 77 = (1001101)2,在实际的功耗分析中,不同功耗段就对应于相应的操作(相同操作的操作数一样,在功耗上就会出现功耗碰撞)。
注意在一些模幂算法中会进行归约操作从而使得 M 一直在 0 到n 之间,即选择消息 n+1 归约之后情况与1 时等价。
在这里插入图片描述


本文的攻击只是针对算法中的模乘操作,所以需要对采集到的实际功耗曲线进行截取和重新的对齐操作。最后得到的新的功耗曲线只包括模乘部分的功耗波形,这个功耗波形本文作为向量𝑃𝑇[𝑡][𝑚 × 𝑝]处理,其中 t 代表有 t 条功耗曲线,每条功耗曲线中有 m 个模乘,并且每个模乘中包括有 p 个点。本文提出的 CPA 功耗分析方法如表 4-5 ,具体细节步骤如下:
• 第一步:把向量𝑃𝑇平均化处理得到功耗曲线𝑃𝑇̅̅(降噪)。
• 第二步:将𝑃𝑇̅̅中的第一个模乘的功耗作为比对标本;计算不同模乘对应功耗与比对标本间的 PPMCC,得到新的向量 PC[m]。
• 第三步:根据 PC[m],选适当阈值将其分成两类。数值更大(相关度更高)说明与比对标本有相同的密钥位值。
在这里插入图片描述
注意在攻击结束后会有两种可能的密钥值,此时需要进行试错步骤得到最终正确的密钥值

实验结果

文章在实验中选定的 12 位最低有效位真实值为(101101111101)2。图 4-6 展示了盲化 BNP 模幂算法中循环的第 5-7 步,在选择消息为 1 输入时的功耗曲线,图中很难通过简单的 SPA 直接观察出密钥值。于是将功耗波形数据输入到以算法 4-5 构建的功耗分析平台进行分析。
文章提出的选择消息 CPA 功耗攻击方法只需在示波器采样频率为1MHz下采集 50 条原始的功耗波形就能恢复出密钥。从图4-7中可判断模乘操作功耗与比对标本间的差异。最后通过简单的试错得到正确的密钥(101101111101)2,排除 (010010000010)2。
在这里插入图片描述
在相同的实验条件下,选择消息𝑀 = 𝑛 − 1作为输入执行算法电路,并通过功耗分析得到的皮尔森相关系数向量如图 4-7 中右图所示。
在这里插入图片描述
文章的攻击方法与四种典型的最新类似攻击方法的效率比较(包括Witteman 等人提出的方法,Akalp 等人提出的方案,Kim 等人提出的方案和 Wan 等人提出的方案)。
在这里插入图片描述
本文为博主原创文章,转载请注明出处:https://blog.csdn.net/jeanlu/article/details/104594497


  1. 在考虑实际硬件环境下,可作为输入选择消息的有 n-1,1 和 n + 1。 ↩︎

  2. 皮 尔 森 相关 系 数 (Pearson product-moment correlation
    coefficient PPMCC)是一种判断两个向量 X 和 Y 之间线性相关度的方法,相关度数值从-1 到 1,1 代表完全正相关,0 代表不相关,-1 代表完全负相关。CPA的原理主要基于 PPMCC。 ↩︎

  • 1
    点赞
  • 17
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值