密码
一 环游密码世界
密码学家的工具箱
-
对称密码: 加密和解密时使用同一种密钥
-
公钥密码(非对称加密):加密解密使用不同密钥
-
单向散列函数(one-way hash function):为了防止软件被篡改,有安全意识的软件发布者会在发布软件的同时发布该软件的散列值。 散列值就是用单向散列函数计算出来的数值。散列值(hash)又称哈希值、密码校验和(cryptographic checksum)、指纹(fingerprint)、消息摘要(messagedigest ).下载该软件的人可以自行计算所下载文件的散列值,然后与软件发布者公布的散列值进行对比。如果两个散列值一致,就说明下载的文件与发布者所发布的文件是相同的。单向散列函数所保证的并不是机密性,而是完整性(integrity)。完整性指的是“数据是正牌的而不是伪造的”这一性质。使用单向散列函数,就可以检测出数据是否被篡改过。
-
消息认证码(message authentication code):为了确认消息是否来自所期望的通信对象。通过使用消息认证码,不但能够确认消息是否被篡改,而且能够确认消息是否来自所期待的通信对象。也就是说,消息认证码不仅能够保证完整性,还能够提供认证(authentication)机制。
-
数字签名:能够防止上述伪装、篡改和否认等威胁的技术。数字签名就是一种将现实世界中的签名和盖章移植到数字世界中的技术,它也是一种重要的密码技术。
-
伪随机数生成器(Pseudo Random Number Generator,PRNG): 是一种能够模拟产生随机数列的算法,承担密钥生成的重要职责。两人在web中继续SSL/TLS通信是,会生成一个仅用于当前通信的临时密钥,这个密钥就是基于伪随机数生成器生成的
隐写术
隐写术的目的是隐藏消息本身,但如果搞清楚了嵌人消息的方法,也就可以搞清楚消息的内容。因此,隐写术并不能代替密码。(密码隐藏的是内容) 隐写术在计算机中也有一定的应用。数字水印技术就运用了隐写术的方法。数字水印是一种将著作权拥有者及购买者的信息嵌入文件中的技术。但是仅凭数字水印技术是无法对信息进行保密的,因此需要和其他技术配合使用。
密码与信息的安全常识
-
不要使用保密的密码算法
-
使用低强度的密码比不进行任何加密更危险
-
任何密码总有一天都会被破解(一次性密码本除外)
-
密码只是信息安全的一部分
二 历史上的密码
简单替换密码
很难通过暴力破解,因为密钥空间太大
频率分析可以破译(一般英语出现频率最高的是e,最少的是z)
enigma
加密过程(每按下一个键就会点亮一个灯泡
-
根据每日密码设置engima(接线板的接线,轮子的排列)
-
加密通信密码,3个字母重复2次
-
根据通信密码重新设置enigma(通信密码的3个字母代表3个转子的初始位置)
-
加密消息
-
将加密后的通信密码和加密后的消息拼接发过去
一个字母经加密无法得到它本身
三 对称密码
XOR
为了让大家理解比特序列运算的概念,我们来介绍一下 XOR运算。XOR的全称是 exclusiveor,在中文里叫作异或。尽管名字看起来很复杂,但这种运算本身一点都不难。
不需要进位,经过两次加密得本身
DES(feistel network)
将64bit明文加密为64bit密文的对称加密算法,它的密钥实际长度为56bit(每隔7个bit设置一个用于错误检查的比特)
(1)将输人的数据等分为左右两部分。 (2) 将输人的右侧直接发送到输出的右侧。 (3) 将输人的右侧发送到轮函数。 (4)轮函数根据右侧数据和子密钥,计算出一串看上去是随机的比特序列。 (5)将上一步得到的比特序列与左侧数据进行XOR运算,并将结果作加密后的左侧。
但是,这样一来“右侧”根本就没有被加密,因此我们需要用不同的子密钥对一轮的处理重复若干次,并在每两轮处理之间将左侧和右侧的数据对调。
图3-4展现了一个3轮的 Feistel 网络,3轮加密计算需要进行两次左右对调。对调只在两轮之间进行,最后一轮结束之后不需要对调。
那么,Feistel 网络应该如何解密呢?例如,我们尝试一下将一轮加密的输出结果用相同的子密钥重新运行一次,这时 Feistel 网络会怎么样呢?结果可能非常令人意外,无论轮函数的具体算法是什么,通过上述操作都能够将密文正确地还原为明文(图3-5)。 有多个轮的情况下也是一样的。也就是说,Feistel 网络的解密操作只要按照相反的顺序来使用子密钥就可以完成了,而Feistel 网络本身的结构,在加密和解密时都是完全相同的
加密时可以使用任何函数作为轮函数
三重DES
DES-EDE2
密钥1和三相同,2不同
DES-EDE3
AES-Rijndael
Rijndael 的输入分组为128比特,也就是16字节。首先,需要逐个字节地对16字节的输人数据进行 SubBytes 处理。所谓 SubBytes,就是以每个字节的值(0~255中的任意值)力索引,从一张拥有256个值的替换表(S-Box)中查找出对应值的处理,也就是说,将一个1字节的值替换成另一个1字节的值。这个步骤用语言来描述比较麻烦,大家可以将它想象成是第2 3.8 Rijndael | 67 章中介绍过的简单替换密码的256 个字母的版本。 SubBytes 之后需要进行 ShiftRows 处理,即将 SubBytes 的输出以字节单位进行打乱处理。从图 3-11 的线我们可以看出,这种打乱处理是有规律的。 ShifRows 之后需要进行MixColumns 处理,即对一个4字节的值进行比特运算,将其变为另外一个4字节值。 最后,需要将 MixColumns 的输出与轮密钥进行 XOR,即进行 AddRoundKey处理。到这里,Rijndael 的一轮就结束了。实际上,在 Rijndael 中需要重复进行10~14轮计算。
没有有效攻击,只是一种假设
一次性密码本密钥无法压缩,因为压缩是找出输入数据中冗长重复的序列并将它们替换成较短的数据,而密钥是随机的,不包括重复序列
密钥长度达到512比特再增加密钥长度基本无法提高机密性
四 分组密码的模式
流密码
对数据流进行连续处理的一类密码算法
分组密码
分组密码算法只能加密固定长度的分组,但是我们需要加密的明文长度可能会超过分组密码的分组长度,这时就需要对分组密码算法进行迭代,以便将一段很长的明文全部加密。而迭代的方法就称为分组密码的模式(mode)。一个分组的比特数就称为分组长度(block length)
分组模式
-
ECB:electronic codebook mode(电子密码本)
将明文分组加密后直接成为密文分组,有风险。
特点:有相同的明文分组就会有相同的密文分组,就可以知道有什么样的重复组合。
攻击:攻击者无需破译密码就可操纵明文
-
CBC:cipher block chaining mode(密码分组链接)
先将明文分组与前一个密文分组进行XOR运算,再加密,需提供初始化向量来加密第一个分组。
-
特点:密文长度变化会导致解密失败,但假如1个密文分组的内容改变,最多影响2个明文分组
攻击:改变初始化向量eg反转比特。很难单独改变某个密文分组
-
CFB:cipher feedback mode(密文反馈)
使用分组密码来实现流密码
-
攻击:重放攻击:替换为相同密钥的其他密文
-
OFB:output feedback mode(输出反馈)
如果一个分组加密后和加密前相同,则密钥就会一直重复
-
CTR : counter mode(计数器模式)
通过将逐次累加的计数器进行加密来生成密钥流的流密码
比较
计数器的生成方法
分组
明文分组:与分组密码算法的分组长度相等
密文分组:将明文分组加密后的密文
公钥密码
mod运算
除法
x*y mod z=1(条件:x与z互质)
乘方
x^z mod y=[(x*x)mod y * (x*x)mod y……]mod y
获得密钥途径
-
事先共享密钥
-
密钥分配中心
-
Diffie-Hellman密钥交换
-
公共密钥
-
密钥对:加密密钥(公钥),解密密钥(私钥)
-
与对称密码长度对比
-
-
-
其他公钥密码
-
EIGamal方式 EIGamal方式是由Taher EIGamal设计的公钥算法。RSA 利用了质因数分解的困难度,而EIGamal 方式则利用了 mod N 下求离散对数的困难度。EIGamal 方式有一个缺点,就是经过加密的密文长度会变为明文的两倍。密码软件GnuPG中就支持这种方式
-
-
Rabin 方式 Rabin 方式是由 M.O.Rabin设计的公钥算法。Rabin 方式利用了 mod N 下求平方根的困难度。上文中我们提到了破解 RSA 有可能不需要通过对大整数N 进行质因数分解,而破译Rabin方式公钥密码的困难度与质因数分解则是相当的,这一点已经得到了证明。
-
椭圆曲线密码 它的特点是所需的密钥长度比 RSA 短。椭圆曲线密码是通过将椭圆曲线上的特定点进行特殊的乘法运算来实现的,它利用了这种乘法运算的逆运算非常困难这一特性。
-
RSA:
RSA加密 密文=明文^E mod N(E和N的组合就是公钥)
RSA解密 明文=密文^D mod N (D 和N的组合为私钥)
生成密钥对:(注 :加密的明文必须小于N)
-
N: 准备2个很大的质数 p,q N=p*q(q,p不能被破译者知道)
-
L: L= lcm(p - 1, q - 1)(L是p-1和q-1的最小公倍数)
-
E:1<E<L gcd(E, L) = 1 (E 和L的最大公约数 1(E和L互质)) 要找出满足 gcd(E, L)=1的数,还是要使用伪随机数生成器。通过伪随机数生成器在1<E<L的范围内生成E的候选数,然后再判断其是否满足 gcd(E, L)=1这个条件。求最大公约数可以使用欧几里得的辗转相除法。
-
D:1 <D<L E x D mod L = 1 要保证存在满足条件的D,就需要保证E和L的最大公约数1,这也正是(3)中对E所要求的条件。简单来说,E x D modL=1保证了对密文进行解密时能够得到原来的明文
-
攻击
-
通过密文求明文,取对数(困难)
-
暴力破解找D(困难)
-
通过E和N求D
-
对N进行质因数分解(现无快速破解方法)
-
推测p,q
-
中间人攻击(可行)
-
-
混合密码系统
组成
-
用对称密码加密消息。
-
通过伪随机数生成器生成对称密码加密中使用的会话密钥。
-
用公钥密码加密会话密钥。
-
从混合密码系统外部赋予公钥密码加密时使用的密钥。
加密
解密
-
认证
七 单向散列函数
概念
单向散列函数(one-way hash function)有一个输人和一个输出,其中输入称为消息(message),输出称为散列值(hash value)。单向散列函数可以根据消息的内容计算出散列值,而散列值就可以被用来检查消息的完整性。散列值的长度和消息的长度无关。无论消息是1比特,还是100MB,甚至是100GB,单向散列函数都会计算出固定长度的散列值。以SHA-1 单向散列函数为例,它所计算出的散列值的长度永远是160比特(20字节)。
性质
-
根据任意长度的消息计算出固定长度的散列值
-
快速计算
-
消息不同散列值不同(抗碰撞性:指的是难以找到另外一条具备特定散列值的消息。当给定某条消息的散列值时,单向散列函数必须确保要找到和该条消息具有相同散列值的另外一条消息是非常困难的。这一性质称为弱抗碰撞性。单向散列函数都必须具备弱抗碰撞性。和弱抗碰撞性相对的,还有强抗碰撞性。所谓强抗碰撞性,是指要找到散列值相同的两条不同的消息是非常困难的这一性质。在这里,散列值可以是任意值)
-
单向性
应用
-
基于口令的加密 单向散列函数也被用于基于口令的加密(Password Based Encryption,PBE)。PBE 的原理是将口令和盐(salt,通过伪随机数生成器产生的随机值)混合后计算其散列值,然后将这个散列值用作加密的密钥。通过这样的方法能够防御针对口令的字典攻击
-
消息认证码 使用单向散列函数可以构造消息认证码。消息认证码是将“发送者和接收者之间的共享密钥”和“消息”进行混合后计算出的散列值。使用消息认证码可以检测并防止通信过程中的错误、篡改以及伪装。消息认证码在 SSL/TLS 中也得到了运用
-
数字签名 在进行数字签名时也会使用单向散列函数。数字签名是现实社会中的签名(sign)和盖章这样的行为在数字世界中的实现。数字签名的处理过程非常耗时,因此一般不会对整个消息内容直接施加数字签名,而是先通过单向散列函数计算出消息的散列值,然后再对这个散列值施加数字签名
-
伪随机数生成器 使用单向散列函数可以构造伪随机数生成器。密码技术中所使用的随机数需要具备“事实上不可能根据过去的随机数列预测未来的随机数列”这样的性质。为了保证不可预测性,可以利用单向散列函数的单向性
-
一次性口令 使用单向散列函数可以构造一次性口令(one-time password)。一次性口令经常被用于服务器对客户端的合法性认证。在这种方式中,通过使用单向散列函数可以保证口令只在通信链路上传送一次(one-time),因此即使窃听者窃取了口令,也无法使用。
SHA-1
(SHA-1 是一种能够根据上限为2“比特的消息计算出160比特的散列值的单向散列函数)
1 填充
对消息进行填充处理,使其长度为512比特的整数倍。这里的512比特称为一个输入
2 计算W0-W7
根据输人分组的512 比特计算出80个32 比特的值(W。~W,o)
3 分组处理
对输入分组依次进行80个步骤的处理,计算5个32比特的值(A~E)作为SHA-1 的内部状态。对所有的分组都要进行这一操作。
4 单步处理
分组处理是由80个步骤的处理组成的,其中每个步骤都是基于W。~W,。使内部状态进行复杂变化的处理。
攻击
-
暴力破解(寻找一样的散列值)(弱碰撞性)
-
生日攻击(强碰撞)生成n个密文和n个明文,其散列值为m比特,n=2^(m/2)时,有1/2的概率成功
八 消息认证码(MAC)
概念
确认完整性并进行认证。消息认证码的输入包括任意长度的消息和一个发送者与接收者之间共享的密钥,它可以输出固定长度的数据,这个数据称为MAC值。
实现
-
单项散列函数
-
分组密码(CBC)
-
其他方法(流密码,公钥密码)
HMCAC
概念
使用单向散列函数构造消息认证码
步骤
-
密钥填充 如果密钥比单向散列函数的分组长度要短,就需要在末尾填充0,直到其长度达到单向散列函数的分组长度为止。如果密钥比分组长度要长,则要用单向散列函数求出密钥的散列值,然后将这个散列值用作HMAC的密钥。HMAC-SHA-1的分组长度为512比特(64字节)。
-
填充后的密钥与ipad的XOR 将填充后的密钥与被称为ipad的比特序列进行X0R运算。ipad是将00110110这一比特 序列(即16进制的36)不断循环反复直到达到分组长度所形成的比特序列 XOR运算所得到的值,就是一个和单向散列函数的分组长度相同,且和密钥相关的比特序 列。这里我们将这个比特序列称为ipadkey。
-
与消息组合 将和密钥相关的比特序列(ipadkey)附加在消息的开头。
-
计算散列值 将3的结果输人单向散列函数,并计算出散列值。
-
填充后的密钥与opad的XOR 将填充后的密钥与被称为opad的比特序列进行XOR运算。opad是将01011100这一比特 序列(即16进制的5c)不断循环反复直到达到分组长度所形成的比特序列 XOR运算所得到的结果也是一个和单向散列函数的分组长度相同,且和密钥相关的比特序 列。这里我们将这个比特序列称为opadkey
-
与散列值结合
将4的散列值拼在opadkey后面
-
计算散列值
将6结果输入函数,得散列值,即为mac
攻击
-
重放攻击
解决方法
-
序号:每次发的消息赋予一个递增编号
-
时间戳:消息包含当前时间
-
nonce:消息包含随机数
-
-
密钥推测攻击
九 数字签名
生成消息签名:私钥加密
-
直接对消息签名
-
对消息散列值签名
验证消息签名:公钥解密
应用
-
安全信息公告
-
软件下载
-
公钥证书
-
SSL/TLS
通过RSA实现签名
生成:签名=消息^d mod n
验证:消息=签名^e mod n
其他方式
-
ElGamal
-
DSA
-
Rabin
攻击
-
中间人攻击
-
对单向散列函数攻击
-
利用数字签名攻击公钥密码
-
其他攻击
对比
十 证书
公钥证书
由认证机构施加签名的公钥
公钥基础设施(PKI)
组成要素
-
用户
-
认证机构
作废证书与:制作作废证书清单(CRL)
-
仓库
攻击
-
攻击数字签名的技术
-
在公钥注册之前攻击(替换其公钥)
-
注册相似人名攻击
-
窃取认证机构的私钥攻击
-
伪装成认证机构攻击
-
钻CRL空子攻击
密钥、随机数与应用技术
十一 密钥
分类
-
用于确保机密性: 对称密码,公钥密码
用于认证:消息认证码,数字签名
-
会话密钥:一次性
主密钥:重复使用
-
加密内容CEK
加密密钥KEK
生成
-
随机数
-
口令
更新
计算当前密钥散列值作为下一个密钥
DIffie-Hellman密钥交换
-
Alice向Bob发送两个质数P和G P必须是一个非常大的质数,而G则是一个和P相关的数,称为生成元(generator)(G的1-p的值全不一样。G可以是一个较小的数字。P和G不需要保密
-
Alice生成一个随机数A A是一个1~P-2之间的整数。这个数是一个只有Alice知道的秘密数字,没有必要告诉Bob,也不能让Eve知道
-
Bob生成一个随机数B B是一个1~P-2之间的整数。这个数是一个只有Bob知道的秘密数字,没有必要告诉Alice,也不能让Eve知道。
-
Alice将G^Amod P这个数发送给Bob。这个数让Eve知道也没关系
-
Bob将G^Bmod P这个数发送给Alice。这个数让Eve知道也没关系
-
Alice用Bob发过来的数计算A次方并求modP.
密钥=(G^B mod p)Amod P=G^(A*B) mod P这个数就是共享密钥。
-
Bob用Alice发过来的数计算B次方并求modP.
密钥=(G^A mod P)Bmod P=G^(A*B) mod P这个数就是共享密钥。
基于口令的密码PEB
盐的作用防御字典攻击(事先准备KEK,尝试破解)
改良
多次进行单向散列函数计算
十二 随机数
应用
-
生成密钥’
-
生成密钥对
-
生成初始化向量
-
生成nonce
-
生成盐
性质
-
随机
-
不可预测
-
不可重现——除非将数列本身保存下来,否则不能重现相同序列
-
伪随机数生成器
-
内部状态
-
种子
具体伪随机数生成器
-
杂乱的方法
-
线性同余法
-
-
单向散列函数
-
-
密码法
-
-
ANSI X9.17
-
十三 PGP
功能
-
加密和解密对称密码
-
生成密钥对,加密,解密公钥密码(加密是混合加密)
-
生成,验证数字签名,添加,分离
-
用单向散列函数计算,显示消息的散列值
-
生成证书,公钥作废证明
-
压缩,解压
-
将二进制数据和文本数据互相转换
-
大文件的拆分,拼合
-
管理生成或从外部获取的密钥
加密
解密
生成和验证数字签名
十四 SSL/TLS
SSL/TLS 提供了一种密码通信的框架,这意味着SSL/TLS 中使用的对称密码、公钥密码、数字签名、单向散列函数等技术,都是可以像零件一样进行替换的。也就是说,如果发现现在所使用的某个密码技术存在弱点,那么只要将这一部分进行替换就可以了。
层次化协议
-
TLS 记录协议 TLS 记录协议位于TLS握手协议的下层,是负责使用对称密码对消息进行加密通信的部分。 TLS 记录协议中使用了对称密码和消息认证码,但是具体的算法和共享密钥则是通过后面将要介绍的握手协议在服务器和客户端之间协商决定的。
-
TLS 握手协议 TLS 握手协议分为下列4个子协议:握手协议、密码规格变更协议、警告协议和应用数据协议。下面我们按顺序逐一介绍。
-
-
密码
规格变更协议 密码规格变更协议是 TLS握手协议的一部分,负责向通信对象传达变更密码方式的信号。 客户端:“好,我们按照刚才的约定切换密码吧。1、2、3!”当协议中途发生错误时,就会通过下面的警告协议传达给对方
-
警告协议 警告协议是TLS握手协议的一部分。警告协议负责在发生错误时将错误传达给对方。 如果没有发生错误,则会使用下面的应用数据协议来进行通信。
-
应用数据协议 应用数据协议是TLS握手协议的一部分。应用数据协议是将 TLS上面承载的应用数据传达给通信对象的协议。
-
握手协议 握手协议是 TLS 握手协议的一部分,负责在客户端和服务器之间协商决定密码算法和共享密钥。基于证书的认证操作也在这个协议中完成。它是4个子协议中最复杂的一个。
-
主密码
-
-
-
-
客户端是在收到服务器发送的 Certificate 消息时获得服务器的公钥的。Certificate 消息中包含服务器的证书,而服务器的证书就是服务器的公钥再加上认证机构的数字签名所组成的。
攻击
-
对各个密码技术攻击
-
对伪随机数生成器攻击
-
利用证书时间差攻击
密码技术与现实社会
框架化
将单独密码技术像零件一样组合起来,并根据需要进行替换。提高重用性和强度