SM2算法的抗侧信道攻击

SM2 算法中底层模块抗侧信道

   标量乘 ( [ k ] G [k]G [k]G) 运算过程中需要用到大量的倍点运算与点加运算。传统倍点运算与点加运算之间由于需要的运算次数不同,功耗存在明显区别,攻击者可以通过功耗波形特征分析密钥信息。传统算法如下图所示:
标量乘的传统算法
   在传统算法中, d i d_i di 等于 0 0 0 1 1 1 对应不同的执行指令,图中符号 Π 0 \Pi_0 Π0 代表倍点运算,符号 Π 1 \Pi_1 Π1 代表点加运算。可参考侧信道原子算法,调整点加和倍点运算过程中寄存器运算顺序,采用原子块形式将点加运算和倍点运算都划分为若干个原子小块,每个小块先进行模乘运算,再进行模加运算,最后进行模减运算,其结构表示为 Γ \Gamma Γ。用 '☆’表示不影响最终结果的一次加/减的空操作。如此,实际计算过程中总在执行一组组相同操作,点加和倍点之间的功耗曲线将变得更加连续,从而达到抗SPA攻击的目的。以固定参数倍点运算和固定点加运算为例,如表1所示是改进的原子小块点加运算,如表2所示是改进的原子小块倍点运算。

表1 改进的原子小块点加运算
改进的原子小块点加运算

表2 改进的原子小块倍点运算
改进的原子块倍点运算

SM2 算法中标量乘抗侧信道模块

   NAF 标量乘法算法是标量乘法算法的一种增强,该算法使用了非邻接形式(Non-Adjacent Form)表达,减少了算法的期望运行时间。下面是具体算法细节:
   将 标量表示为 k = ∑ i = 0 l − 1 k i × 2 i k =\sum_{i=0}^{l-1}k_i\times 2^i k=i=0l1ki×2i,其中 k i ∈ { 0 , + , − } k_i\in \{0,+,-\} ki{0,+,}。一个十分有用的有符号整数表达,规定 k l − 1 ≠ 0 k_{l-1}\neq 0 kl1=0,且没有两个相邻的 k i = 0 k_i = 0 ki=0
   NAF 表示有如下性质

  • 每个正整数 k k k 都有独一无二的 NAF 表达。记作 N A F ( k ) NAF(k) NAF(k)
  • N A F ( k ) NAF(k) NAF(k) 有所有 k k k的有符号表达最少得非零数字;
  • N A F ( k ) NAF(k) NAF(k) 的长度最多比二进制表达多1位;
  • 如果 N A F ( k ) NAF(k) NAF(k)长度为 l l l,那么有 2 l 3 < k < 2 l + 1 3 \frac{2^l}{3}<k<\frac{2^{l+1}}{3} 32l<k<32l+1;
  • 在所有长度为 l l l 的 NAF中,非零系数的概率约为 1 / 3 1/3 1/3

N A F ( k ) NAF(k) NAF(k) 能够通过以下算法计算
输入 : 正整数 k k k
输出 : N A F ( k ) NAF(k) NAF(k)
i ← 0 i\leftarrow 0 i0
k ≥ 0 k \geq 0 k0 执行
   若 k k k 为奇数,则
      k i ← 2 − ( k m o d 4 ) k_i\leftarrow 2-(k \mod 4) ki2(kmod4)
      k ← k − k i k\leftarrow k-k_i kkki
   否则
      k i ← 0 k_i\leftarrow 0 ki0
   k ← k / 2 k\leftarrow k/2 kk/2
   i ← i + 1 i \leftarrow i+1 ii+1
返回 ( k i − 1 , k i − 2 , ⋯ k 1 , k 0 k_{i-1},k_{i-2},\cdots k_1,k_0 ki1,ki2,k1,k0)

最后可以通过 N A F ( k ) NAF(k) NAF(k) 代替 k k k 的二进制表示来修改标量乘从左至右的二进制方法
输入 : 正整数 k k k
输出 : [ k ] P [k]P [k]P
根据上一个算法将正整数 k k k 表示为 N A F ( k ) NAF(k) NAF(k)
Q ← O Q\leftarrow O QO
i i i l − 1 l-1 l1 0 0 0 执行
   Q ← 2 Q Q \leftarrow 2Q Q2Q
   若 k i = 1 k_i = 1 ki=1 Q ← Q + P Q\leftarrow Q+P QQ+P
   若 k i = − 1 k_i = -1 ki=1 Q ← Q − P Q\leftarrow Q-P QQP
返回(Q)

随机NAF窗口法

   传统的NAF因为扰乱了带有规律的点加和倍点二进制编码顺序,因而可以成功抵抗 SPA 攻击,又由于传统的NAF在进行点加运算时,点为固定值,标量乘中 k k k 的值固定时,NAF编码数值也就确定了,攻击者可以通过采集大量的功耗曲线并进行相关性波形分析,通过波形分析猜测出倍点与点加的位置及点加运算对应的操作点,从而恢复 k k k 值,实现 DPA 攻击。
  对于以上的情况,可以将随机数应用于 NAF 标量乘,通过随机数将 NAF 编码进行随机化来躲避固定值运算带来的隐患。第一步,先选取一个随机数 l l l,其 l ∈ [ 0 , ( n − 1 ) / m ] l\in [0,(n-1)/m] l[0,(n1)/m] n n n为值 k k k的位数, m m m为自选值),第二步,再选取一个随机数 w w w ,使 w ∈ [ 2 , m w ] w\in [2,m_w] w[2,mw] m w m_w mw 的大小要在预计算表的范围内。第三步,循环进行计算 NAF 值,当 i = l , 2 l , ⋯ , m l i=l,2l,\cdots,ml i=l,2l,,ml 时,重新选取 w w w

N A F w ( k ) NAF_w(k) NAFw(k) 能够通过以下算法计算
输入 : 正整数 k k k
输出 : N A F w ( k ) NAF_w(k) NAFw(k)
i ← 0 i\leftarrow 0 i0
选择随机数 l ∈ [ 0 , ( n − 1 ) / m ] , w ∈ [ 2 , m w ] l \in[0,(n-1)/m], w\in[2,m_w] l[0,(n1)/m],w[2,mw]
k ≥ 0 k \geq 0 k0 执行
   判断 i i i 是否等于 l , 2 l , ⋯ , m l l,2l,\cdots,ml l,2l,,ml,相等则重新选取 随机数 w w w
   否则:
      若 k k k 为奇数,则
        k i ← k m o d 2 w k_i\leftarrow k \mod 2^w kikmod2w
        k ← k − k i k\leftarrow k-k_i kkki
      否则
         k i ← 0 k_i\leftarrow 0 ki0
      k ← k / 2 k\leftarrow k/2 kk/2
      i ← i + 1 i \leftarrow i+1 ii+1
返回 ( k i − 1 , k i − 2 , ⋯ k 1 , k 0 k_{i-1},k_{i-2},\cdots k_1,k_0 ki1,ki2,k1,k0)

  根据以上算法可以看出NAF值存在不固定的变化,每一次执行标量乘 k k k 对应的NAF编码各不相同,含有很大程度的随机性,因包含不确定的 k i k_i ki 值,所以攻击者做相关性功耗分析时就要有庞大的功耗波形及数据分析来做支持,所以也可以抗DPA攻击。在进行模板攻击时,因为 NAF 的编码形式存在多样性,故攻击者也没法建立所有模板,因此也适用在抗模板攻击方法中。

改进的蒙哥马利阶梯算法

  标准的蒙哥马利标量乘算法如下:
蒙哥马利标量乘算法
   标准的蒙哥马利算法容易受到倍点攻击,当 k = 157 = ( 10011101 ) 2 k = 157 = (10011101)_2 k=157=(10011101)2 时,蒙哥马利计算过程如下表所示,其中标蓝的部分为倍点运算相同处。当 k i = k i + 1 k_i=k_{i+1} ki=ki+1 时, [ k ] P [k]P [k]P 的第 i + 1 i+1 i+1 步和 [ k ] 2 P [k]2P [k]2P 的第 i i i步计算的倍点步骤一样,对两条曲线对齐看临近的倍点运算曲线,相同就能知道 k i = k i + 1 k_i=k_{i+1} ki=ki+1,攻击者能知道 k k k 的相邻比特位之间的关系,只需猜测首位是 0 0 0 还是 1 1 1,再根据关系推测其他位置就能推测全部标量值 k k k
蒙哥马利点加及倍点运算
   采用改进的蒙哥马利标量乘法,如以下算法。标量 k k k 不论为 1 1 1 0 0 0 都需做一次点加和一次倍点,可抗 SPA。添加随机点 R R R 与随机坐标 Z l Z_l Zl, 使得中间值含有随机成分,可抗DPA。随机成分的存在使得无法建立模板,可以抗TA。基于盲化后不能自己选择输入点 P P P,因此可抗 DA, RPA,ZPA。
改进蒙哥马利阶梯算法

变换公式法

   在数据传输过程中,数据的不可否认性非常重要,为此人们提出了数字签名技术。SM2签名算法中,包含了大数模乘 r ⋅ d A r\cdot d_A rdA,其中 r r r 是已知变量, d A d_A dA 是未知常量。大数模乘会涉及大量的中间数据,攻击者能够根据已知的 r r r 反推出与 d A d_A dA相关的中间数据,然后分析功耗与中间数据之间的相关性来确定私钥 d A d_A dA。这种方法攻击的实质是对乘法器进行攻击,为了预防这种攻击,对签名中公式进行如下变形。
s = ( ( 1 + d A ) − 1 ⋅ ( k − r ⋅ d A ) ) m o d n = [ ( 1 + d A ) − 1 ⋅ k − ( 1 + d A ) − 1 ⋅ r ⋅ d A ] m o d n = [ ( 1 + d A ) − 1 ⋅ k − ( 1 + d A ) − 1 ⋅ ( 1 + d A − 1 ) ⋅ r ] m o d n = [ ( 1 + d A ) − 1 ⋅ k − ( 1 + d A ) − 1 ⋅ ( 1 + d A ) ⋅ r + ( 1 + d A ) − 1 ⋅ r ] m o d n = [ ( 1 + d A ) − 1 ⋅ k − ( 1 + d A ) − 1 ⋅ r − r ] m o d n = [ ( 1 + d A ) − 1 ⋅ ( k + r ) − r ] m o d n \begin{align} s = & ((1+d_A)^{-1}\cdot (k-r \cdot d_A))\mod n\\ =& [(1+d_A)^{-1}\cdot k - (1+d_A)^{-1}\cdot r \cdot d_A]\mod n\\ = & [(1+d_A)^{-1}\cdot k - (1+d_A)^{-1}\cdot (1+d_A-1)\cdot r] \mod n\\ = & [(1+d_A)^{-1}\cdot k - (1+d_A)^{-1}\cdot (1+d_A)\cdot r + (1+d_A)^{-1}\cdot r ] \mod n\\ = &[(1+d_A)^{-1}\cdot k - (1+d_A)^{-1}\cdot r - r] \mod n\\ = & [(1+d_A)^{-1}\cdot (k+r)-r]\mod n \end{align} s======((1+dA)1(krdA))modn[(1+dA)1k(1+dA)1rdA]modn[(1+dA)1k(1+dA)1(1+dA1)r]modn[(1+dA)1k(1+dA)1(1+dA)r+(1+dA)1r]modn[(1+dA)1k(1+dA)1rr]modn[(1+dA)1(k+r)r]modn
   公式变形之后公式中不再含有易受攻击的 r ⋅ d A r\cdot d_A rdA。攻击者便无法针对 r ⋅ d A r\cdot d_A rdA 进行差分功耗攻击。此外利用此公式只需进行一次模逆和一次模乘,比原公式减少了一次模乘,在运算上也有减少。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/25660.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

11. 使用tomcat中碰到的一些问题

文章目录 问题一&#xff1a;Tomcat的startup.bat启动后出现乱码问题二&#xff1a;一闪而退之端口占用问题三&#xff1a;非端口问题的一闪而退问题四&#xff1a;服务器的乱码和跨域问题问题五: 在tomcat\webapps\下创建文件夹为什么tomcat重启就会丢失问题六&#xff1a;Tom…

【C++】AVL(平衡二叉搜索树)树的原理及实现

文章目录 一、引言 二、AVL树的概念 三、AVL树的插入 3、1 AVL树的简单插入 3、2 旋转分类 3、2、1 新节点插入较高右子树的右侧&#xff1a;左单旋 3、2、2 新节点插入较高左子树的左侧&#xff1a;右单旋 3、2、3 新节点插入较高左子树的右侧&#xff1a;左右双旋&#xff08…

d2l 线性回归的简洁实现

文章目录 线性回归的简洁实现1. 生成数据集2. 调用框架现有api来读取数据3. 使用框架预定义好的层4. 初始化模型参数5. 均方误差6. 实例化SGD实例&#xff08;优化算法&#xff09;7. 训练 线性回归的简洁实现 上一节 张量&#xff1a;数据存储、线性代数&#xff1b;自动微分…

Transformer 立体视觉 Depth Estimation

1. Intro 立体深度估计具有重要的意义,因为它能够重建三维信息。为此,在左右相机图像之间匹配相应的像素;对应像素位置的差异,即视差,可以用来推断深度并重建3D场景。最近基于深度学习的立体深度估计方法已经显示出有希望的结果,但仍然存在一些挑战。 其中一个挑战涉及使…

stable diffusion webui 安装

安装环境:cuda10.2-cudnn8-devel-ubuntu18.04 torchtorchvision:[pytorch]pytorch官方安装法_torch1.13.1cu117_FL1623863129的博客-CSDN博客 error&#xff1a;RuntimeError: Couldnt determine Stable Diffusions hash: 69ae4b35e0a0f6ee1af8bb9a5d0016ccb27e36dc. 解决方法…

数据库执行新增时,字段写值错乱/字段值写反了 的问题

今天给表加了个字段&#xff0c;执行新增后查看表&#xff0c;发现数据库执行新增完成后&#xff0c;字段写值错乱了&#xff0c;表现为这两个字段的值写反了↓↓↓↓↓↓ 排查了xml中所有赋值的地方&#xff0c;全都没有问题 字段与属性的通用映射&#xff1a; <resultMap…

(统计学习方法|李航)专栏学习笔记目录导航

第一章 统计学习方法概论 &#xff08;统计学习方法|李航&#xff09;第一章统计学习方法概论-一二三节统计学习及统计学习种类&#xff0c;统计学习三要素 &#xff08;统计学习方法|李航&#xff09;第一章统计学习方法概论——四五六节&#xff1a;模型评估与模型选择&…

【已解决】Java 中使用 ES 高级客户端库 RestHighLevelClient 清理百万级规模历史数据

&#x1f389;工作中遇到这样一个需求场景&#xff1a;由于ES数据库中历史数据过多&#xff0c;占用太多的磁盘空间&#xff0c;需要定期地进行清理&#xff0c;在一定程度上可以释放磁盘空间&#xff0c;减轻磁盘空间压力。 &#x1f388;在经过调研之后发现&#xff0c;某服务…

编织人工智能:机器学习发展历史与关键技术全解析

文章目录 1. 引言1.1 机器学习的定义1.2 重要性和应用场景重要性应用场景 2. 机器学习的早期历史2.1 初期理论与算法感知机决策树 2.2 早期突破支持向量机神经网络初探 3. 21世纪初期的发展3.1 集成学习方法随机森林XGBoost 3.2 深度学习的崛起卷积神经网络&#xff08;CNN&…

css-4:元素水平垂直居中的方法有哪些?如果元素不定宽高呢?

1、背景 在开发中&#xff0c;经常遇到这个问题&#xff0c;即让某个元素的内容在水平和垂直方向上都居中&#xff0c;内容不仅限于文字&#xff0c;可能是图片或其他元素。 居中是一个非常基础但又是非常重要的应用场景&#xff0c;实现居中的方法存在很多&#xff0c;可以将这…

《MySQL45讲》笔记—锁

数据库锁设计初衷是处理并发问题&#xff0c;作为多用户共享的资源&#xff0c;当出现并发访问的时候&#xff0c;数据库需要合理地控制资源的访问规则&#xff0c;而锁就是用来实现这些访问规则的重要数据结构。 根据加锁的范围&#xff0c;MySQL里面的锁大致可以分为全局锁、…

139. 单词拆分(leetcode刷题记录)

单词拆分 给你一个字符串 s 和一个字符串列表 wordDict 作为字典。请你判断是否可以利用字典中出现的单词拼接出 s 。 注意&#xff1a;不要求字典中出现的单词全部都使用&#xff0c;并且字典中的单词可以重复使用。 示例 1&#xff1a; 输入: s “leetcode”, wordDict …

【数据结构和算法】--N叉树返回根节点到目标节点的路径

目录 一、前言二、Java代码实现 一、前言 项目中接触一个问题&#xff1a;在大量有父子关系的列表中&#xff0c;需要筛选出特定约束的数据【要求某个目标节点延续到根节点的数据】。这个问题抽象为数据结构&#xff0c;就是&#xff1a;N叉树返回根节点到目标节点的路径 二、…

Spring IOC

◆ 传统Javaweb开发的困惑 ◆ IoC、DI和AOP思想提出 ◆ Spring框架的诞生 Spring | Home IOC控制反转&#xff1a;BeanFactory 快速入门 package com.xiaolin.service.Impl;import com.xiaolin.dao.UserDao; import com.xiaolin.service.UserService;public class UserServic…

Intel 4工艺太难了!酷睿Ultra终于突破5GHz

无论是14nm还是10nm&#xff0c;Intel这些年的新工艺都有一个通性&#xff1a;刚诞生的时候性能平平&#xff0c;高频率都上不去&#xff0c;只能用于笔记本移动端(分别对应5代酷睿、10代酷睿)&#xff0c;后期才不断成熟&#xff0c;比如到了13代酷睿就达到史无前例的6GHz。 接…

【Linux】守护进程

1 相关概念 1.1 守护进程的概念 守护进程也叫做精灵进&#xff0c;是运行在后台的一种特殊进程。它独立于控制终端并且可以周期性的执行某种任务或者处理某些发生的事件。 守护进程是非常有用的进程&#xff0c;在Linux当中大多数服务器用的就是守护进程。比如&#xff0c;web…

前端 select 标签如何创建下拉菜单?

聚沙成塔每天进步一点点 ⭐ 专栏简介⭐ 代码示例⭐ 代码讲解⭐ 写在最后 ⭐ 专栏简介 前端入门之旅&#xff1a;探索Web开发的奇妙世界 记得点击上方或者右侧链接订阅本专栏哦 几何带你启航前端之旅 欢迎来到前端入门之旅&#xff01;这个专栏是为那些对Web开发感兴趣、刚刚踏…

【网络基础知识铺垫】

文章目录 1 :peach:计算机网络背景:peach:1.1 :apple:网络发展:apple: 2 :peach:协议:peach:2.1 :apple:协议分层:apple:2.2 :apple:OSI七层模型:apple:2.3 :apple:TCP/IP模型:apple:2.4 :apple:TCP/IP模型与操作系统的关系:apple: 3 :peach:网络传输基本流程:peach:4 :peach:网…

MybatisPlus存在 sql 注入漏洞(CVE-2023-25330)解决办法

首先我们了解下这个漏洞是什么&#xff1f; MyBatis-Plus TenantPlugin 是 MyBatis-Plus 的一个为多租户场景而设计的插件&#xff0c;可以在 SQL 中自动添加租户 ID 来实现数据隔离功能。 MyBatis-Plus TenantPlugin 3.5.3.1及之前版本由于 TenantHandler#getTenantId 方法在…

HOT78-跳跃游戏

leetcode原题链接&#xff1a;跳跃游戏 题目描述 给定一个非负整数数组 nums &#xff0c;你最初位于数组的 第一个下标 。数组中的每个元素代表你在该位置可以跳跃的最大长度。 判断你是否能够到达最后一个下标。 示例 1&#xff1a; 输入&#xff1a;nums [2,3,1,1,4] 输…