1 公钥私钥
2 公钥加密
别人用A的公钥加密传输的信息,只有A的私钥可以解密。保证了传输的信息的安全性。
2 私钥签名
A用A的私钥加密的信息,别人用A的公钥才可以解密。可以证明这个信息一定是A传输而来的。
2 HTTPS的加密过程
共享秘钥(对称加密):速度快,但无法保证客户端与服务器之间传输时秘钥的安全性。
和公开密钥(非对称加密):安全,速度慢。
3 数据传输过程:
一、客户端请求SSL(安全套接层)通信,报文中包含自己支持的SSL版本、加密算法等。
二、服务器应答,附带自己的公钥证书,协商定好的SSL版本、加密组件。
服务器端需要将自己的公钥发送给客户端,以供客户端加密信息。
但客户端无法确定得到的公钥一定是目标服务器的,可能是中间人伪装的。
服务器端公司请求数字证书认证机构(CA)对它的证书进行证明。CA 使用自己的秘钥对服务器公司的公钥进行加密。CA 将服务器公钥相关的信息以明文形式写入证书,并通过指纹算法(一个hash算法)对证书内容进行计算,得到指纹。然后,对指纹算法和指纹用私钥进行加密,得到数字签名。最后,将证书内容附带数字签名一起发布。
这样,只要你的CA公钥是合法的,能够解开数字签名的私钥加密,且计算后指纹吻合,则可以保证服务器公钥的合法性————是由CA认证的,且内容未被篡改过。
若是黑客的合法证书,那内容与我们的目的域名不一致,肯定不行。
三、客户端根据自己本地的收信任的CA公钥,解封服务器公钥证书,得到服务器公钥。客户端生成一个随机码序列,用服务器公钥加密后,发回服务器。
四、服务器用私钥解密后,再加密将字符串传回客户端。
五、客户端确认服务器身份后,生成对称加密算法和共享秘钥,使用服务器公钥加密后,传给服务器。
六、此后,双方使用对称加密算法加密数据,进行传输。
上面过程中,一二用于获得合法的服务器公钥,三四用于确认服务器是否为真正私钥持有者(因为,服务器公钥谁都可以得到)。
1 对称密码
2 一次性密码本
使用与明文比特序列一样长的,真正的随机数序列,进行加密,绝对安全,因为穷举破译后能得到整个秘钥空间,毫无意义。
2 DES Date Encryption Standard
以分组为单位进行处理的密码算法称为 分组密码。
3 加密结构
采用 Feistel网络。
以 64 bit 为一个加密单位,首先分成两部分,各32 bit 。
加密过程持续数轮,每轮中,使用子秘钥与右侧数据经过轮函数生成一个序列,然后与左侧做 XOR 。
每轮结束后,左右两侧交换。
3 特点
加解密结构相同,轮数任意,函数任意。
2 三重DES triple-DES
使用秘钥1、2、3对明文进行加密、解密、加密三个过程,称为三重DES。
解密过程是为了兼容老版DES,如果1、2、3秘钥相同,则成为了普通DES。
1、3秘钥相同,2不同时,称为DES-EDE2 。
1、2、3秘钥不同,称为DES-EDE3 。
2 AES advanced encryption standard
采用的是 Rijndael 算法,SPN结构。
3 加密结构
输入分组为 128bit(16字节),秘钥长度可以以 32bit 为单位,在128~256bit之间选择。
该算法由多轮构成,10~14轮。
一轮中:
SubBytes,按字节,将输入分开,以每个字节为索引,查表找值,替换。
ShiftRows(平移行),按字节,打乱上面的输出。
MixColumns (混合列),按4个字节,比特运算。
与轮秘钥进行 XOR 。
1 模式
分组密码:每次处理,特定长度的一块数据。
流密码:对数据流,连续处理,需要保持内部状态,记录进度。
模式:密文有多个分组时,分组密码的迭代方法。
模式种类
ECB模式 :electronic codebook mode
CBC模式 :cipher block chaining mode
CFB模式 :cipher feedback mode
OFB模式 :output feedback mode
CTR模式 :counter mode
2 ECB 电子密码本模式
明文分组加密后,直接成为,密文分组。
特点:攻击者无需破译,即可操纵明文。
2 CBC 密文分组链接模式
3 加密结构
明文分组,与前一个密文分组XOR,加密得到自己的密文分组。
第一个分组的前一个密文分组,由 初始化向量(随机比特序列) 代替。
加密时,需要从头开始。因为需要与密文分组做 XOR 。
解密时,对密文分组解密,直接与密文分组 XOR 即可。
3 特点
同样的明文分组,密文值可以不相等。
密文分组可以损坏,影响部分。
密文分组比特缺失,影响全部。
2 CFB 密文反馈模式
3 加密结构
前一个密文分组,通过加密算法得到一个比特序列,称为 密钥流 。
明文分组,与密钥流 XOR,得到自己的密文分组。
解密时,加密算法对密文分组进行加密,得到密钥流,与密文 XOR 可得到明文。
3 攻击方式
重复攻击:假设秘钥相同。发送 4 个分组,攻击者保存了后面3个。转天,你又发送了 4 个分组,攻击者将你后面三个替换,接收方解密后,只有 2 号分组有错。
2 OFB 输出反馈模式
3 加密结构
对于每个分组,初始化向量加密后,得到密钥流。明文与密钥流 XOR 后,得到密文。
3 特点
速度快,密钥流可以提前生成,或者,生成秘钥过程可以和 XOR 运算并行。
2 CTR 计数器模式
3 加密结构
对每个计数器加密得到密钥流。密钥流与明文分组 XOR ,得到密文分组。
计数器生成的数,由一个随机序列 nonce+从1开始的递增数字组成。
对每个分组,计数器递增后,加密,得到密钥流。
3 特点
能够以任意顺序处理分组,因为加密时需要的初始数字序列能够计算出来。
1 公钥密码
2 密钥配送问题解决方法
3 事先共享密钥
为了确保安全,有地理局限,与不同的人通信需要不同密钥,共享繁琐。
3 密钥分配中心
每个员工有自己的密钥,密钥分配中心使用个人密钥,包裹临时会话密钥,分配给各个员工使用。
2 RSA
3 加密原理
密文=明文的E次方 MOD N
E 和 N 是RSA加密用的密钥,也就是说,E 和 N 的组合就是公钥。
3 解密原理
明文=密文的D次方 MOD N
D 和 N 的组合就是私钥。
3 生成密钥对
4 求 N
寻两个很大的质数 p 和 q,相乘得到 N
4 求 L(仅在生成密钥对过程中使用)
L为 p-1 和 q-1 的最小公倍数
4 求 E
随机数生成器,不停地生成数字,直到满足如下条件:
1 < E < L
E 和 L 的最大公约数为 1
4 求 D
根据 E ,计算 D
1 < E < L
E × D MOD L = 1
保证 E 与 L 互质,则 D 一定存在。
3 数学原则
求对数很容易,求 离散对数 很困难
对一个大数字进行质因数分解,人类未找到高效算法
2 其它公钥密码
3 ElGamal方式
利用了 MOD N下,求离散对数的困难度
加密后,密文长度翻倍
3 Rabin方式
利用了 MOD N下,求平方根的困难度
3 椭圆曲线密码 ECC
密码实现通过 对椭圆曲线上的特定点进行特殊乘法。
利用了该种乘法的逆运算非常困难这一特性
1 单向散列函数
单向散列函数 又称为,消息摘要函数、哈希函数、杂凑函数
输入的消息 又称为,原像
散列值 又称为,消息摘要、指纹
完整性 又称为,一致性
2 单向散列函数的性质
根据任意消息,计算出的散列值长度,固定
用时短
消息不同,散列值不同
消息不同,散列值相同的情况,称为碰撞。
弱抗碰撞性:要找到,与该条消息散列值相同的,另外一条消息,非常困难。
强抗碰撞性:要找到,散列值相同的,两条不同消息,非常困难。
密码技术中的 单向散列函数,需要强弱抗碰撞性兼备。
具备单向性
2 具体的单向散列函数
3 MD4、MD5
MD是消息摘要的意思
可以产生 128bit 的散列值,但它们的抗碰撞性已被攻破
3 SHA-1、SHA-256、SHA-384、SHA-512
SHA-1散列值长度为 160bit,强碰撞性已被攻破
其余的统称为 SHA-2,散列值长度为各自后面的数字
3 RIPEMD-160
欧盟版本
3 AHS advanced hash standard 和 SHA-3
第三代 SHA
2 SHA-1
消息上限 2^64 bit。
3 填充
消息长度需要是 512bit 的整数倍。这样的 512比特 称为一个输入分组。
过程:
消息末尾添加 1
然后添加 0,直到最后一个分组的 448比特 的位置
最后 64比特 需要保存原是消息的长度
3 计算W0~W79
对每个分组计算 80 个 32bit 的值。
过程:
将 512bit 分成 32bit × 16组,称为 W0~W15
从15组中按规律取4组,进行 XOR 运算,结果循环左移 1 位,得到另外一组。如此反复,得到总共 80 组。
3 分组处理
ABCDE 五个 32bit 的缓冲区,保存了 160bit 的消息内部状态。
内部状态与每个 512bit 的输入分组混合,一共 80 个步骤。
单个步骤的处理过程异常复杂,每个步骤完成后,五个缓冲区都要循环移位,B缓冲区需要左移30bit,过程中,每个缓冲区都与输入分组进行了运算。
最终得到 160bit 的最终内部状态。
对单向散列函数的攻击
暴力破解:暴力寻找与 1亿元合同 散列值相同的文件
生日攻击:准备两份 散列值相同的 1亿元合同
单向散列函数无法解决的问题
可以辨别 篡改,无法辨别 伪装,因此还需要 认证技术
认证技术包括 消息验证码 和 数字签名
消息验证码:可以向通信对象保证消息不被篡改
数字签名:可以向任何人保证通信对象不被篡改
1 消息认证码
message authentication code,简称 MAC。
相当于使用共享密钥的单向散列函数
2 消息认证码的应用实例
SWIFT:负责银行间的交易,公钥密码使用前,都是人工配送密钥的。
IPsec:对IP协议增加安全性,采用的是消息认证码
SSL/TLS:网上购物等场景中所用协议。
2 HMAC Hash MAC
过程:
密钥填充 至单向散列函数要求的输入分组大小
填充后的密钥 与 ipad(16进制的36不断循环)XOR,得到ipadkey
与 消息 组合,计算散列值
填充后的密钥 与 opad(16进制的5C不断循环)XOR,得到opadkey
与 上面得到的散列值 组合,计算新的散列值,为最终的MAC值
2 消息认证无法解决的问题
对第三方证明
防止否认
因为知晓密钥的只有两个当事人,第三者无法确定能拿到合法的密钥,无法自己计算合法MAC值
1 数字签名
2 数字签名的方法
RSA:利用质因数分解难度的那个
ElGamal:利用求离散对数的困难度的那个,数字签名有漏洞,现仅用于公钥密码
DSA:Schnorr算法与ElGamal方式的变体,只能用于数字签名
Rabin:利用了求MOD N中平方根的困难度,可用于数字签名和公钥密码
1 证书
2 认证机构的 认证业务准则
例如,verisign公司的认证业务分为三个等级,等级越高,越严格
Class 1 邮箱认证
Class 2 通过第三方数据库来确认本人身份
Class 3 通过当面认证和身份证明
2 证书标准规范
ITU 国际电信联盟和 ISO 国际标准化组织制定的 X.509 规范如下
大体包含以下内容:
签名前的证书——签名对象的各种消息
数字签名算法——签名时所用的算法
数字签名——得到的数字签名
2 公钥基础设施 Public-Key Infrastructure
PKI :为了能有效使用公钥而制定的一系列规范和规格
PKI 的组成要素如下
用户 —— 使用 PKI 的人
认证机构 —— 颁发证书的人
仓库 —— 证书目录
2 认证机构的工作
3 生成秘钥对
两种方法:一种是由认证机构生成,一种是由 PKI 用户自行生成
3 注册证书
3 作废证书与CRL
认证机构有一个 CRL(认证作废清单),具有数字签名,记载了已经作废的证书的编号。
2 证书的层级结构
认证时,从上(根证书)往下
1 密钥
对于密钥,关键的是 密钥空间的大小
2 各类密钥
DES 的密钥 实质长度(即,除去校验错误的比特后的长度)7字节
DES-EDE2 的实质长度 14字节,DES-EDE3 的实质长度 21字节
AES 的密钥长度可以从 128、192 和 256bit 当中选
2 不同的密钥
3 会话密钥和主密钥
会话密钥:每次通信中,仅使用一次的密钥
主密钥:一直被重复使用的密钥
3 加密内容的密钥和加密密钥的密钥
CEK:Contents Encrypting Key
KEK: Key Encrypting Key
2 密钥的管理
各个步骤中的密钥管理方法
3 生成密钥
两种方法:
用随机数生成密钥:使用具备不可预测性的伪随机数生成器生成随机数
用口令生成密钥:一般使用,口令 + 一串称为 salt 的随机数,得到他们的散列值作为密钥(这种方法称为:基于口令的密码)
3 配送密钥
事先共享
秘钥分配中心
使用公钥密钥
Diffie-Hellman 密钥交换
3 更新密钥
密钥更新:一种提高通信机密性的技术
原理:
使用 共享密钥 进行通信时,定期改变密钥。
双方使用同样的方法,对当前密钥求 散列值,并作为下一个密钥
优点:
后向安全:防止破译过去的内容
如果密钥被窃听者得到,他只能得到之后的消息,无法得到上一个密钥,无法得到此前的消息
3 保存密钥
对密钥进行加密,然后保存
意义:
同时对多个密钥进行加密,可以减少保存密钥的数量
2 Diffie-Hellman密钥交换
步骤:
3 双方首先确定两个质数 P 和 G
P 为非常大的质数,G 为 P 的生成元
3 甲方生成一个随机数 A,乙方生成一个随机数 B ,各自保密
3 甲方将 G^A MOD P 发给 B
目的为,将 随机数 A 的信息 含蓄地发给了 B
3 乙方将 G^B MOD P 发给 A
目的为,将 随机数 B 的信息 含蓄地发给了 A
3 甲方进行计算,得到密钥
计算方法:密钥 = (G ^ B MOD P) ^ A MOD P = G^(A × B) MOD P
3 乙方进行计算,得到密钥
计算方法:密钥 = (G ^ A MOD P) ^ B MOD P = G^(A × B) MOD P
2 生成元 G 的意义
对于一个质数 P ,只有它的生成元在进行 G ^ x MOD P 时,结果能够覆盖 0 ~ P-1 的所有数字
2 基于口令的密码 (PBE 基于口令的加密)
用途:用于安全的保存密钥
由来:
一 生成会话密钥 CEK ,加密消息
二 需要保密 会话密钥CEK,使用 密钥加密密钥KEK 对会话密钥进行保密
三 现在需要保密 KEK 这个密钥,选择使用口令生成这个 KEK
对 口令 + salt 求散列值,作为 KEK ,之后只用保存 salt 和 使用 KEK 加密后的会话密钥 就好了,KEK也可以丢掉了
3 过程重点
保密的问题最终都归结为了 安全保存密钥,然而我们记不住密钥。
于是,选择单向散列函数对口令生成散列值,作为密钥。
这个密钥无需保存,我们可以通过口令随时求得,口令也无法被反向推出,且口令方便记忆。
顺带,为了防止字典攻击,生成口令散列值时,需要使用 口令 + salt(随机数序列)
3 字典攻击
事先 已准备好 候选列表 的攻击方法
1 随机数
2 随机数的性质
随机性
不可预测性
不可重见性
这三个性质,越往下越严格。分别称为:
弱伪随机数(不可用于密码学)
强伪随机数
真随机数
3 伪随机数生成器的种子
伪随机数生成器是公开的,种子是保密的。
确保种子的不可预测性,更加容易些。
种子是用来对伪随机数生成器的内部状态进行初始化的
2 具体的伪随机数生成器
3 线性同余法
R1 = (A × R0 + C) MOD M
数据有限,不能用于密码学
3 单向散列函数法
单向散列函数的单向性是支撑伪随机数序列不可预测性的基础
3 密码法
利用 AES 等对称密钥对内部状态进行加密
3 ANSI X9.17
从当前时间开始,利用加密算法求得加密后的时间的掩码(因为密钥未知,别人无法推测出掩码信息)
与内部状态 XOR,加密后输出,得到伪随机数序列
对伪随机数序列加密后,作为下一个内部状态
1 PGP Pretty Good Privacy
针对极端情况的密码软件,具有全部功能。
PGP 通过信任网来判断密钥的合法性和可信度
1 SSL/TLS
2 TLS 传输层安全协议
TLS 由 TLS 记录协议 和 TLS 握手协议 叠加而成。
3 TLS 记录协议 负责底层加密
负责消息的 加密、压缩 和 认证
3 TLS 握手协议 负责加密外的其他操作
握手协议
商定 客户端和服务器 所用的加密算法和密钥
密码规格变更协议
负责 传递 变更密码的信号
警告协议
发生错误时 通知对方
应用数据协议
传输数据