密码学总结二
一.对称密码学
密码体制的分类
- 对称密码(加解密使用相同的密钥)
- 流密码(序列密码)
- 分组密码
- 非对称密码(公钥密码,加解密使用不同的密钥)
1.对称密码学概述
-
随机性
- 一个随机序列要求每个比特产生的概率都是1/2
- 每个比特与其他比特统计上相互独立
- 对于计算机而言,计算机产生的一系列随机数其实是周期性的,只是周期很大
任何人考虑用数学的方法产生随机数肯定是不合理的
计算机本身只能产生伪随机序列
-
随机序列类型
-
(一般)伪随机序列
- 伪随机序列应该在统计上是随机的
-
密码学意义上安全的伪随机序列
- 不可预测性,即使知道了产生序列的算法、以前产生的所有比特,也不可能通过计算来预测下一个比特是什么(准确预测成功的概率很低)目的是防止攻击者在知道若干比特后,成功猜测后续比特
-
真随机序列
- 不能被可靠地重复产生(用完全同样的输入操作两次,得到的是两个不相关的序列)
-
-
如何得到真随机序列
使用一种专门的设备(真随机数发生器),输入是各种无法预测的信号:周围空气状况、电流的变化率…
输入是不断变化的,输出也就不可重复。
有人能预测产生的下一个数吗? 他必须重构输入信号,这没人能做到
-
一次一密
- 加密:明文流与密钥流对应比特异或
- 解密:密文流与密钥流对应比特异或
- 特点:密钥流是真随机序列,且不重复使用(故得名 一次一密)
- 安全性:因为密钥流是真随机的,所以没人能预测下一个比特
- 是无条件安全的,即使攻击者具有无限的计算资源和计算能力,也无法破译一次一密 (理论上不可破译,无条件安全的,对于任意密文 y 和明文 x,都有 Pr[x | y] = Pr[x],即,不能通过分析密文获得明文的任何信息)
- 原因:密钥是随机的,而且明文与密钥是统计上相互独立的,使得密文也是随机的,故而密钥的随机性很好的隐藏了明文的统计特性
- 证明:
密钥流是随机的,则每个密钥比特的概率满足: Pr[k=0]=1/2, Pr[k=1]=1/2
假设明文流某个比特的概率满足: Pr[m=0]=p, Pr[m=1]=1-p
对应的密文比特的概率:
Pr[c=0] = Pr[k=0]Pr[m=0]+Pr[k=1]Pr[m=1]=1/2
Pr[c=1] = Pr[k=0]Pr[m=1]+Pr[k=1]Pr[m=0]=1/2
- 只使用异或运算,软硬件实现非常简单。但实用性不强
- 密钥是真随机的
- 密钥长度至少等于明文长度
- 每个密钥只用一次
-
流密码
-
基本思想
用一个较短的密钥生成密钥流,在攻击者(计算能力是有限的)看来是随机的(伪随机的)。不是无条件安全的,仅是计算上安全的
-
产生密钥流的任务由 密钥流生成器 完成
-
关键:如何生成伪随机性“好”的密钥流,故而关键在于密钥流生成器的设计
-
分类:
-
同步流密码
密钥流只根据密钥产生与明文流无关
-
自同步流密码
密钥流不仅与密钥有关还与明文流有关
-
-
密钥流生成器的内部构造
-
驱动部分
为非线性组合部分提供统计特性“好”的序列 (一般伪随机序列)
-
非线性组合部分
将提供的输入序列组合成密码学特性“好”的序列 (密码学意义上安全的伪随机序列)
-
驱动部分应该实现简单,且提供统计特性较好的序列。反馈移位寄存器(FSR)可以满足该要求,是流密码设计中的常用模块
-
FSR的功能
- 以密钥为初始状态(输入)
- 按照确定的递推关系(由反馈函数决定)
- 产生一个周期长、线性复杂度高、统计特性好的初始序列
- 并将输出提供给非线性组合等密码变换,以产生抗密码分析能力强的伪随机序列
-
为什么不直接使用种子作随机数
- 速度问题:收集种子通常很耗时
- 熵(不确定性):种子的熵通常比较低,但不管其熵如何,伪随机序列发生器都能产生统计性好的序列
-
如何收集种子才是安全的?
- 毫秒计的时间
- 用户的输入
- 鼠标点击的位置...它们混合在一起便有了不可预测性,可以抵抗种子猜测攻击
-
-
-
分组密码
-
特点
- 将明文分成等长(比特)的明文分组。
- 输入一个明文分组,输出一个等长(通常)的密文分组。
-
实质
实质是设计一种算法,能在密钥控制下,把 n比特明文分组 简单而迅速地置换成 唯一的 n比特的密文分组,并且这种变换是可逆的(解密)所以,它必须是一个 双射函数 (因为明文分组空间等于密文分组空间) -
设计分组密码的两种基本技术
-
混乱
使明文和密文之间、密钥和密文之间的相关统计特性极小化,从而使攻击者无法找到密钥(常用方法代换)
-
扩散
将明文及密钥的影响尽可能迅速地散布到较多个密文比特中(常用方法置换)
混乱和扩散的思想由香农提出,目的:抵抗攻击者对密码系统的统计分析
-
-
代换
-
什么叫 代换?
加密时,明文的每个分组都应产生唯一的密文分组 (具有可逆性,为了解密),称这种明文分组到密文分组的可逆变换为代换
-
如果明文分组为n比特,则明文分组有多少个可能的取值?
2^n
-
不同可逆变换有多少个?
2^n!
-
如果分组长度太小,系统则等价于古典的代换密码,容易通过对明文的统计分析而被攻破。但从实现的角度来看,构造分组长度很大的代换结构也不现实
-
实际中,常将明文分组再分成较小的“段”,对每个“段”用不同的代换结构(子代换)进行变换,称每个子代换为代换盒,简称为 S盒
-
-
-
数据加密标准(DES)
- 分组长度:明文分组、密文分组长度都是 64比特
- 密钥空间:密钥长度也是 64比特,其中有效密钥长度 56比特 (有8比特奇偶校验位)
- 算法:解密过程与加密过程完全相同,唯一不同的是,子密钥的使用顺序完全相反
- DES的安全性主要依赖于8个非线性代换S盒
- 具有雪崩效应: 明文或密钥的一点小的变动使密文发生一个大的变化。
- DES算法目前最大的问题: 随着计算机技术的飞速发展,56bit 的 有效密钥长度不足以抵御穷举攻击。因为密钥空间大小只有2^56 ≈ 10^17
- 三重DES (3DES) :使用两个或三个密钥,执行三次DES算法
-
流密码与分组密码的比较
- 流密码的优势
- 速度快
- 代码量少(RC4的代码只有30行)
- 分组密码的优势
- 密钥可以重用
- 有标准化算法(DES、AES)
- 流密码的优势
-
填充
-
通常,明文长度是不固定的,按固定长度分组时,往往最后一个分组长度不足,如何解决?
填充(Padding)
-
如何填充
- 填充一些字符补齐最后一个分组。
- 把最后一个分组的最后一个字节称作填充指示符,所表示的十进制数字就是填充了多少字节。
- 明文尾部、填充的字符和填充指示符一起作为最后一组进行加密。
- 不论最后一个分组长度是否足够,都要进行填充
- 长度不足时正常填充
- 长度足够时新建分组填充一个组
-
-
分组密码的工作模式
为什么需要工作模式?
分组密码的输入是一个明文分组,是定长的。
要加密的明文是变长的,长度往往大于一个明文分组。
即使有了安全的分组密码体制,也需要采用适当的工作模式来隐蔽明文的统计特性,以提高整体的安全性。|模式名称|缩写|英文全称|
|--|--|--|
|电子密码本|ECB|Electronic CodeBook|
|密码分组链|CBC|Cipher Block Chaining|
|密码反馈|CFB|Cipher FeedBack|
|输出反馈|OFB|Output FeedBack|
|计数器|CTR|Counter| -
ECB
- 每个明文分组独立加/解密
- 优点
- 简单、高速
- 无差错传播:单个密文分组出现错误只会影响该分组的解密,不会影响到其他分组
- 缺点
- 分组彼此独立,相同密钥下,相同明文分组得出相同密文分组
- 这会暴露明文数据的格式和统计特征
- 且易受重放、插入攻击,五种模式中安全性最弱
- ECB适用于发送少量数据的场合,一般不推荐
-
CBC
- 每个明文分组先与前一密文分组异或,再进行加密
- 初始矢量 IV
- 加密第一个明文分组时,尚无反馈的密文,为此需要预先置入一个,称为 初始矢量 IV(Initial Vector)
- 收发双方必须使用相同IV
- IV无需加密保护,可以随密文一起发送给接收方
- 最好使用不同IV(比如每次将IV加1)加密不同明文
- CBC适用于文件加密,较ECB模式慢
- 有限差错传播
- 单个密文分组出现错误会影响该分组和后面一个密文分组的解密
- 可自同步,只要后面一个密文分组没错,便不会影响后续密文分组的解密
-
CFB
- 速度
- 实现简单(只要求加密算法)
- 比CBC慢很多,每次只有少数比特完成加密
- IV
- 加密不同的明文,必须使用不同的IV
- 差错传播
- 单个密文分组出现一个比特错误,不仅影响该分组,还会最多影响后续[64/j]个密文分组的解密
- 自同步
- 单个密文分组出现错误,只要后续[64/j]个密文分组没有错误,后面的便可正确解密
- CFB适用于 明文按字符(如电传电报)或按比特处理的流密码中
- CFB适用于 无延迟的加密和传播
- CFB适用于 容忍以少量错误扩展换来恢复同步能力的场合
- 速度
-
OFB
- 速度
- 实现简单(只要求加密算法)
- 比CBC慢很多,每次只有少数比特完成加密
- IV
- 加密不同的明文,必须使用不同的IV
- 无差错传播
- 单个密文分组出现错误,只影响该分组的解密
- 自同步
- 能从密文错误中得以恢复;但丢失密文比特会无法实现自同步
- 密钥流
- 可预计算 (因为密钥流独立于明文)
- OFB适用于 必须避免错误传播的高速同步系统
- 速度
-
CTR
- 速度
- 实现简单(只要求加密算法)
- 效率高
- 可预计算
- 可并行加密、吞吐量仅受可并行数量的限制
- 其他
- 可随机访问密文数据块
- 可证明安全性
- CTR适用于 需要并行处理的应用领域
- 速度
-
对称密钥管理
- 保护密钥是很重要的,因为所有的安全性都依赖于密钥的机密性(柯克霍夫斯原则)
- Q&A
- 是否可以记住密钥,这样就不用存储,别人也偷看不了?
- 理论上可以,但不实际,因为密钥是随机的,很难记忆
- 既然有地方安全保存密钥,为啥不直接把敏感信息放在那里?
- 保护短的密钥比保护数以兆计的信息更容易
- 是否可以记住密钥,这样就不用存储,别人也偷看不了?
- 用 密钥 保护数以兆计的信息,用一些其他技术保护大约16字节(128bit)的密钥
- 主要技术
-
基于口令的加密(PBE)
- 加密
- 选择一个口令
- 伪随机序列发生器产生一个salt
- 用一个算法混合口令和salt,通常使用Hash函数
- 从Hash函数的输出中取出所需要长度的比特作为密钥
- 密钥用完后丢弃。用脑子记住口令。
- salt无需保密,可以和加密后的数据一起保存。
- 解密
- 输入口令
- 从保存点(磁盘)取出salt和密文
- 用算法(Hash函数)混合口令和salt,产生密钥
- 用该密钥解密密文,以恢复明文
- 加密
-
为什么不直接用口令作密钥?
- 口令的熵很小,远达不到密钥所要求的随机程度
-
salt (盐值) 是干什么用的?
- 为防止字典攻击中的预计算
-
为什么salt和密文一起保存,保密salt不是更安全?
- 使用salt的唯一目的是防止字典攻击中的预计算,而不是增加安全性
- 即使salt不保密,仍能达到目的。
- 此外,如果保密salt的话,还不如直接保密密钥。
-
基于硬件的密钥存储
-
生物统计学
-
-
保护密钥的密钥
- 通信时,通常使用两种密钥
- 会话密钥 (临时密钥)
- 密钥加密密钥 (KEK)
- 使用方法
- 每次通信使用不同的会话密钥保护明文
- KEK保护会话密钥,并将之传给对方
- 目的
- 因为每次通信使用不同的会话密钥,攻击者无法获得同一密钥加密的大量密文,使得破译更加困难
- 用KEK保护会话密钥,用什么保护KEK?
- 使用 基于口令的加密,步骤如下:
- 用口令和salt产生KEK。
- 用KEK加密会话密钥,用会话密钥加密明文
- 记住口令,保存salt和加密后的会话密钥
- 将密文和加密后的会话密钥传给对方
- 至于KEK,丢掉就OK了
- 使用 基于口令的加密,步骤如下:
- 通信时,通常使用两种密钥
-
对基于口令的加密的攻击
- 假设攻击者闯入你的电脑,偷走salt和密文(或 加密后的会话密钥),他如何计算密钥?
- 穷举攻击密钥(无需salt 也可以发动)
- 字典攻击 (猜测口令)
- 因为salt不保密,如果攻击者获得了salt,他仍能发起字典攻击,只不过要多花一些时间
- 构造或下载一本常用口令的字典,然后尝试每个口令和salt产生的密钥
- 两种攻击方法的比较
- 相比之下,字典攻击速度更快。但若口令不在字典里,当然不会成功
- 一个聪明的攻击者一般会这样做
- 首先尝试字典攻击,失败后换用改进的穷举密钥攻击。
- 如何抵挡字典攻击
- 基本思想
- 想办法 降低攻击者的计算速度
- 基本方法
- Hash函数混合salt和口令后,将输出再次用Hash函数混合,重复进行多次,假设1000次。
- 优点
- Hash函数计算速度比你想象的快得多。
- 事实上,计算1000次Hash函数比你从键盘输入口令的时间还要短。
- 但攻击者不得不对字典中每个口令计算1000次,使他总的计算时间会很长
- 其他的实用方法
- 对于一些在线系统,如ATM机、网上银行、电子邮箱、论坛等,可以限制用户输入口令的次数
- 若在规定次数内没有输入正确的口令,便吞卡,或提示半小时后才能再次使用系统
- 基本思想
- 假设攻击者闯入你的电脑,偷走salt和密文(或 加密后的会话密钥),他如何计算密钥?
-
基于硬件的密钥存储
- 基于硬件的密钥存储
- 把密钥保存在一个硬件设备上
- 令牌
- 可以随身携带:钱包里、钥匙链上、当戒指戴
- 攻击者要获得密钥,必须先拿到令牌,这增加了攻击难度
- 令牌内部还有进一步保护措施
- 需要输入一个正确的口令才能使令牌发挥作用
- 试图用物理手段获得密钥,令牌还有自毁功能
- 令牌的唯一缺点
- 必须把密钥加载到内存里才行,有可能会被木马等病毒偷走
- 但密钥使用完毕就从内存中抹掉了,短短几分钟甚至几秒钟的停留还是问题不大的
- 令牌
- 密码加速器
- 有专门进行密码运算的芯片,比一般CPU处理密码更快,也比常规计算机更安全的存储数据。
- 安全特性
- 存储空间对外界不可见
- 一旦被撬,有自毁装置
- 不允许密钥离开。加密时把明文送入加速器,它返回密文。
- 通常与令牌一起使用
- 只有插入令牌,提供令牌正确的口令,加速器才能工作