RSA算法与错误敏感攻击

参见《RSA 算法的错误敏感攻击研究与实践》

RSA 算法简介

   RSA 算法原理:
1) RSA 算法密钥产生过程
(1)系统随机产生两个大素数 p p p q q q,对这两个数据保密;
(2)计算 n = p × q n = p \times q n=p×q (公开),计算欧拉函数 ϕ ( n ) = ( p − 1 ) ( q − 1 ) \phi(n) = (p-1)(q-1) ϕ(n)=(p1)(q1)(保密);
(3)随机选择满足 g c d ( e , ϕ ( n ) ) = 1 gcd(e, \phi(n) )=1 gcd(e,ϕ(n))=1 e ( 1 < e < ϕ ( n ) ) e (1 < e < \phi(n) ) e(1<e<ϕ(n)) 作为公钥,则加密密钥 ( e , n ) (e,n) (e,n)
(4)计算私钥 d d d,使其满足 e d ≡ 1 ( m o d    ϕ ( n ) ) ed \equiv 1(\mod \phi(n)) ed1(modϕ(n)),私钥为 ( d , n ) (d,n) (d,n)
2)RSA 加解密过程
   首先,将需要加密的明文信息转化为二进制数,然后将其进行分组(分组长度根据实际需要来定),最后对每个分组进行加解密操作:
(1) 加密运算:使用公钥 e e e 和要加密的明文 m m m,进行 c = m e m o d    n c = m^e \mod n c=memodn 运算即得密文;
(2)解密运算:使用私钥 d d d 和要解密的密文 c c c, 进行 m = c d m o d    n m = c^d \mod n m=cdmodn 运算即得明文。

针对 RSA 算法的侧信道攻击

   目前智能卡的密码芯片很多都采用了RSA算法来保护用户个人信息。然而,如果在智能卡运行过程中没有施以任何保护,攻击者则可以轻而易举地利用侧信道信息来破译密钥。其中功耗攻击和故障攻击作为侧信道攻击中最为有效的两种攻击方法,对智能卡安全而言是一个巨大的挑战。实施功耗攻击首先要获取密码芯片运行过程中的功耗曲线,然后通过分析找到功耗曲线和密钥之间的相关性,以此来破译算法密钥;故障攻击首先要确定注入错误的时间点,然后在该点注入足够大的错误使得密码芯片运算发生错误,最后利用得到的错误输出和算法特性等来获取密钥相关信息。

功耗攻击

   Kocher等人发现可以利用密码芯片运行过程中的功耗曲线来破译加密算法密钥。简单功耗攻击正是基于这个特性,其只需获得密码芯片完整运行一次的功耗曲线就可以从中得出算法密钥。
   智能卡在执行加解密算法时,电路会根据算法的运行步骤而处于不同的状态,由于电路所处的状态不同会导致电路运行过程中的消耗功耗不同,例如当设备处于存储数据和算术运算时设备所需的功耗是不同的。SPA核心思想就是利用获取得到的功耗曲线,通过分析将电路所处的状态区分开来,从而得到算法实施过程的各个时间点,推测实际运算过程涉及到的秘密参数,以此来破译算法密钥。
  对于RSA算法来说,在加解密过程中进行最多次的是模幂运算。SPA利用这个特性,通过分析模幂运算过程中的功耗曲线来确定参与运算的指数位为1或0.其中L-R模幂算法尤为明显。L-R模幂算法如下所示:

L-R模幂算法

  在上述算法步骤2.2中,当 e i = 1 e_i=1 ei=1 时, s < − s ⋅ c m o d    n s <- s\cdot c \mod n s<scmodn 就会被执行一次;当 e i = 0 e_i = 0 ei=0 时,则算法直接跳过步骤2.2。基于这一点,密钥位的不同使得算法执行不同的分支,对应的,攻击者可以从功耗曲线上看出算法执行的不同路径。因此通过检测一次完整的RSA解密过程,获取功耗曲线,从功耗曲线上就可以推测出算法的具体实现过程,从而就可以对密钥进行重构。
  从上述分析来看,采用SPA攻击RSA具有简单、高效的特点。针对SPA攻击方式的特征,其防御工作可以从几个方面展开:使攻击者不能够正确区分模乘和摸平方操作;消除算法中不平衡操作,可以对每一个比特都进行模乘和摸平方操作;在主要的运算中插入伪指令以消除或减小中间数据和功耗轨迹之间的相关性;阻止能量消耗的采集。近几年来,密码学界对功耗分析的威胁性越来越重视,并针对其防御投入很大的人力和物力,不断地提出有效的防御方案,目前具体有以下几种防护措施:减小信号强度、引入随机噪声、随机过程中断、非线性密钥升级

故障攻击

  故障攻击是指通过利用物理方法(如电磁辐射、X光、微探测或切断路线)干扰密码信息的正常工作,使密码芯片产生错误的操作,然后对密码芯片的输出进行收集和分析,从而可以得到芯片中的密钥信息。目前有很多成熟的故障攻击方法。
  针对RSA,Yen提出了一种新的思想,即,安全错误攻击(Safe-Error Attack),其主要思想如图所示:

安全错误攻击
  RSA算法执行了两个分支,分别是 operation1 和 operation2,运算完成后将结果存储在变量C当中。攻击者可以在算法执行者两个分支运算时注入错误,由于算法对错误做出了不同的反应,左边的计算没有受到影响,输出了正确的结果 C;而错误注入对 operation2产生了影响使其输出了错误的结果 C,因此根据这二者的不同,攻击者可以很直观地分辨出算法执行了哪个步骤,从而获取有关密钥的信息。
  为了防范SPA,L-R模幂算法在密钥为0时加入了虚假操作,该操作对最终的结果没有任何影响。Joye等提出了C-safe error攻击,该攻击方式正是利用上述特点,在密码芯片进行模幂运算时,注入错误的时钟频率,使得本步的计算发生错误,然后继续运算,将得到的结果和正确的输出进行比较,如果二者一致,则说明本步的密钥为0,反之,则为1。如此反复,直到得到正确的密钥。为了防御 C-safe error攻击,Joye等提出了Powering Ladder 模幂算法。

错误敏感攻击

   在FSA过程中,除了错误密文之外,攻击者还可以利用错误敏感信息。所谓错误敏感就是将错误注入到密码芯片中而恰使其好产生错误密文时的状态。当攻击者逐渐加大故障注入的强度时,可以辨别出故障开始出现和故障变得稳定时的临界状态。类似于大多数侧信道攻击,如果错误敏感信息和敏感数据之间的关系是已知的,那么FSA可以得到密钥的相关信息。
   由于在密码芯片中电路信号的转换是数据依赖的,因此可以肯定的是错误敏感信息也是数据依赖的。数据依赖的基本概念就是指电路的输入信号对电路的运行时间起确定性左右。下面使用与门、或门和异或门作为例子来解释信号时序延迟的数据依赖的一般机制。如下图所示:

数据依赖性的例子
   图中 T X T_X TX 表示信号 X X X 的延迟。对与门(a),假设 T A < T B T_A < T_B TA<TB,即信号A到达与门的速度的快于信号B。如果信号A为0,则信号C的延时取决于信号A,即 T C = T A + T A N D T_C = T_A + T_{AND} TC=TA+TAND,其中 T A N D T_{AND} TAND为与门的延时;反之,如果信号A为1,信号C的值取决于信号B,即, T C = T B + T A N D T_C = T_B + T_{AND} TC=TB+TAND。即,信号A为1,则输出结果会更慢。
   类似的,对于或门(b),仍然假设 T A < T B T_A < T_B TA<TB。如果信号A为1, T C = T A + T O R T_C = T_A + T_{OR} TC=TA+TOR;反之, T C = T B + T O R T_C = T_B + T_{OR} TC=TB+TOR。即,信号A为1时,输出会更快。由以上分析可知,一旦电路结构确定,数据依赖性的错误敏感度也会被固定。攻击者可以利用电路结构来分析得到数据依赖性,以此来获得错误敏感信息。
   相较于差分故障攻击攻击,FSA攻击不需要通过假设只有几个比特或将注入的故障限制在一个小的子空间内。即使DFA可能只需更少的错误注入次数就可以获得密钥,但是它要求攻击者必须拥有将错误注入指定位置的能力。虽然攻击者可能拥有整个攻击设备,可以对设备进行多次非入侵式的注入故障,但是它需要有大量的知识来注入预期的故障。此外,FSA所需要的信息不包括错误的输出信息。因此,对于检测到故障即停止计算的密码设备,FSA的攻击仍然是一个潜在的威胁。
   从L-R模幂算法的实现中可以看到,只要能够正确区分算法执行的是模乘操作还是模平方操作,就可以得到该比特位为1还是0。针对该特性,FSA攻击可以从模乘操作和模平方操作对错误时钟频率的不同敏感度入手,将错误时钟频率作为敏感信息来区分本步的具体操作,从而破译私钥。
   RSA在智能卡中的应用十分广泛,研究该类智能卡的错误敏感攻击和针对性的防御措施具有重要的意义。

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

springboot集成es 插入和查询的简单使用

第一步&#xff1a;引入依赖 <dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-data-elasticsearch</artifactId><version>2.2.5.RELEASE</version></dependency>第二步&#xff1a;…

uniapp微信小程序使用stomp.js实现STOMP传输协议的实时聊天

简介&#xff1a; 原生微信小程序中使用 本来使用websocket&#xff0c;后端同事使用了stomp协议&#xff0c;导致前端也需要对应修改。 如何使用 1.yarn add stompjs 2.版本 “stompjs”: “^2.3.3” 3.在static/js中新建stomp.js和websocket.js&#xff0c;然后在需要使用…

Nginx详解 三:高级配置

文章目录 1. 网页的状态页2. Nginx第三方模块2.1 echo模块 3. 变量3.1 内置变量3.1.1 示例 3.2 自定义变量3.2.1 自定义访问日志3.2.2 自定义json 格式日志 3.4 Nginx压缩功能 4. HTTPS4.1 Nginx的HTTPS工作原理4.2 启用功能模块的配置过程 5、自定义图标 1. 网页的状态页 基于…

深度学习在自然语言处理中的十大应用领域

文章目录 1. 机器翻译2. 文本分类3. 命名实体识别4. 问答系统5. 文本生成6. 情感分析7. 语言生成与处理8. 信息检索与摘要9. 文本纠错与修复10. 智能对话系统总结 &#x1f389;欢迎来到AIGC人工智能专栏~深度学习在自然语言处理中的十大应用领域 ☆* o(≧▽≦)o *☆嗨~我是IT陈…

【Kali Linux高级渗透测试】深入剖析Kali Linux:高级渗透测试技术与实践

&#x1f4d5;作者简介&#xff1a;热爱跑步的恒川&#xff0c;致力于C/C、Java、Python等多编程语言&#xff0c;热爱跑步&#xff0c;喜爱音乐的一位博主。 &#x1f4d7;本文收录于恒川的日常汇报系列&#xff0c;大家有兴趣的可以看一看 &#x1f4d8;相关专栏C语言初阶、C…

NPM 常用命令(一)

目录 1、npm 1.1 简介 1.2 依赖性 1.3 安装方式 2、npm access 2.1 命令描述 2.2 详情 3、npm adduser 3.1 描述 4、npm audit 4.1 简介 4.2 审计签名 4.3 操作示例 4.4 配置 audit-level dry-run force json package-lock-only omit foreground-scripts …

Ubuntu 下安装Qt5.12.12无法输入中文解决方法

Ubuntu 下安装Qt5.12.12无法输入中文解决方法 一&#xff0c;环境&#xff1a; &#xff08;1&#xff09;VMware Workstation 15 Pro &#xff08;2&#xff09;Ubuntu 20.04 &#xff08;3&#xff09;Qt 5.12.12 64bits &#xff08;4&#xff09;Qt Creator 5.0.2 &#…

浅析Redis(1)

一.Redis的含义 Redis可以用来作数据库&#xff0c;缓存&#xff0c;流引擎&#xff0c;消息队列。redis只有在分布式系统中才能充分的发挥作用&#xff0c;如果是单机程序&#xff0c;直接通过变量来存储数据是更优的选择。那我们知道进程之间是有隔离性的&#xff0c;那么re…

[第七届蓝帽杯全国大学生网络安全技能大赛 蓝帽杯 2023]——Web方向部分题 详细Writeup

Web LovePHP 你真的熟悉PHP吗&#xff1f; 源码如下 <?php class Saferman{public $check True;public function __destruct(){if($this->check True){file($_GET[secret]);}}public function __wakeup(){$this->checkFalse;} } if(isset($_GET[my_secret.flag]…

用AI + Milvus Cloud搭建着装搭配推荐系统教程

以下函数定义了如何将图像转换为向量并插入到 Milvus Cloud 向量数据库中。代码会循环遍历所有图像。(注意:如果需要开启 Milvus Cloud 全新特性动态 Schema,需要修改代码。) 查询向量数据库 以下代码演示了如何使用输入图像查询 Milvus Cloud 向量数据库,以检索和上传…

华为OD机试 - 符合要求的元组的个数 - 回溯(Java 2023 B卷 100分)

目录 一、题目描述二、输入描述三、输出描述四、解题思路五、Java算法源码六、效果展示1、输入2、输出3、说明 华为OD机试 2023B卷题库疯狂收录中&#xff0c;刷题点这里 一、题目描述 给定一个整数数组nums、一个数字k&#xff0c;一个整数目标值target&#xff0c;请问nums中…

null和undefined区别

1.undefined&#xff0c;表示无值。 比如下面场景&#xff1a; a. 变量被声明了&#xff0c;但是没有被赋值&#xff1b; b. 调用函数的时候&#xff0c;应该给函数传参却没有给函数传这个参数打印出来就是 undefined&#xff1b; c. 访问一个对象中没有的属性&#xff1b;…

【LeetCode-中等题】24. 两两交换链表中的节点

文章目录 题目方法一&#xff1a;递归方法二&#xff1a;三指针迭代 题目 方法一&#xff1a;递归 图解&#xff1a; 详细版 public ListNode swapPairs(ListNode head) {/*递归法:宗旨就是紧紧抓住原来的函数究竟返回的是什么?作用是什么即可其余的细枝末节不要细究,编译器…

实战系列(一)| Dubbo和Spring Cloud的区别,包含代码详解

目录 1. 概述2. 核心功能3. 代码示例4. 适用场景 Dubbo 和 Spring Cloud 都是微服务架构中的重要框架&#xff0c;但它们的定位和关注点不同。Dubbo 是阿里巴巴开源的一个高性能、轻量级的 RPC 框架&#xff0c;主要用于构建微服务之间的服务治理。而 Spring Cloud 是基于 Spri…

数据结构与算法基础-学习-31-交换排序之冒泡排序、快速排序

排序的其他相关知识点和源码分享可以参考之前的博客&#xff1a; 《数据结构与算法基础-学习-30-插入排序之直接插入排序、二分插入排序、希尔排序》 一、交换排序基本思想 两两比较&#xff0c;如果发生逆序则交换位置&#xff0c;直到所有数据记录都排好序为止。 二、冒…

无涯教程-Android - Style Demo Example函数

下面的示例演示如何将样式用于单个元素。让我们开始按照以下步骤创建一个简单的Android应用程序- 步骤说明 1 您将使用Android Studio IDE创建一个Android应用程序,并在 com.example.saira_000.myapplication 包下将其命名为 myapplication ,如中所述您好世界Example一章。 2 …

常用Web漏洞扫描工具汇总(持续更新中)

常用Web漏洞扫描工具汇总 常用Web漏洞扫描工具汇总1、AWVS&#xff0c;2、OWASP Zed&#xff08;ZAP&#xff09;&#xff0c;3、Nikto&#xff0c;4、BurpSuite&#xff0c;5、Nessus&#xff0c;6、nmap7、X-ray还有很多不是非常知名&#xff0c;但可能也很大牌、也较常见的。…

el-date-picker限制选择的时间范围

<el-date-pickersize"mini"v-model"dateTime"value-format"yyyy-MM-dd HH:mm:ss"type"datetimerange"range-separator"~"start-placeholder"开始日期"end-placeholder"结束日期":picker-options&quo…

Fooocus启动时modules报错的解决方法

原理&#xff1a;是由于其他程序的安装导致modules的版本不对&#xff0c;先卸载现有版本&#xff0c;再运行run.bat让其自动安装响应的modules版本。 1、cmd运行windows dos终端。 2、将Fooocus_win64_1-1-1035文件夹备份&#xff0c;rename为Fooocus_win64_1-1-1035backup文…

【ES6】Promise的入门介绍

Promise 是 JavaScript 中的一个对象&#xff0c;用于处理异步操作。Promise 对象代表一个最终可能完成&#xff08;并得到结果&#xff09;或失败&#xff08;并被拒绝&#xff09;的操作&#xff0c;以及其结果的值。 一个 Promise 有三种状态&#xff1a; Pending&#xf…