第四十五个知识点:描述一些对抗RSA侧信道攻击的基础防御方法

原文地址:http://bristolcrypto.blogspot.com/2015/08/52-things-number-45-describe-some-basic.html

为了让这篇文章保持简单,我们将会我们将讨论所谓的“香草”RSA(在加密中不使用随机性),并强调少量潜在的侧通道攻击和对策。

让我们回顾一下简单的RSA加密方案。

密钥生成:选择一对秘密的素整数\(p\)和\(q\),然后计算模\(N = pq\)。一个整数\(3 \le e \le \phi(N)\),和\(\phi(N)\)互质。然后公钥对就是\((N,e)\)。私钥式独一无二的整数\(3 \le d \le \phi(N)\),使得\(ed=1 \mod \phi(N)\)。

加密一个消息\(m \in Z_N\),我们能计算\(m^e \mod N\)。

解密一个私钥\(c \in Z_N\),我们能计算\(c^d \mod N\)。

一个确定密钥的SPA类型的攻击

我们首先给出一个示例,说明如何在解密操作期间泄漏关于密钥d的信息。一个典型的实现指数幂乘法的方式就是分支程序。例如,乘加算法能有效的计算一个被二进制表达的幂乘操作。

假如说\(d = \Sigma_{0 \le i \le n}b_i2^i\),其中\(b_i \in \{0,1\}\)。那么,

\[c^d = \Phi_{0 \le i \le n}c^{b_i2^i}
\]

那么我们就可以通过下面的算法来计算\(c^d的值了\)。

  • \(ANS \leftarrow 1\)
  • \(fac \leftarrow c\)
  • \(For 0 \le i \le n\),do
    • \(if \space b_i = 1\)

      • \(ANS \leftarrow ANS \times fac\)
      • \(fac \leftarrow fac^2\)
    • \(Else,\)
      • \(fac \leftarrow fac^2\)
  • \(return ANS\)

算法的行为取决于每个\(b_i\)是0还是1。因此,如果使用这种算法解密RSA密文,它所花费的时间或它的功耗可以显示每一位\(b_i\)的值,从而显示密钥d。这将是一种spa式的攻击,因为只需要一个跟踪。

为了防止这种攻击,必须使算法的两个分支在攻击者看来是相同的,即使平方和乘法算法的两个分支花费相同的时间运行或消耗相同的能量。

一个SPA类型对明文的攻击

上面展示了解密过程中如何危害密钥。但是攻击者可能对特定的明文感兴趣,\(m\)(毕竟,加密被用于设计保持消息机密)。同样,如果加密操作是一个依赖于m值的分支程序,那么单个加密的运行时或功耗可能会在SPA类型攻击中泄漏关于m的信息。特别要注意的是,必须在加密中执行模操作。在大多数实现中,不是在取幂结束时对一个非常大的整数进行单个约简,而是在取幂算法中进行许多次模操作,以保持所涉及的数字(相对)较小。

作为一个例子,我们假设在循环中执行下面的操作:

  • while \(ANS > N\)

    • \(ANS \leftarrow ANS-N\)

在这里,因为机密的时刻,指数是已知的,根据运行所需的时间和消耗的电量泄露关于m的基本信息(参见David关于蒙哥马利算法攻击的文章)。

再一次,以防止这种攻击,我们必须确保我们的使用相同的时间和消耗相同的功率来减少中间值模N,不管他们是什么大小。(由于我们知道底的精确指数和取值范围,所以可以很容易地找到上限)。

防止对密钥进行DPA类型的攻击

即使我们模糊了依赖于d的解密中的任何分支,在执行解密的幂运算时执行的操作的精确细节仍然依赖于该指数(以一种不太明显的方式)。:因此,在多次解密之后,可能会出现解密密钥与操作持续时间或功耗之间的统计关系。因此,我们还需要防止更微妙的dpa风格的攻击,即攻击者对大量跟踪使用统计技术来测试关于秘密密钥的假设。

要做到这一点,我们必须消除密钥和每次执行的计算之间的直接依赖关系。这涉及到盲处理,即在不影响结果的情况下将一些随机噪声注入到求幂运算中。在解密中,我们引入随机性,当\(d\)的在\(Z_{\phi(N)}\)中\(e\)的逆,我们能够加或者减\(\phi(N)\),这样结果也不会改变。因此解密\(c \in Z_N\),选择一个随机的\(r \in Z\)然后计算\(d^{'} = d + r\phi(N)\)。然后计算消息\(c^{d^{'}}\)也和\(c^d \mod N\)相同。关键是加法通常不是一个分支操作,所以增加\(r\phi(N)\),\(d\)不会泄漏在一个跟踪信息,并使用一个新的随机r为每个解密防止DPA-style攻击。

Coppersmith's的SPA类型攻击来确定明文

我们使用一个特殊但是有趣的攻击来结束这篇文章,这个攻击只会发生在e很小的时候,例如\(e=3\)是在加密时刻为了效率的一个选择。这有一个定理叫史密斯定理,这里会有介绍,一个攻击者能有效率的找到所有的小整数的解:\(f(x)=0 \mod N\),其中\(x < N^{1/e}\)。如果\(m<N^{1/e}\),那么直接就通过开方计算出来。但是如果\(m\)的某些位泄露,那么我们就可以写成\(m = m_k+m_u\)。这样我们就有多项式\(f(X) = (m_k+X)^e\)。因此我们需要确保\(m\)的位数在加密过程中不被泄露。

为了对抗这种攻击,我们再次使用了盲方法:我们在取幂之前给m引入一些随机性,然后再将其移除。简单来说,我们取一个随机数\(r\),然后计算\(rm \mod N\),然后是\((rm)^e \mod N\),最后计算\(r^{\phi(N)-e}\)。显然,密文是一样的,如果没有盲方法,但泄漏的指数运算现在是独立于m的。

这篇文章应该让您了解可以安装在加密方案上的那种侧通道攻击,以及实现可以避免它们的方式。

第四十五个知识点:描述一些对抗RSA侧信道攻击的基础防御方法的更多相关文章

  1. 第四十九个知识点:描述在IPsec和TLS后的基本想法

    第四十九个知识点:描述在IPsec和TLS后的基本想法 网络安全协议(Internet Protocol Security,IPsec)和安全传输层协议(Transport Layer Securit ...

  2. 第三十五个知识点:给针对ECDLP问题的Pollard rho,Pollard "Kangaroo",parallel Pollard rho攻击的一个粗略的描述

    第三十五个知识点:给针对ECDLP问题的Pollard rho,Pollard "Kangaroo",parallel Pollard rho攻击的一个粗略的描述 我们的目标是对任 ...

  3. Gradle 1.12用户指南翻译——第四十五章. 应用程序插件

    本文由CSDN博客貌似掉线翻译,其他章节的翻译请参见: http://blog.csdn.net/column/details/gradle-translation.html 翻译项目请关注Githu ...

  4. 孤荷凌寒自学python第四十五天Python初学基础基本结束的下阶段预安装准备

     孤荷凌寒自学python第四十五天Python初学基础基本结束的下阶段预安装准备 (完整学习过程屏幕记录视频地址在文末,手写笔记在文末) 今天本来应当继续学习Python的数据库操作,但根据过去我自 ...

  5. 第十五个知识点:RSA-OAEP和ECIES的密钥生成,加密和解密

    第十五个知识点:RSA-OAEP和ECIES的密钥生成,加密和解密 1.RSA-OAEP RSA-OAEP是RSA加密方案和OAEP填充方案的同时使用.现实世界中它们同时使用.(这里介绍的只是&quo ...

  6. 第二十五个知识点:使用特殊的素数定义$GF(p)$和$GF(2^n)$的方法。

    第二十五个知识点:使用特殊的素数定义\(GF(p)\)和\(GF(2^n)\)的方法. 在我们之前看到的博客中,当实现密码学方案时,一个最频繁调用的操作就是模运算.不幸的是,尽管模块化的使用非常广泛, ...

  7. NeHe OpenGL教程 第四十五课:顶点缓存

    转自[翻译]NeHe OpenGL 教程 前言 声明,此 NeHe OpenGL教程系列文章由51博客yarin翻译(2010-08-19),本博客为转载并稍加整理与修改.对NeHe的OpenGL管线 ...

  8. SQL注入之Sqli-labs系列第四十一关(基于堆叠注入的盲注)和四十二关四十三关四十四关四十五关

    0x1普通测试方式 (1)输入and1=1和and1=2测试,返回错误,证明存在注入 (2)union select联合查询 (3)查询表名 (4)其他 payload: ,( ,( 0x2 堆叠注入 ...

  9. “全栈2019”Java第四十五章:super关键字

    难度 初级 学习时间 10分钟 适合人群 零基础 开发语言 Java 开发环境 JDK v11 IntelliJ IDEA v2018.3 文章原文链接 "全栈2019"Java第 ...

随机推荐

  1. java.sql.SQLException: Cannot create com._51doit.pojo.User: com._51doit.pojo.User Query: select * from user where username = ? and password = ? Parameters: [AA, 123]

    在从数据库中查询数据,并存入javabean中去时,报这个错误 原因:在建立User类去存储信息时没有创建无参构造方法,创建一个无参构造方法即可

  2. 关于ai算法的一个点子

    长久以来,一直想要有自己的原生算法. 今天灵感图然来了: 想到, 一个事务不但要看它本身,也要看欣赏它的人. 要研究两个方面. 你要研究音乐,也要研究欣赏音乐的人. 人之所以会欣赏音乐,而牛不可以(对 ...

  3. Gradle—Android配置详解

    参考[1]彻底弄明白Gradle相关配置       [2]Android Studio gradle配置详解

  4. Give You My Best Wishes

    亲耐滴IT童鞋们: 感谢大家一直以来的支持,因为有你们的支持,才有我这么"拼"的动力!!爱你们哟 OC的学习已经告一段落,希望大家通过阅读这几篇浅薄的随笔,能够寻找到解决问题的方法 ...

  5. OceanBase 2.x体验:推荐用DBeaver工具连接数据库

    Original MQ4096 [OceanBase技术闲谈](javascript:void(0) 2020-01-15 OceanBase 2.x体验:推荐用DBeaver工具连接数据库 Ocea ...

  6. maven依赖对zookeeper的版本冲突问题

    我用的是springcloudAlibaba+zookeeper zookeeper下载后 1,修改配置文件,conf目录下的zoo_sample.cfg修改为zoo.cfg. 2,打开zoo.cfg ...

  7. 【C++】结构体/结构体数组/结构体指针/结构体嵌套/函数参数/const

    一.结构体声明 struct Student { //成员列表 string name; int age; int score; }; //s3;定义时直接声明 int main() { struct ...

  8. HashMap的putAll方法介绍说明

    jdk1.8 使用putAll时,新map中的值仅为旧map值所对应对象的引用,并不会产生新对象. 如下,使用for循环赋值! public void putAll(Map<? extends ...

  9. Java编程思想—读书笔记(更新中)

    第1章 对象导论 1.4 被隐藏的具体实现 访问控制的原因: 让客户端程序员无法触及他们不应该触及的部分(不是用户解决特定问题所需的接口的一部分) 允许库设计者可以改变类内容的工作方式而不用担心会影响 ...

  10. LuoguP5006 [yLOI2018] 大美江湖 题解

    Content 题意实在是太过复杂了,因此请回到题面查看. Data Range 本部分和 Solution 部分变量的含义同题面. \(1\leqslant n,m\leqslant 100,0\l ...