私钥加密与伪随机性 第二部分

  1. 本节课学习另外两种私钥加密安全理论:选择明文攻击(CPA)下不可区分性,选择密文攻击(CCA)下不可区分性;
  2. 目录:流加密与CPA,CPA安全加密方案,操作模式,CCA安全加密方案
  3. 流加密方案(Stream Cipher)
  • 思路:受一次一密方案的启发
  • 流加密方案:通过与伪随机的比特流(密钥流)异或来加密
  • 多个消息:拼成一个消息
  • 密钥流:由一个变长的伪随机生成器产生
  • 优点:比分组密码更快
  • 缺点:难以做到安全
  1. 采用流加密方案的安全多重加密
  • 同步模式:用一个流中不同部分分别加密各个消息;
  • 异步模式:以密钥和初始向量一起作为输入来产生流,每个明文的加密采用相同的密钥和不同的初始向量
  • 初始向量(Initial Vector)SM2 私钥加密_网络是随机选取的并且是公开的;其生成是随机的并不受控制,但生成后并不保密;密钥的生成是随机的并不受控制,但生成后也要保密。
  • 两种模式差异:
  • 同步模式适合持续通信场景,例如语音;异步模式适合间断通信场景,例如即时消息。
  1. 流密码的安全性
  1. 现状:没有标准化和流行的方案,安全性仍有疑问,例如在802.11中WEP协议的RC4,线性反馈移位寄存器(Linear Feedback Shift Registers);
  2. 警告:不要使用任何流加密方案,如果一定需要的话,采用由分组加密方案构造的。
  3. eStream项目致力于设计安全的流密码
  1. 相关密钥:真实世界例子
  • 用于多重加密的密钥(初始向量和密钥对)必须是独立的。否则,前面的攻击就会生效;
  • 对于802.11b WEP的若干攻击:
  • WEP为异步模式,SM2 私钥加密_安全_02
  • SM2 私钥加密_网络长度为24比特,在SM2 私钥加密_密钥流_04 16M 帧后SM2 私钥加密_网络会产生重复;
  • 在一些WiFi网卡上,在电源重启后SM2 私钥加密_网络重置为0;
  • SM2 私钥加密_安全_07. 对于RC4,在40,000帧后可以恢复 SM2 私钥加密_安全_08
  1. 多重加密(Multiple Encryptions)
  • 多个明文的加密实验SM2 私钥加密_SM2 私钥加密_09,当一次加密多个明文时,窃听者敌手能够区分出两组明文吗?
  • 一个敌手SM2 私钥加密_安全_10与一个挑战者SM2 私钥加密_安全加密_11进行3轮交互:
  1. SM2 私钥加密_安全加密_12选择两个长度相同、内容不同明文向量SM2 私钥加密_密钥流_13, SM2 私钥加密_密钥流_14,其中两个向量中同一位置的明文长度相同SM2 私钥加密_密钥流_15,发送给SM2 私钥加密_网络_16
  2. SM2 私钥加密_网络_16根据密钥生成算法生成一个新密钥SM2 私钥加密_密钥流_18,一个随机比特SM2 私钥加密_安全_19。对向量SM2 私钥加密_密钥流_20中每个明文加密 SM2 私钥加密_网络_21 得到一个密文向量 SM2 私钥加密_网络_22 ,并发送给SM2 私钥加密_安全加密_12
  3. SM2 私钥加密_安全加密_12输出对所加密明文向量的猜测SM2 私钥加密_网络_25,若SM2 私钥加密_安全_26,则SM2 私钥加密_安全加密_12成功;否则,失败;
  • 这与之前的单个消息不可区分实验类似的,区别在于用同一个密钥加密的多个消息。敌手可以获得多个明文的密文,比单个明文不可区分实验中的敌手有更强的能力。
  1. 多重加密安全定义
  • SM2 私钥加密_网络_28窃听者出现时不可区分的多重加密方案,如果任意PPT的敌手SM2 私钥加密_安全加密_29, 存在可忽略的函数SM2 私钥加密_安全_30
    SM2 私钥加密_网络_31
  • 迄今学习的密码学方案是否是多重加密不可区分的?
  1. 攻击确定性多重加密方案
  • 问题:如果一个加密方案中加密算法是确定性的,即同一个明文会被同一个密钥加密成同一个密文,那么该加密方案是多重加密安全的吗?
  • 攻击:对于确定性加密方案,敌手可以构造SM2 私钥加密_SM2 私钥加密_32 并且 SM2 私钥加密_密钥流_33,然后当SM2 私钥加密_密钥流_34,输出 SM2 私钥加密_安全_35,否则 SM2 私钥加密_安全加密_36
  1. 选择明文攻击(Chosen-Plaintext Attacks (CPA)
  • 敌手具有获得其所选择明文对应的密文的能力。
  • 第二次世界大战中的例子:美国海军密码分析学家相信密文“AF”表示日语中的“中途岛”;但美国将军不认为中途岛会遭到攻击;美国海军密码分析学家发送了一个明文,中途岛淡水供给不足;日本军队截获的明文,并发送了一段密文,“AF”淡水不足;美国军队派出三艘航空母舰并且取胜。
  • 这里例子里,美国海军密码分析学家选择了明文并得到了密文。
  1. CPA安全实验
  • CPA不可区分实验 SM2 私钥加密_网络_37:
  1. 挑战者生成密钥 SM2 私钥加密_密钥流_18;(为了下一步的加密预言机)
  2. SM2 私钥加密_安全加密_12 被给予输入 SM2 私钥加密_SM2 私钥加密_40 和对加密函数 SM2 私钥加密_安全_41预言机访问(oracle access) SM2 私钥加密_网络_42 ,输出相同长度 SM2 私钥加密_安全_43
  3. 挑战者生成随机比特 SM2 私钥加密_安全_19,将挑战密文 SM2 私钥加密_密钥流_45 发送给 SM2 私钥加密_安全加密_12
  4. SM2 私钥加密_安全加密_12 继续对 SM2 私钥加密_安全_41的预言机的访问,输出SM2 私钥加密_网络_25;如果SM2 私钥加密_密钥流_50,则SM2 私钥加密_安全加密_12成功SM2 私钥加密_SM2 私钥加密_52,否则 0。
  • 该实验与窃听者不可区分实验的区别在于,敌手可访问加密预言机,在实验过程中始终可以(产生两个明文阶段,猜测被加密明文阶段)获得任意明文被同一密钥加密的密文,而且密文是逐个获得,可以根据之前的明文和密文对来“适应性地”构造新的查询。
  • CPA敌手比多重加密的敌手更“强大”,因为多重加密敌手是可以一次性地获得一组密文,而CPA敌手可以“多次适应性地”获得密文。
  1. CPA安全
  • SM2 私钥加密_网络_28 是CPA不可区分加密方案 (CPA安全的),如果任意概率多项式时间算法SM2 私钥加密_安全加密_29,存在可忽略的函数SM2 私钥加密_安全_30使得,
    SM2 私钥加密_安全加密_56
  • 定理:CPA安全也是多重加密安全的。证明略。直觉上,CPA敌手比多重加密敌手更强大。
  • 之前的方案也难以实现CPA安全;
  • 多重加密安全意味着CPA安全?(作业)
  1. 伪随机函数(Pseudorandom Function)概念
  • 为了实现CPA安全,需要新的数学工具为加密提供随机性,为此引入伪随机函数(PRF),是对伪随机生成器(PRG)的泛化:PRG从一个种子生成一个随机串,PRF从一个key生成一个函数;
  • 带密钥的函数Keyed functionSM2 私钥加密_密钥流_57
  • SM2 私钥加密_安全加密_58, SM2 私钥加密_网络_59
  • 两个输入到一个输出,看上去像,但不是加密函数;输入key,得到一个一输入到一输出的函数;
  • 查表Look-up tableSM2 私钥加密_SM2 私钥加密_60: SM2 私钥加密_密钥流_61 需要多少比特信息存储?
  • 查表是一个直接描述输入与输出间映射的表格,一个条目对应一个输入与一个输出;当该映射是随机产生的,是一个真随机函数;
  • 函数族Function familySM2 私钥加密_安全_62: 包含所有函数 SM2 私钥加密_密钥流_61. SM2 私钥加密_安全_64
  • 一个PRF是函数族中一个子集,key确定下的PRF是函数族中一个元素,一个查表是函数族中一个元素;
  • 长度保留Length Preserving: SM2 私钥加密_SM2 私钥加密_65;密钥长度与函数输入、输出长度相同为SM2 私钥加密_密钥流_66;没有特殊说明时,只讨论长度保留的函数;
  1. 伪随机函数定义
  • 直觉上,一个PRF生成的带密钥的函数与从函数族中随机选择的真随机函数(查表)之间是不可区分的;然而,一个真随机函数具有指数长度,无法“预先生成”,只能“on-the-fly”的使用,引入一个对函数SM2 私钥加密_密钥流_67的确定性的预言机访问(oracle access)SM2 私钥加密_SM2 私钥加密_68
  • 一个带密钥的函数是一个伪随机函数,对任意PPT区分器SM2 私钥加密_安全加密_69SM2 私钥加密_SM2 私钥加密_70,其中SM2 私钥加密_SM2 私钥加密_60SM2 私钥加密_安全_62中随机函数。
  • 问题一个固定长度的一次一密方案是一个PRF吗?
  • PRF和PRG的关系在后面还会学习,可以由PRG来构造PRF。
  1. PRF例题
  • 对于一个PRF,在key保密和没有预言机访问时,给指定输入,能以不可忽略的概率猜测输出相关信息吗?
  • 如果是PRF,则给出两个函数的相似性;否则,给出一个区分器可以区分出该函数;
  1. 以PRF实现CPA安全
  • 新随机串 SM2 私钥加密_网络_73,每次新生成一个随机串;
  • SM2 私钥加密_网络_74: SM2 私钥加密_密钥流_75. 长度保留;
  • SM2 私钥加密_安全加密_76: SM2 私钥加密_密钥流_77.
  • SM2 私钥加密_密钥流_78: SM2 私钥加密_安全加密_79, SM2 私钥加密_安全_80. 密文包括两部分新随机串,以及异或输出;
  • SM2 私钥加密_安全加密_81: SM2 私钥加密_密钥流_82.
  • 定理:上述方案是CPA安全的;
  1. 从PRF到CPA安全的证明
  • 思路:从PRF的区分器算法SM2 私钥加密_安全加密_83规约到加密方案敌手算法SM2 私钥加密_安全_10,区分器SM2 私钥加密_安全加密_83作为敌手SM2 私钥加密_安全_10的挑战者,敌手SM2 私钥加密_安全_10实验成功时区分器SM2 私钥加密_安全加密_83输出1。分两种情况,当输入真随机函数SM2 私钥加密_SM2 私钥加密_60时,相当于一次一密;当输入伪随机函数SM2 私钥加密_安全_90时,为加密方案。
  • 规约:SM2 私钥加密_安全加密_83输入预言机,输出一个比特;SM2 私钥加密_安全_10的加密预言机访问通过SM2 私钥加密_安全加密_83的预言机SM2 私钥加密_密钥流_67来提供,SM2 私钥加密_SM2 私钥加密_95SM2 私钥加密_安全加密_83输出1,当SM2 私钥加密_安全_10在实验中成功;
  1. 从PRF到CPA安全的证明(续)
  • 考虑真随机函数SM2 私钥加密_安全_98的情况,分析不可区分实验成功概率SM2 私钥加密_SM2 私钥加密_99。敌手SM2 私钥加密_安全加密_29访问加密预言机可以获得多项式SM2 私钥加密_SM2 私钥加密_101个明文与密文对的查询结果并得到随机串和padSM2 私钥加密_网络_102;当收到挑战密文SM2 私钥加密_SM2 私钥加密_103时,根据之前查询结果中随机串是否与挑战密文中随机串相同,分为两种情况:
  • 当有相同随机串时,根据SM2 私钥加密_安全加密_104可以得到SM2 私钥加密_网络_105SM2 私钥加密_安全加密_106,但这种情况发生的概率SM2 私钥加密_安全加密_107是可忽略的;
  • 当没有相同随机串时,输出是随机串,相当于一次一密,成功概率=1/2;
  • SM2 私钥加密_安全加密_108
  • SM2 私钥加密_网络_109
  • SM2 私钥加密_密钥流_110 根据伪随机函数定义,SM2 私钥加密_SM2 私钥加密_111
  • 小结:通过规约将SM2 私钥加密_安全加密_29的不可区分实验成功的概率与SM2 私钥加密_安全加密_113的区分器实验输出1的概率建立等式;分析输入真随机函数预言机时SM2 私钥加密_安全加密_113输出1的概率(即不可区分实验成功概率)是1/2+可忽略函数;根据PRF的定义,输入伪随机函数预言机时SM2 私钥加密_安全加密_113输出1的概率(1/2+SM2 私钥加密_SM2 私钥加密_111)与输入真随机函数预言机时SM2 私钥加密_安全加密_113输出1的概率(1/2)的差异时可忽略的。
  1. 从PRF到CPA安全:变长消息
  • 对于任意长度消息 SM2 私钥加密_安全加密_118SM2 私钥加密_安全_119
  • 推论:如果SM2 私钥加密_SM2 私钥加密_120是一个 PRF,那么 SM2 私钥加密_网络_28
  • 有效性: SM2 私钥加密_SM2 私钥加密_122. 密文长度是明文长度的二倍,并且需要大量的真随机串;
  1. 伪随机排列(Pseudorandom Permutations
  • 为了提高对任意长度消息加密的效率,以及更高级的加密基础工具,学习伪随机排列PRP的概念;
  • 双射 Bijection: SM2 私钥加密_SM2 私钥加密_120
  • 排列 Permutation: 一个从一个集合到自身的双射函数;
  • 带密钥的排列 Keyed permutation: SM2 私钥加密_SM2 私钥加密_124是排列;类似带密钥的函数;
  • SM2 私钥加密_SM2 私钥加密_120 是一个双射 SM2 私钥加密_SM2 私钥加密_126
  • 定义:一个有效的带密钥的排列 SM2 私钥加密_SM2 私钥加密_120 是PRP,如果对于任意PPT的区分器SM2 私钥加密_安全加密_113
    SM2 私钥加密_SM2 私钥加密_129
  • 问题:一个PRP也是一个PRF吗?
  1. PRP例题
  • 对1比特的PRP、PRF的分析;
  • 定理:如果 SM2 私钥加密_安全_130 是一个 PRP 并且 SM2 私钥加密_安全_131,那么 SM2 私钥加密_安全_130
  1. 操作模式概念(Modes of Operation
  • 操作模式是使用PRP或PRF来加密任意长度消息的方法;
  • 操作模式是从PRP或PRF来构造一个PRG的方法;
  • 将一个消息分成若干等长的块(分组,block),每个块以相似方式处理;
  1. Electronic Code Book (ECB) 模式
  • 在窃听者出现时,是否是不可区分的?
  • SM2 私钥加密_安全_130
  1. 对ECB的攻击
  • 为什么仍然可以识别企鹅?
  1. **Cipher Block Chaining (CBC)**模式
  • SM2 私钥加密_SM2 私钥加密_134初始向量,一个新的随机串;
  • 是CPA的吗?可并性化吗?F可以是任意PRF吗?
  1. Output Feedback (OFB) Mode模式
  • 是CPA安全吗?可并性化吗?F可以是任意PRF吗?
  1. Counter (CTR) Mode模式
  • SM2 私钥加密_安全_135是一个初始向量,并且逐一增加;
  • 是CPA安全吗?可并性化吗?F可以是任意PRF吗?
  1. CTR模式是CPA安全
  • 定理:如果SM2 私钥加密_安全_130是一个PRF,那么随机CTR模式是CPA安全的。
  • 证明:其安全性与之前基于PRF的CPA安全证明类似,从PRF的伪随机假设规约到CPA安全加密方案。其中,对SM2 私钥加密_安全_135的安全性直觉在于,SM2 私钥加密_安全_135也是在加密前不可预测的,且每个块所用SM2 私钥加密_安全_135都是不同的;
  • 当加密预言机是由真随机查表构成时,敌手多次访问加密预言机得到的SM2 私钥加密_安全_135序列与挑战密文的SM2 私钥加密_安全_135序列之间有重叠的概率SM2 私钥加密_安全加密_142是可以忽略的;若没有重叠,则相当于一次一密;
  1. CTR模式是CPA安全(续)
  • 规约与之前证明基于PRF的CPA安全加密方案一样,证明过程也类似。
  1. 初始向量不应该可预测
  • 如果SM2 私钥加密_SM2 私钥加密_134是可预测的,那么CBC/OFB/CTR模式不是CPA安全的。
  • 为什么?(作业)
  • 在SSL/TLS 1.0中的漏洞:记录SM2 私钥加密_安全_144SM2 私钥加密_SM2 私钥加密_134是上一个记录SM2 私钥加密_安全加密_146的密文块。
  • OpenSSL中API:需要用户输入SM2 私钥加密_SM2 私钥加密_134,但SM2 私钥加密_SM2 私钥加密_134应在函数内实现。当SM2 私钥加密_SM2 私钥加密_134不充分随机时不安全。
  1. 非确定性加密
  • 有三种通用的实现CPA安全的非确定性加密方法:
  • 随机化的:SM2 私钥加密_网络_73随机生成,如构造5;需要更多熵,长密文
  • 有状态的:SM2 私钥加密_网络_73为计数器,如CTR模式;需要通信双方同步计数器
  • 基于Nonce的:SM2 私钥加密_网络_73只用一次;需要保证只用一次,长密文
  1. 选择密文攻击 Chosen-Ciphertext Attacks (CCA)
  • CCA不可区分实验 SM2 私钥加密_安全加密_153:
  1. 挑战者生成密钥 SM2 私钥加密_密钥流_18;(为了下一步的预言机)
  2. SM2 私钥加密_安全加密_12 被给予输入 SM2 私钥加密_SM2 私钥加密_40 和对加密函数 SM2 私钥加密_安全_41和解密函数SM2 私钥加密_网络_158预言机访问(oracle access) SM2 私钥加密_网络_42SM2 私钥加密_安全加密_160,输出相同长度 SM2 私钥加密_安全_43
  3. 挑战者生成随机比特 SM2 私钥加密_安全_19,将挑战密文 SM2 私钥加密_密钥流_45 发送给 SM2 私钥加密_安全加密_12
  4. SM2 私钥加密_安全加密_12 继续对除了挑战密文SM2 私钥加密_安全_166之外的预言机的访问,输出SM2 私钥加密_网络_25;如果SM2 私钥加密_密钥流_50,则SM2 私钥加密_安全加密_12成功SM2 私钥加密_安全加密_170,否则 0。

定义:一个加密方案是CCA安全的,如果实验成功的概率与1/2的差异是可忽略的。

  1. 理解CCA安全
  • 在现实世界中,敌手可以通过影响被解密的内容来实施CCA。如果通信没有认证,那么敌手可以以通信参与方的身份来发送特定密文。
  • CCA安全性意味着“non-malleability”(不可锻造性),不能修改密文来获得新的有效密文。
  • 之前的方案中没有CCA安全,因为都不是不可锻造。
  • 对基于PRF的CPA安全加密方案的CCA攻击:
  • SM2 私钥加密_安全_171 获得挑战密文 SM2 私钥加密_网络_172,并且查询与SM2 私钥加密_安全_173只相差了一个翻转的比特的密文SM2 私钥加密_网络_174,那么
    SM2 私钥加密_SM2 私钥加密_175 应该与 SM2 私钥加密_安全加密_176
  • 问题:上述操作模式也不是CCA安全的(作业)
  • 由此,可以总结出CCA下敌手的常用策略:
  • 修改挑战密文SM2 私钥加密_安全_166SM2 私钥加密_安全加密_178,并查询解密预言机得到SM2 私钥加密_安全_179
  • 根据关系,由SM2 私钥加密_安全_179来猜测被加密明文SM2 私钥加密_密钥流_181
  1. Padding-Oracle(填充预言机)攻击真实案例
  • CAPTCHA服务商为Web网站提供验证用户是否为人类的服务。为此,一个CAPTCHA服务器与Web服务器间事先共享一个密钥SM2 私钥加密_安全_182,服务工作原理如下:
  1. 当Web服务器验证用户是否为人类时,生成一个消息SM2 私钥加密_安全_183并以SM2 私钥加密_安全_08加密,向用户发送一个密文SM2 私钥加密_SM2 私钥加密_185
  2. 用户将密文SM2 私钥加密_SM2 私钥加密_185转发给CAPTCHA服务器;(可实施填充预言机攻击)
  3. CAPTCHA服务器用密钥SM2 私钥加密_安全_08将密文解密,根据解密结果返回给用户信息:一个由SM2 私钥加密_安全_183生成的图像,或者坏填充错误;
  4. 用户根据图像获得 SM2 私钥加密_安全_183 并将 SM2 私钥加密_安全_183
  • 在第2步,当恶意用户可以利用CAPTCHA服务器会返回给用户坏填充错误这一漏洞,来实施填充错误攻击。
  1. Padding-Oracle(填充预言机)攻击
  • 在PKCS #5 padding(填充)标准中,为了将一个消息的长度“填充”到块长度的整数倍,在最后一个块中填充SM2 私钥加密_安全加密_191个字节的SM2 私钥加密_安全加密_191;必要时,添加一个哑块(dummy block)。存在一种攻击手段:当填充错误时,解密服务器返回一个“坏填充错误”,这相当于提供了解密预言机,最终可以获得整个明文;
  • 具体攻击原理是,更改密文(包含SM2 私钥加密_SM2 私钥加密_134)并发送给解密服务器。一旦触发了“坏填充错误”,则说明对密文的更改导致了填充内容的更改;否则,对密文的更改导致了原明文的更改;
  • 攻击的第一步判断消息是否为空:在单个块的CBC中,通过更改SM2 私钥加密_SM2 私钥加密_134的首个字节,攻击者能够获知是否SM2 私钥加密_安全加密_195是否为空。因为如果SM2 私钥加密_安全加密_195是空的话,更改SM2 私钥加密_SM2 私钥加密_134首个字节将更改解密出的填充内容,解密服务器就会返回坏填充错误(1比特信息),具体分析如下:
  • 如果SM2 私钥加密_SM2 私钥加密_198是空的,那么明文会添加一个哑块SM2 私钥加密_安全_199
  • PRP的输入为SM2 私钥加密_密钥流_200;设SM2 私钥加密_网络的首个字节为SM2 私钥加密_密钥流_202,则PRP的输入为SM2 私钥加密_安全_203
  • SM2 私钥加密_网络的首个字节从SM2 私钥加密_密钥流_202改成SM2 私钥加密_安全_206变为 SM2 私钥加密_SM2 私钥加密_207,不改变SM2 私钥加密_安全_208解密得到的PRP的输入不会变,而解密出的明文会改变为 SM2 私钥加密_网络_209
  • 上述明文首个字节一定不是SM2 私钥加密_密钥流_210,这是填充格式错误,会触发服务器返回错误;
  • 如果上面的尝试没有触发错误,那么说明消息非空;下一步,发现消息长度是否为1字节,方法与上一步一样,区别在于只改变SM2 私钥加密_网络的第2个字节;如此继续,获得消息的长度;(作业)
  1. Padding-Oracle攻击(续)
  • 一旦获得消息的长度,也就知道了填充的长度SM2 私钥加密_安全加密_191,采用下面的方法来获得消息的最后一个字节内容,进而获得整个消息;
  • 更改密文中倒数第二块,来获得消息的最后一个字节SM2 私钥加密_安全_213
  • 明文的最后一个块 SM2 私钥加密_安全_214,密文的倒数第二个块 SM2 私钥加密_安全加密_215
  • 最后一块的PRP输入为SM2 私钥加密_网络_216
  • 敌手更改 SM2 私钥加密_密钥流_217SM2 私钥加密_SM2 私钥加密_218;其中,SM2 私钥加密_安全加密_219是敌手猜测的某个字节;
  • 解密获得最后一块明文SM2 私钥加密_密钥流_220
  • 如果没有返回坏填充错误,那么意味着填充了SM2 私钥加密_SM2 私钥加密_221个字节的SM2 私钥加密_SM2 私钥加密_221,所以 SM2 私钥加密_安全_223 ,而 SM2 私钥加密_密钥流_224
  1. 总结