论文笔记:公钥密码算法的硬件实现及侧信道攻击研究
作者:王晖(天津大学,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 等人提出的方案)。
来源:CSDN
作者:jeanlu
链接:https://blog.csdn.net/jeanlu/article/details/104594497