第四十五个知识点:描述一些对抗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. accelerate

    accelerate accelerare, accumulare和accurate共享一个含义为to的词根,后半截分别是:fast, pile up, care (关心则精确). 近/反义词: ex ...

  2. flink---实时项目--day02-----1. 解析参数工具类 2. Flink工具类封装 3. 日志采集架构图 4. 测流输出 5. 将kafka中数据写入HDFS 6 KafkaProducer的使用 7 练习

    1. 解析参数工具类(ParameterTool) 该类提供了从不同数据源读取和解析程序参数的简单实用方法,其解析args时,只能支持单只参数. 用来解析main方法传入参数的工具类 public c ...

  3. flink-----实时项目---day04-------1. 案例:统计点击、参与某个活动的人数和次数 2. 活动指标多维度统计(自定义redisSink)

    1. 案例 用户ID,活动ID,时间,事件类型,省份 u001,A1,2019-09-02 10:10:11,1,北京市 u001,A1,2019-09-02 14:10:11,1,北京市 u001, ...

  4. jenkins之代码回滚

    #:通过传参数方式 #:保存后就会看到这样 #;:我们在jenkins服务器写一个脚本 root@ubuntu:~# mkdir /root/script/web1 -pv mkdir: create ...

  5. Advanced C++ | Conversion Operators

    In C++, the programmer abstracts real world objects using classes as concrete types. Sometimes it is ...

  6. Linux学习 - 文件特殊权限

    一.SUID权限(只针对文件) 只有可执行的二进制程序才能设定SUID权限 命令执行者要对该程序拥有x(执行)权限 1 拥有SUID的文件 /usr/bin/passwd 2 功能: 命令执行者(其他 ...

  7. Linux 易错小结

    修改文件夹(递归修改)权限 chmod -R 777 /html Linux查看进程的4种方法 第一种: ps aux ps命令用于报告当前系统的进程状态.可以搭配kill指令随时中断.删除不必要的程 ...

  8. MySQL索引及性能优化分析

    一.SQL性能下降的原因 查询语句问题,各种连接.子查询 索引失效(单值索引.复合索引) 服务器调优及各个参数设置(缓冲.线程池等) 二.索引 排好序的快速查找数据结构 1. 索引分类 单值索引 一个 ...

  9. 【Java 8】函数式接口(一)—— Functional Interface简介

    什么是函数式接口(Functional Interface) 其实之前在讲Lambda表达式的时候提到过,所谓的函数式接口,当然首先是一个接口,然后就是在这个接口里面只能有一个抽象方法. 这种类型的接 ...

  10. [BUUCTF]PWN——xdctf2015_pwn200

    xdctf2015_pwn200 附件 步骤 例行检查,32位程序,开启了nx保护 本地试运行一下程序,看看大概的情况 32位ida载入,习惯性的检索程序里的字符串,没有发现什么铭感的地方,直接看ma ...