1.引言
密码加密方法可以是通过一定规律平移(凯撒密码)、替换(Enigma)进行编码。密码破解可以是暴力破解和频率分析。密钥本身是一个巨大的数字或者密钥空间的大小(由密钥长度决定)
2.密码学常用的算法:
对称加密:DES、三重DES、AES(现在最流行使用,安全性最好,也就是Rijndael算法)。
非对称加密(公钥密码):RSA(密文=明文E次方modN,{E,N}组合是公钥,明文=密文D次方modN,{D,N}组合是私钥,现在最流行使用,利用对大整数N的质因分解难度)EIGamal(利用mod N下求离散对数的难度,密文是明文两倍)、Rabin(利用mod N下求平方根的难度)、椭圆曲线密码(ECC,秘钥比RSA短。利用求椭圆曲线上特定点的特殊乘法运算的逆运算的困难度)
伪随机数生成算法:线性同余法(不具预测性,不用于密码技术)、单向散列函数、密码法、ANSI X9.17(ANSI X9.31)
单向散列函数:MD4(已经不使用)、MD5(已经被破解)、SHA-1(SHA-160,最大长度:2的64次方-1)、SHA-2(SHA-256、SHA-384、SHA-512,最大长度:2的128次方-1)、SHA-3(Keccak算法,SHA-3-224、SHA-3-256、SHA-3-384、SHA-3-512)。数据完整性检查,防止被篡改。
3.实际应用
(1)消息认证码(MAC):
双方持有同样的秘钥,防止伪装,确认发送方身份,是确认完整性与身份认证的技术,但无法由第三方证明某一方否认消息是否曾发送。根据任意长度的消息,通过过双方共享的密钥,计算生成固定长度数据。可以认为消息验证码是一种 与密钥相关联的单向散列函数。A将B所发送的MAC与A自己生成的MAC进行对比,如果两者一致则认证成功。HMAC(SHA-2实现)、AES-CMAC(AES的CBC模式)流密码和公钥密码。
认证加密(消息认证码+对称加密AE或AEAD):Encrypt-then-MAC(Encrypt-and-MAC、MAC-and-Encrypt,防止伪造密文,让服务器解密来套取信息的攻击)、GCM(GMAC,AES128+CTR分组模式)、CCM(AES128+CBC分组模式)
防止重放攻击(加序列号、加时间戳、nonce通信前发送一个一次性随机数)
(2)数字签名:
识别篡改和伪装,并且防止否认,保证特定的签名者与特定的消息是绑定一起的,但无法解决解签的公钥是否是真正发送者发出的问题,即公钥的合法性。利用RSA非对称加解密算法,基于私钥只有一人持有的事实来保证签名认证的唯一性,而公钥可以多人持有进行验证签名的特点,而不是基于机密性的特点。
私钥加密->公钥解密
公钥加密->私钥解密
签名->私钥加密(一般不会对整个消息进行私钥加密,加密数据量大加密慢、发送数据量增大。消息+签名(消息的散列值+私钥加密))
验签->公钥解密
签名算法:RSA、EIGamal、DSA、ECDSA、Rabin
(3)证书(公钥证书):
证书=公钥+认证机构对该公钥施加的签名,通过可信赖的第三方,即认证机构保证公钥的合法性。
证书一般有:
(4)PKI(公钥基础设施):
由用户、认证机构、证书仓库组成
用户向机构发起的操作:
生成密钥对(可以用户自己生成)
注册公钥,申请证书
申请作废已注册
机构和用户有关的操作:
提供CRL(证书作废清单)、查询用户自己的证书是否过期
证书的层级结构:
A(根CA,对自己的公钥签名称为自签名)->B(B的公钥由A签发认证)->C(C的公钥由B签发认证).........->用户(用户的公钥由N机构签发)
A/B/C/用户
签名流程:
A(根CA,对自己的公钥签名称为自签名)
B 生成公钥由A签发认证
C 生成公钥由B签发认证
用户 生成公钥由C签发认证(可以是C生成秘钥对,或者自己生成密钥对)
验签流程:
用户1使用根CA证书里的公钥,对根CA平台颁发给B的证书进行验签->用户1使用B的公钥,对CA平台B颁发给C的证书进行验签->用户1使用C的公钥,对CA平台C颁发给用户2的证书进行验签
一般根CA的公钥内置在操作系统,或者用户到官网自行下载
(5)密钥生成:
1.硬件随机数器件或伪随机生成算法生成
2.口令生成秘钥:口令的单向散列函数的输出作为密钥 或者 口令+随机数(盐)用单向散列函数输出作为密钥。一般用于自己加密,自己解密,防止别人看到加密的东西,如进入计算机系统、加密文档
内容加密密钥:CEK
密钥加密密钥:KEK,一般口令+盐生成
(6)解决密钥配送方法:
1.事先共享秘钥(线下处理,但基本不使用)
2.密钥分配中心解决。秘钥中心生成所有员工的秘钥,用户注册时是线下取自己秘钥,当A用户向B用户发起通信,秘钥中心将生成临时会话秘钥,临时会话秘钥将会通过A用户的秘钥加密后,发送给A用户,A用户解密得到临时会话秘钥。B用相同的方法也得到临时会话秘钥,A和B进行加密会话。(仍然是不安全的,是基于事先共享秘钥,用计算机管理所有秘钥,一旦计算机被入侵或故障,将无法保证安全性)
3.Diffie-Hellman密钥交换。
4.使用公钥密码
密钥交换技术:
Diffie-Hellman密钥交换:
G的(A*B)次方mod P
P是很大的质数(不需保密,用户1向用户2发送)
G是P的生成元,可以是较大的数字(不需保密,用户1向用户2发送)
A是用户1生成的随机数(需要保密,只有用户1自己知道)
B是用户2生成的随机数(需要保密,只有用户2自己知道)
用户1和用户2交换 G的A次方mod P G的B次方mod P
经过简化运算,用户1和2得到相同秘钥:G的(A*B)次方mod P
(7)SSL/TLS/HTTPS:
TLS(传输层安全)是在SSL3.0(安全套接层)基础上设计的协议,可以理解为SSL3.1,现在一般不会分开来说,直接说SSL/TLS加密通信。HTTPS是在SSL/TSL之上承载HTTP协议。
TLS分为握手协议和记录协议,握手协议用于协商密码算法和共享秘钥,记录协议用于负责对消息加密和消息认证码(压缩解压缩、加密解密、计算和校验MAC等)。
握手协议分为4个部分:握手协议/密码规格变更协议/警告协议和应用数据协议
握手协议:
密码规格变更协议:用于密码切换同步,传达变更密码方式的信号。客户端也可以重新发起握手请求再次变更密码套件。
警告协议:用于发生错误时通知通信对象,如握手产生的异常、消息认证码错误、压缩数据无法压缩等
应用数据协议:用于传输上层应用数据,如HTTP的请求与响应。
TLS记录协议:负责消息的片段分割、压缩、加密、数据认证。计算消息认证码时一般会加入片段的编号,防止重放攻击。加密使用对称加密算法,CBC模式,CBC模式的初始向量(IV)通过主密码生成 ,对称密码的算法、共享秘钥由握手协议提供。从TLS 1.3开始,协议就禁用了TLS压缩,防止CRIME漏洞攻击。
主密码生成:使用RSA公钥密码时,客户端在发送ClientKeyExchange消息时,将经过加密的预备主密码(生成的公钥)一起发送给服务器。使用Diffie-hellman秘钥交换时,客户端在发送ClientKeyExchange消息时,将Diffie-hellman公开值发送到服务器,服务器和客户端计算出相同的预备主密码。再根据预备主密码计算出主密码(对称加密的密钥、消息认证的秘钥、CBC初始化向量)