简单小结密码学入门知识点
一、密码的定义
密码,最初的目的是用于对信息加密,计算机领域的密码技术种类繁多。但随着密码学的运用,密码还被用于身份认证、防止否认等功能上。密码是通信双方按约定的法则进行信息特殊变换的一种重要保密手段。依照这些法则,变明文为密文,称为加密变换;变密文为明文,称为脱密变换。密码在早期仅对文字或数码进行加、脱密变换,随着通信技术的发展,对语音、图像、数据等都可实施加、脱密变换。
二、密码的分类
最基本的分类是:信息加解密分为对称加密(Sysmmetric Cryptography)和非对称加密(Public-Key Cryptography,Asymmetric Cryptography),这两者的区别是是否使用了相同的密钥。
除了信息的加解密,还有用于确认数据完整性(Integrity)的单向散列(One-Way Hash Function)技术,又称密码检验(Cryptographic Checksum)、指纹 (Fingerprint)、消息摘要 (Message Digest)。
信息的加解密与信息的单向散列的区别是,对称与非对称加密是可以通过密钥解出明文,而单向散列是不可逆的。信息的加解密,密文必定是不定长的,而单向散列可以是定长的。
结合密码学的加解密技术和单向散列技术,又有了用于防止篡改的消息认证码技术,防止伪装的数字签名技术以及认证证书。
三、密码问题的应对策略
威胁问题 | 特征 | 对应技术 |
窃听 | 机密性 | 对称、非对称加密 |
篡改 | 完整性 | 单向散列、消息认证码、数字签名 |
伪装 | 身份认证 | 消息认证、数字签名 |
否认 | 不可否认 | 数字签名 |
四、信息的加密手段
(1)对称密码
1.DES(Data Encryption Standard)
DES全称为Data Encryption Standard,即数据加密标准,是一种使用密钥加密的块算法,1977年被美国联邦政府的国家标准局确定为联邦资料处理标准(FIPS),并授权在非密级政府通信中使用,随后该算法在国际上广泛流传开来。需要注意的是,在某些文献中,作为算法的DES称为数据加密算法(Data Encryption Algorithm,DEA),已与作为标准的DES区分开来。
DES 算法是以 64 bits 明文为一个单位(每隔 7 bits 会有一个 checksum bit,因此实际有效为 56 bits),分组对明文进行加密的,是一种分组密码(Block Cipher)算法。DES 算法原理是通过一个称为 Feistel 网络,并经过 N 轮的轮函数的计算实现的。
DES算法的入口参数有三个:Key、Data、Mode。其中Key为7个字节共56位,是DES算法的工作密钥;Data为8个字节64位,是要被加密或被解密的数据;Mode为DES的工作方式,有两种:加密或解密。
DES设计中使用了分组密码设计的两个原则:混淆(confusion)和扩散(diffusion),其目的是抗击敌手对密码系统的统计分析。混淆是使密文的统计特性与密钥的取值之间的关系尽可能复杂化,以使密钥和明文以及密文之间的依赖性对密码分析者来说是无法利用的。扩散的作用就是将每一位明文的影响尽可能迅速地作用到较多的输出密文位中,以便在大量的密文中消除明文的统计结构,并且使每一位密钥的影响尽可能迅速地扩展到较多的密文位中,以防对密钥进行逐段破译。
DES算法把64位的明文输入块变为64位的密文输出块,它所使用的密钥也是64位(实际用到了56位,第8、16、24、32、40、48、56、64位是校验位, 使得每个密钥都有奇数个1),其算法主要分为两步:
2.三重 DES(Triple-DES)
3.AES(Advanced Encryption Standard)
AES 是于 2000 年被采用的最新的对称加密标准,采用了 Rijndael 算法。
Rijndael 算法也是一种分组算法,密钥长度规定为 128 bits,192 bits, 256 bits 三种规格。与 DES 不同,Rijndael 算法没有采用 Feistel 网络,而是采用 SPN 结构,并通过多个轮函数实现的。
SPN 结构和轮函数此处不再展开,简单的说,就是对明文数据分组,然后轮函数是进行一系列的平移、翻转、位之间的交换等操作。具体可以参考 Advanced Encryption Standard, Wikipedia。
Rijndael (State, ExpandedKey)
{
AddRoundKey (State, ExpandedKey);
for (i=1; i <Nr; i ++)
Round (State, ExpandedKey+Nb* i);
FinalRound (State, ExpandedKey+Nb*Nr)
}
Round (State, RoundKey)
{
ByteSub (State);
ShiftRow (State);
MixColumn (State);
AddRoundKey (State, RoundKey)
}
FinalRound (State, RoundKey)
{
ByteSub (State);
ShiftRow (State);
AddRoundKey (State, RoundKey)
}
Rijindael 算法,可自由免费使用,安全、快速,暂未被破解。推荐使用。
(2)非对称密码
非对称加密可以用于解决密钥配送问题。
相对于对称密码加解密采用相同的密码,非对称密码加解密采用的是不同的密钥,公钥和私钥成对,公钥加密的信息,只有相应的私钥才可解密。
-
- 对称加密好比大家都用相同的锁对信息加密,加解密双方都拥有相同的钥匙,钥匙(密钥)丢了,锁(明文信息)就开了。
- 非对称加密,则是向大家派发锁(公钥),大家可以通过锁,对信息加密。锁是公开的,丢了也无所谓。但钥匙(私钥)只有一把,归信息的接受者所有。
非对称加密流程
- 接收方生成公私钥对,私钥由接收方保管
- 接收方将公钥发送给发送方
- 发送方通过公钥对明文加密,得到密文
- 发送方向接收方发送密文
- 接收方通过私钥解密密文,得到明文
无法解决公钥认证的问题,可能被中间人伪造公钥。
1.RSA(Rivest-Shamir-Adleman)
RSA加密算法是一种非对称加密算法,其玩法打破了以往所有加密算法的规则.在RSA出现之前,所有的加密方法都是同一种模式:加密解密的规则使用同一种方式.这种长达几个世纪的加密方案有一个致命的缺陷.在传递加密信息时,必须让对方拿到解密的规则才能正常解密.由于加密解密的规则一致,所以保存和传递"密钥",就成了最头疼的问题。
RSA加密/解密
-
- 使用公钥加密的数据,利用私钥进行解密
- 使用私钥加密的数据,利用公钥进行解密
没错,RSA加密使用了"一对"密钥.分别是公钥和私钥,这个公钥和私钥其实就是一组数字!其二进制位长度可以是1024位或者2048位.长度越长其加密强度越大,目前为止公之于众的能破解的最大长度为768位密钥,只要高于768位,相对就比较安全.所以目前为止,这种加密算法一直被广泛使用.
强度比较
密码强度,默认的 RSA 长度为 2048 bit
AES(bit) | RSA(bit) |
---|---|
128 | 3072 |
192 | 7680 |
256 | 15360 |
RSA的弊端
- 效率慢,因此工业场景下,往往是通过非对称加密配送密钥,对称加密加密明文的混合加密方式,最著名的如 SSL
- 公钥认证问题难。消息发送方无法确认公钥的身份问题,应该收到甲的公钥,却收到了乙的。
- 无法避免中间人攻击。可能被人于中间劫持后,发送一个伪造的公钥,此公钥加密后的密文,可以被劫持者解密,之后所有的密文都对劫持者透明了。
- 选择密文攻击,即通过不断的发送请求,分析请求的反馈,猜测密钥和明文。有改良算法 RSA-OAEP (Optimal Asymmetric Encryption Padding)最优非对称加密填充,该算法是通过对明文前加入认证信息头,若信息头校验失败,则拒绝请求。
- 密码劣化,随着算力的提升,密码的安全性下降。
2.其它非对称加密
-
- ECC(Elloptic Curve Cryptography) 椭圆曲线密码
- EIGamal
- Rabin
(3)混合密码系统
混合加密就是对称加密与非对称加密的结合。由于对称加密算法速度快,强度高,而非对称加密算法效率低,但能解决密钥配送问题。因此可以通过非对称加密配送对称密钥,再采用对称密钥用来加密的方式,实现网络的密钥配送与通信加密。
一般实践中,公钥通过证书认证配送,而对称加密用的密钥是每次随机产生。因此公钥密码的强度应该高于对称密码,因为对称密码只对当前一条信息负责,而非对称密码会影响到过完与未来所有的通信。
(4)分组密码加密模式
加密模式是针对密码分组或流加密所采用的迭代模式。
-
- 分组密码:Block Cipher,每次只能处理特定长度的数据的密码算法
- 流密码:对数据流进行连续处理的一类密码算法。需要保持内部状态
不同的分组加密方式,就有不同的加密模式:
-
- ECB 模式:Electronic CodeBlock mode 电子密码本模式。将明文分组加密后的结果,直接成为密文分组。最为简单直接,但有安全漏洞。因为分组规律简单,因此可以直接操作密文的分组后的顺序来修改明文的顺序,实现明文内容的修改。
- CBC 模式:Cipher Block Chaining mode 密码分组链接模式。首先将明文分组与前一个密文分组进行 XOR 异或运算,然后加密。由于第一个分组不存在前一个密文,因此需要提供一个分组长度的序列,称为初始化向量 Initialization Vector,缩写为 IV。
- CTS 模式:Cipher Text Stealing。
- CFB 模式:Cipher FeedBack mode 密文反馈模式。前一组密文被送回密码算法的输入端
- OFB 模式:Output FeedBack mode 输出反馈模式。密码算法的输出会反馈到密码算法的输入中的流密码
- CTR 模式:CountTeR mode 计数器模式。CTR 模式是一种通过将逐次累加的计数器进行加密来生成密钥流的流密码
(5)单向散列
单向散列技术是为了保证信息的完整性,防止信息被篡改的一项技术。
特点:
- 无论消息长度,计算出的长度永远不变
- 快速计算
- 消息不同,散列值不同,需要具有抗碰撞性 Collision Resistance具有单向性 one-way,不可由散列值推出原消息
- 弱抗碰撞性:给定散列值,找到和该消息具有相同散列值的另一条消息是困难的
- 强抗碰撞性:任意散列值,找到散列值相同的两条不同的消息是困难的
- 具有单向性 one-way,不可由散列值推出原消息
单向散列算法:
①MD(Message Digest)
MD 散列算法分为 MD4, MD5 两套算法,都可计算出 128 bits 的散列。MD 系列算法已经被中国科学家王小云破解(可于有限时间内找出碰撞)。
②SHA(Secure Hash Algorithm)
SHA 是单向散列算法的一个标准的统称,其下又分为 SHA-1, SHA-2, SHA-3 三套算法。
其中 SHA-1 可生成 160 bit 散列值,已被攻破,不推荐使用。
SHA-2 可生成不同长度的散列,如 256 bits (SHA-256), 384 bits (SHA-384), 512 bits (SHA-512),同时对输入的消息长度存在一定限制,SHA-256 上限接近于 2^64-1 比特,SHA-384、SHA512 则接近于 2^128-1比特。
SHA-3,是 2012 年被采用的最新标准,采用了 Keccak 算法。
Keccak 算法的优点:
- 采用与 SHA2 完全不同的结构
- 结构清晰,易于分析
- 适用于各种硬件,性能优越
- 可生成任意长度
- 对消息长度无限制
- 可采用双工结构,输入同时输出,提升效率
MD4,5, RIPEMD, RIPEMD-160, SHA-1, SHA-2 均采用 MD 结构(Merkle-Damgard construction)
SHA-3 采用海绵结构
算法 | 散列长度,bit | 输入长度 | |
---|---|---|---|
MD4 (Message Digest 4) | 128 | 已破解 | |
MD5 | 128 | 已破解 | |
SHA-1 | 160 | 2^64 = 2048 | 谨慎使用,不推荐 |
SHA2 (SHA-224) | 224 (32*8 - 32) | 2^64 | - 32 表示截去 32 bit,下同 |
SHA2 (SHA-256) | 256 (32*8) | 2^64 |
|
SHA2 (SHA-512/224) | 224 (64*8 - 288) | 2^64 |
|
SHA2 (SHA-512/256) | 256 (64*8 - 256) | 2^64 |
|
SHA2 (SHA-384) | 384 (64*8 - 128) | 2^128 | |
SHA2 (SHA-512) | 512 | 2^128 |
|
SHA-3 | 无限制 | ||
RIPEMD-128 | 已破解 | ||
RIPEMD-160 | 谨慎使用,是比特币采用的 | ||
RIPEMD-256 | |||
RIPEMD-320 |
对散列的攻击
-
- 暴力破解,冗余碰撞
-
- 生日攻击,针对强抗碰撞性
哈希碰撞是什么
所谓哈希(hash),就是将不同的输入映射成独一无二的、固定长度的值(又称"哈希值")。它是最常见的软件运算之一。
如果不同的输入得到了同一个哈希值,就发生了"哈希碰撞"(collision)。
黑客攻击的一种方法,就是设法制造"哈希碰撞",然后入侵系统,窃取信息。
如何防止哈希碰撞?
防止哈希碰撞的最有效方法,就是扩大哈希值的取值空间。
16个二进制位的哈希值,产生碰撞的可能性是 65536 分之一。也就是说,如果有65537个用户,就一定会产生碰撞。哈希值的长度扩大到32个二进制位,碰撞的可能性就会下降到 4,294,967,296 分之一。
更长的哈希值意味着更大的存储空间、更多的计算,将影响性能和成本。开发者必须做出抉择,在安全与成本之间找到平衡。
生日攻击
哈希碰撞的概率取决于两个因素(假设哈希函数是可靠的,每个值的生成概率都相同)。
-
-
- 取值空间的大小(即哈希值的长度)
- 整个生命周期中,哈希值的计算次数
-
这个问题在数学上早有原型,叫做"生日问题"(birthday problem):一个班级需要有多少人,才能保证每个同学的生日都不一样?
答案很出人意料。如果至少两个同学生日相同的概率不超过5%,那么这个班只能有7个人。事实上,一个23人的班级有50%的概率,至少两个同学生日相同;50人班级有97%的概率,70人的班级则是99.9%的概率(计算方法见后文)。
这意味着,如果哈希值的取值空间是365,只要计算23个哈希值,就有50%的可能产生碰撞。也就是说,哈希碰撞的可能性,远比想象的高。实际上,有一个近似的公式。
上面公式可以算出,50% 的哈希碰撞概率所需要的计算次数,N 表示哈希的取值空间。生日问题的 N 就是365,算出来是 23.9。这个公式告诉我们,哈希碰撞所需耗费的计算次数,跟取值空间的平方根是一个数量级。
这种利用哈希空间不足够大,而制造碰撞的攻击方法,就被称为生日攻击(birthday attack)。
给出生日攻击的数学推导。
至少两个人生日相同的概率,可以先算出所有人生日互不相同的概率,再用 1 减去这个概率。
我们把这个问题设想成,每个人排队依次进入一个房间。第一个进入房间的人,与房间里已有的人(0人),生日都不相同的概率是365/365
;第二个进入房间的人,生日独一无二的概率是364/365
;第三个人是363/365
,以此类推。
因此,所有人的生日都不相同的概率,就是下面的公式。
上面公式的 n 表示进入房间的人数。可以看出,进入房间的人越多,生日互不相同的概率就越小。
这个公式可以推导成下面的形式。
那么,至少有两个人生日相同的概率,就是 1 减去上面的公式。
哈希碰撞的公式
上面的公式,可以进一步推导成一般性的、便于计算的形式。
根据泰勒公式,指数函数 ex 可以用多项式展开。
如果 x 是一个极小的值,那么上面的公式近似等于下面的形式。
现在把生日问题的1/365
代入。
因此,生日问题的概率公式,变成下面这样。
假设 d 为取值空间(生日问题里是 365),就得到了一般化公式。
上面就是哈希碰撞概率的公式。
(6)消息认证码 MAC
单向散列可以解决篡改的问题,但消息是来自可信一方,还是来自伪装者,却无法解决。伪装者完全可以发送有害的信息和该信息的散列,而接受者却无法分辨。消息认证码技术可以解决此类问题。
消息认证码(Message Authentication Code),简写为 MAC。通过发送方与接收方共享密钥,通过该共享密钥对计算 MAC 值。
MAC 使用步骤
消息认证码使用步骤:
- 发送方 A 与接收方 B 共享密钥
- 发送方 A 通过密钥计算 MAC 值 = MAC-A
- 发送方 A 发送原消息 + MAC-A
- 接收方 B 对原消息通过密钥计算 MAC 值 = MAC-B
- 接收方 B 比较 MAC-A 与 MAC-B,若一致则成功。
MAC 实现
MAC 实现的关键,是获得一串需要与共享密钥相关而且足够有区分度的串。
因此,可以通过多种方式获得 MAC 值,如单向散列、分组密码截取最后一组作为 MAC 值、流密码、非对称加密等。
针对 MAC 的问题
- 密钥配送的问题,因为 MAC 需要发送者与接收者使用相同的密钥
- 重放攻击,窃取某一次通信中的正确的 MAC,然后攻击者重复多次发送相同的信息。由于信息与 MAC 可以匹配,在不知道密钥的情况下,攻击者就可以完成攻击。以下方法可以避免:暴力破解
- 序号,约定信息中带上递增序号,MAC 值为加上序号的 MAC。
- 时间戳,约定信息中带上时间戳
- 随机数 nonce,每次传递前,先发送随机数 nonce,通信是带上 nonce
- 无法防止否认,因为密钥是共享的,接收者可以伪造对发送者不利的信息。
(7)数字签名
由于 MAC 无法解决否认的问题是由于采用的相同的密钥,那么采用公私钥对就可以解决啦~
采用非对称加密的消息认证码的技术,就是数字签名。
-
- 在非对称加密中,私钥用来解密,公钥用来加密。
- 在数字签名技术中,私钥用来加密,公钥用来解密。
数字签名步骤
- 签名方 A 生成非对称公私钥对 public-key、private-key
- A 向消息接收方 B 发送公钥 publi-key
- A 采用 private-key 加密(一般是对消息的散列值进行加密),生成数字签名
- A 将消息与数字签名发往 B
- B 采用 public-key 解密数字签名
- B 验证数字签名
由于用于解密的是公钥,是公开的。因此任何人都可以验证数字签名。
数字签名实现
数字签名的核心,就是非对称加密,在前文已经介绍了一些非对称加密算法,均可用于数字签名之中。
常见的有如下几种:
-
- RSA
- ElGamal
- DSA
- ECDSA(Elliptic Curve Signature Algorithm),结合椭圆曲线算法的数字签名技术
- Rabin
数字签名的问题
数字签名由于采用了非对称加密,因此可以防止否认。但发送方怎么能知道所收到的公钥就是接收方私钥所对应的公钥呢?如果不小心采用了攻击者的公钥,然后接收了攻击者私钥签名的信息,公私钥完全匹配,于是信息就被接受了,那么就 GG 了。
因此,业界便推出了证书。由权威机构颁布,认证公钥的合法性,那么就 OK 啦~
(8)证书
对数字签名所发布的公钥进行权威的认证,便是证书。证书可以有效地避免中间人攻击的问题。
-
PKC
:Public-Key Certificate,公钥证书,简称证书。CA
:Certification Authority,认证机构。对证书进行管理,负责 1.生成密钥对、2. 注册公钥时对身份进行认证、3. 颁发证书、4. 作废证书。其中负责注册公钥和身份认证的,称为 RA(Registration Authority 注册机构)PKI
:Public-Key Infrastructure,公钥基础设施,是为了更高效地运用公钥而制定的一系列规范和规格的总称。比较著名的有PKCS(Public-Key Cryptography Standards,公钥密码标准,由 RSA 公司制定)、X.509
等。PKI 是由使用者、认证机构 CA、仓库(保存证书的数据库)组成。CRL
:Certificate Revocation List 证书作废清单,是 CA 宣布作废的证书一览表,会带有 CA 的数字签名。一般由处理证书的软件更新 CRL 表,并查询证书是否有效。
证书使用步骤
下图比较详细的阐述了证书的使用步骤
证书的层级
对于认证机构的公钥,可以由其它的认证机构施加数字签名,从而对认证机构的公钥进行验证,即生成一张认证机构的公钥证书,这样的关系可以迭代好几层,一直到最高一层的认证机构时该认证机构就称为根CA,根CA会对自己的公钥进行数字签名叫做自签名。
针对证书的问题
- 公钥注册前进行攻击
- 注册相似信息进行攻击,例如 Bob 和 BOB,一旦没看清,就会泄露信息
- 窃取 CA 的私钥进行攻击,CA 的私钥一旦被泄露,需要通过 CRL 通知客户
- 伪装成 CA 进行攻击,一般证书处理软件只采纳有限的根 CA
- 利用 CRL 发布时间差,私钥被盗-通知 CA-发布 CRL,均存在时间差,攻击者可以利用此时间差进行攻击
- 利用 CRL 发布时间差否认信息。发布有害信息-通知 CA 作废证书-发布 CRL,由于存在时间差,恶意消息的发布者完全可以否认恶意消息是由其发出的。