三、密钥,随机数与应用技术
0x11 密钥
密钥与明文等价,信息的机密性不应该依赖于密码算法本身,而是应该依赖于妥善保管的密钥。
- 对称密码的密钥和公钥密码的密钥:确保机密性
- 消息认证码的密钥和数字签名的密钥:用于认证
- 会话密钥和主密钥:session key一次性密钥,master key,一直使用
- 用于加密内容的密钥和用于加密密钥的密钥:CEK内容加密密钥,KEK密钥加密密钥
密钥管理:生成密钥(随机数、口令生成)—配送密钥(事先共享、密钥分配中心、公钥密码)—更新密钥(当前密钥哈希作为下一个密钥)—保存密钥(将密钥再加密,仅保存KEK)—作废密钥()
Diffie-Hellman 密钥交换(Diffie-Hellman key exchange):协商生成一个共享密钥,而这一秘密数字就可以被用作对称密码的密钥。IPsec中就使用了经过改良的Diffie-Hellman密钥交换。根据有限域的离散对数问题而产生,G的A方 mod P计算A复杂度。
- Alice 向 Bob 发送两个质数 P 和 G,P必须非常大,G是P的生成元,不需保密,谁生成都行
- Alice生成一个随机数A,A是一个1~P-2之间的整数。保密
- Bob生成一个随机数B,B是一个1~P-2之间的整数。保密
- Alice 将 G的A次方 mod P 这个数发送给 Bob,不需保密
- Bob将G的B次方 mod P 这个数发送给 Alice,不需保密
- Alice 用 Bob 发过来的数计算 A 次方并求 mod P,共享密钥=G的 A×B次方 mod P,Bob同理
0x12 随机数
- 随机性——不存在统计学偏差,是完全杂乱的数列
- 不可预测性——不能从过去的数列推测出下一个出现的数
- 不可重现性——除非将数列本身保存下来,否则不能重现相同的数列
弱伪随机数:只具备随机性
强伪随机数:具备随机性和不可预测性
真随机数:具备随机性、不可预测性、不可重现性
伪随机数生成器PRNG:软件实现,无法真正生成真随机数;具有内部状态,通过外部输入的种子生成随机数列
方法:
- 杂乱的方法:周期短、算法差
- 线性同余法(linear congruential method):(A×内部状态+C) mod M,不具备不可预测性
- 单向散列函数法:内部状态作为计数器,散列函数计算内部状态输出即随机值,具备不可预测
- 密码法:用机密性确保伪随机数不可预测性。用密钥将随机数加密
- ANSI X9.17:将时间与内部状态XOR后加密输出,用于pgp
0x13 PGP
pretty good privacy,密码软件,由用户自己决定信任谁
生成密钥对:gpg2 --full-gen-key
gpg2 --export --armor
加密和解密
-
LRNG生成session_key
-
使用asym_Pubkey公钥加密session_key得到asym_session_key
-
压缩message,使用session_key对称加密压缩后message得到sym_message
-
拼合asym_session_key和sym_message得到二进制转文本,得到报文数据
-
报文数据拆分,文本转二进制得到asym_session_key和sym_message
-
接收者输入口令password,得到口令带盐散列值hash_key,对本地保存经过对称加密的私钥sym_asym_Prikey使用hash_key解密得到asym_Prikey,即公钥密码中的私钥
-
对asym_session_key使用asym_Prikey解密,得到session_key拿去解密sym_message,得到压缩message
-
解压缩,得到message
生成和验证数字签名
-
发送者输入口令password,得到口令带盐散列值hash_key,对本地保存经过对称加密的私钥sym_asym_Prikey使用hash_key解密得到asym_Prikey,即公钥密码中的私钥
-
对消息message进行哈希得到散列值hash_message,使用asym_Prikey进行数字签名(加密),得到sigh_hash_message
-
拼合sigh_hash_message和message,压缩,二进制转文本,得到报文数据
-
报文数据文本转二进制后解压缩,拆分得到sigh_hash_message和message,
-
对message哈希得到hash_message1
-
sigh_hash_message使用发送者公钥asym_Pubkey验签(解密),得到hash_message2
-
使用hash_message1与hash_message2对比,一致即验签通过
生成数字签名并加密以及解密并验证数字签名
-
发送者输入口令password,得到口令带盐散列值hash_key,对本地保存经过对称加密的私钥sym_asym_Prikey使用hash_key解密得到asym_Prikey,即公钥密码中的私钥
-
对消息message进行哈希得到散列值hash_message,使用asym_Prikey进行数字签名(加密),得到sigh_hash_message
-
拼合sigh_hash_message和message,压缩
-
LRNG生成session_key
-
使用asym_Pubkey公钥加密session_key得到asym_session_key
-
使用session_key对称加密3,得到sym_sigh_message
-
拼合asym_session_key和sym_sigh_message得到二进制转文本,得到报文数据
-
报文数据拆分,文本转二进制得到asym_session_key和sym_sigh_message
-
接收者输入口令password,得到口令带盐散列值hash_key,对本地保存经过对称加密的私钥sym_asym_Prikey使用hash_key解密得到asym_Prikey,即公钥密码中的私钥
-
对asym_session_key使用asym_Prikey解密,得到session_key拿去解密sym_sigh_message,得到压缩后的sigh_hash_message和message
-
解压缩,拆分得到sigh_hash_message和message
-
对message哈希得到hash_message1
-
sigh_hash_message使用发送者公钥asym_Pubkey验签(解密),得到hash_message2
-
使用hash_message1与hash_message2对比,一致即验签通过
信任网
不依赖特定认证机构,通过每个用户对公钥互相签名来构建信任网
0x14 SSL/TLS
用于承载HTTP,SMTP,POP3等协议,当使用SSL/TLS时,URL以https开头,支持选择密码套件,支持HTTP,SMTP,POP3
SSL3.0存在PODDLE攻击不安全,TLS1.0实际相当于SSL3.1
TLS协议是由TLS记录协议(TLS record protocol)和TLS握手协议(TLS handshake protocol)这两层协议叠加而成的。位于底层的TLS记录协议负责进行加密,而位于上层的TLS握手协议则负责除加密以外的其他各种操作。上层的TLS握手协议又可以分为4个子协议(握手协议,密码规格变更协议,警告协议,应用数据协议)。
TLS握手协议中的密码技术:
密码技术 | 作用 |
---|---|
公钥密码 | 加密预备主密码 |
单向散列函数 | 构成伪随机数生成器 |
数字签名 | 验证服务器和客户端的证书 |
伪随机数生成器 | 生成预备主密码 根据主密码生成密钥(密码参数) 生成初始化向量 |
TLS记录协议的密码技术:
密码技术 | 作用 |
---|---|
对称密码CBC | 确保片段机密性 |
消息认证码 | 确保片段完整性并认证 |
认证加密AEAD | 确保片段机密性和完整性并认证 |
攻击:密码技术;OpenSSL心脏出血;POODLE攻击;FREAK攻击和密码产品出口管制;对伪随机数生成器攻击;利用证书时间差;
0x15 密码技术与现实社会
对称密码是一种用相同的密钥进行加密和解密的技术,用于确保消息的机密性。在对称密码的算法方面,目前主要使用的是AES。尽管对称密码能够确保消息的机密性,但需要解决将解密密钥配送给接收者的密钥配送问题。
公钥密码是一种用不同的密钥进行加密和解密的技术,和对称密码一样用于确保消息的机密性。使用最广泛的一种公钥密码算法是RSA,除此之外还有EIGamal和Rabin等算法,以及与其相关Diffie-Hellman密钥交换(DH)和桐圆曲线Diffie-Hellman密钥交换(ECDH)等技术和对称密码相比,公钥密码的速度非常慢,因此一般都会和对称密码一起组成混合密码系统来使用。公钥密码能够解决对称密码中的密钥交换问题,但存在通过中间人攻击被伪装的风险因此需要对带有数字签名的公钥进行认证。
单向散列函数是一种将长消息转换为短散列值的技术,用于确保消息的完整性。在单向散列函数的算法方面,SHA-1曾被广泛使用,但由于人们已经发现了一些针对该算法的理论上可行的攻击方式,因此该算法不应再被用于新的用途。今后我们应该主要使用的算法包括目前已经在广泛使用的SHA-2(SHA-224、SHA-256、SHA-384、SHA-512),以及具有全新结构的SHA-3(Keccak)算法。单向散列函数可以单独使用,也可以作为消息认证码、数字签名以及伪随机数生成器等技术的组成元素来使用。
消息认证码是一种能够识别通信对象发送的消息是否被墓改的认证技术,用于验证消息的完整性,以及对消息进行认证。消息认证码的算法中,最常用的是利用单向散列函数的HMAC。HMAC的构成不依赖于某一种具体的单向散列函数算法。消息认证码能够对通信对象进行认证,但无法对第三方进行认证。此外,它也无法防止否认。消息认证码也可以用来实现认证加密。
数字签名是一种能够对第三方进行消息认证,并能够防止通信对象做出否认的认证技术。数字签名的算法包括RSA、EIGamal、DSA、楠圆曲线DSA(ECDSA)、爱德华兹曲线DSA(EDDSA)等。公钥基础设施(PKI)中使用的证书,就是对公钥加上认证机构的数字签名所构成的。要验证公钥的数字签名,需要通过某种途径获取认证机构自身的合法公钥。
伪随机数生成器是一种能够生成具备不可预测性的比特序列的技术,由密码和单向散列函数等技术构成。伪随机数生成器用于生成密钥、初始化向量和nonce等。
压缩技术:
- 和确保整个明文的机密性相比,确保密钥的机密性更容易,因此使用密码
- 和检查整个消息的完整性相比,检查散列值的完整性更容易,因此我们使用单向散列函数
- 和对整个消息进行认证相比,对MAC值认证更容易,因此使用消息认证码
- 和对整个消息进行认证相比,对签名进行认证更容易,使用数字签名
- 和确保整个随机数列的不可预测性相比,确保随机数种子的不可预测性更容易,使用伪随机数生成器
总结:
- 密钥是机密性的精华
- 散列值是完整性的精华
- 认证符号(MAC值和签名)是认证的精华
- 种子是不可预测性的精华
比特币
- 比特币是一种基于P2P 网络的支付结算系统,在通过公钥生成的地址之间进行交易
- 转账的合法性通过发送者用私钥进行数字签名来证明
- 所有的交易记录都保存在公开账簿(区块链)中,任何人都可以对其中的记录进行验证(透明性)
- 通过运用单向散列函数使得对区块链的篡改变得非常困难
- 通过工作量证明防止伪造和区块链产生分支
- 为了添加新区块,矿工需要计算出前面若干比特为0的符合条件的散列值(挖矿)。如果成功添加新区块,矿工将得到一定数量的比特币作为奖励
量子密码
无法准确测出光子偏振方向;测量行为本身会导致光子状态发生改变