前言
最近学信息安全课程的时候,感觉自己会被各种公钥,签名,证书等一系列名词搞得腾腾转~据老师推荐《图解密码技术》讲解的比较清晰,当我用了一两天仔细看完,确实发觉信息安全方面也有一定的套路的,特在此记录下自己的小小见解。
密码学家的工具箱
如上图所示,针对不同的场景需要设计不同的应对措施。
各密码技术其实看成是压缩技术。
对称密码
定义
用相同的密钥进行加密和解密的技术。
实现
DES【基于Feistel网络】(已放弃)
密钥长度为64bit,7bit作校验
加密时:
输入为64bit明文
经过各种比特变换,根据的是固定的变换表
输出为64bit密文
对DES有兴趣的可以自己去研究研究:
DES加密算法原理简析
三重DES
用三个不同密钥,分别对明文进行 加密→解密→加密 的处理
输入明文还是64bit,但是密钥的长度是DES的三倍
AES【基于Rijndael】
输入为128bit明文(也可为192bit,256bit)
加密流程:
逐字节替换→平移行→混合列→与轮密钥进行XOR运算
分组密码
以上三种密码算法都属于分组密码。
1.定义
分组密码:每次只处理特定长度的一块数据的一类密码算法。
流密码:对数据流进行连续处理的一类密码算法。
2.模式
ECB:(电子密码本模式)
密文分组N =(明文分组N)*加密
CBC:(密文分组链接模式)【推荐】
密文分组1 =(初始化向量 XOR 明文分组1)*加密
密文分组N+1 =(密文分组N XOR 明文分组N+1)*加密
CFB:(密文反馈模式)
密文分组1 = 明文分组1 XOR (初始化向量 * 加密)
密文分组N+1 = 明文分组N+1 XOR (密文分组N * 加密)
OFB:(输出反馈模式)
密文分组N = [初始化向量 * (加密^N)]XOR 明文分组N
CTR:(计数器模式)【推荐】
密文分组N = (计数器CTR+N)*加密 XOR 明文分组N
各模式的区别:
Block cipher mode
缺陷
1.密钥配送问题
对称密码的密钥双方必须持有,不能让第三方截获。
应用
1.加密信息
一般来说信息时比较长的,采用对称加密算法能够很高效率计算出密文,从而保证信息的机密性。
公钥密码(非对称密码)
定义
用不同的密钥进行加密和解密的技术。加密用公钥,解密用密钥。
实现
RSA
密文 = 明文 E mod N (明文的E次方除以N的余数)
明文 = 密文 D mod N (密文的D次方除以N的余数)
公钥:(E,N)
私钥:(D,N)
密钥对:E,D和N
利用了质因数分解的困难度。
密钥对生成流程:
1)N = p * q (p 与 q 为大质数)
2) L = lcm(p-1,q-1);L是q-1和p-1的最小公倍数
3) 求E (1
ElGamal方式
利用了mod N 求离散对数的困难度。
Rabin方式
利用了mod N 求平方根的困难度。
椭圆曲线密码(ECC)
密钥长度较RSA短,通过将椭圆曲线上的定点进行特殊的乘法运算来实现的,利用了乘法运算的逆运算的困难度。
缺陷
1.易遭受中间人攻击
公钥密码只能确保两者间通信是机密的,但是出现第三方劫持消息时,第三方可以伪装成通信对方,从而获取消息的内容。
2.运行速度慢
分组长度太大,N至少是600bit以上,不建议直接加密消息内容本身。
应用
1.保护对称密码的密钥,解决密钥配送问题。
2.与对称密码组成混合密码系统,保护消息的机密性以及对称密钥的机密性,流程图如下:
单向散列函数
定义
将长消息转换为短散列的技术。
具有单向性以及抗碰撞性的性质。
实现
MD4,MD5
Message Digest 消息摘要的缩写
均能产生128比特的散列值
SHA-1,SHA-256,SHA-384,SHA-512
SHA-1产生160比特散列值 【已经被攻破】
剩下称为SHA-2
对Sha-1算法感兴趣的可以看:
Redis源码中探秘SHA-1算法原理及其编程实现
PIPEMD-160
产生160比特散列值
缺陷
1.无法识别出伪装的内容
攻击者可以劫持发送者的消息,然后发送恶意信息到接收方,接收方无法认证发送者的身份。
应用
1.保证内容是完整的,不被篡改
消息认证码
定义
能够识别通信对象发送的消息是否被篡改的认证技术。
实现
单向散列函数
HAMC方式
原理:
hash(opadkey||hash(ipadkey||message)
其中:
ipadkey = key XOR ipad
opadkey = key XOR opad
分组密码
CBC模式下最后一个分组密文消息作为MAC值
缺陷
1.易受重放攻击
内容不变,虽然认证了发送方和保证了内容完整,但是没有消息的序号,时间戳or随机数作消息区分。
2.发送方否认
A发送给B,但A可以否认自己发送过消息,因为共享密钥双方均持有,而且第三方介入也无法解决此问题。
应用
1.SWIFT
2.IPsec
3.SSL/TLS
数字签名
定义
能对第三方进行消息认证。
实现
对消息本身进行签名
对消息的散列值进行签名
PS:
原理是把公钥密码里公钥密钥反过来用,用密钥进行签名,公钥进行验证,此时不具备机密性,因为公钥是每个接收方所具有的。
缺陷
1.中间人攻击
中间人劫持通信,发送假的公钥给通信方,伪装成通信方。因为通信双方无法确认公钥是对方的。
2.被利用来攻击公钥密码
将用公钥加密的信息发送给有私钥的一方,从而获取解密后的信息。
应用
1.安全的信息公告
2.软件,邮件信息核实验证
3.公钥证书
对公钥进行数字签名。
4.SSL/TLS
证书(公钥证书)
定义
可靠的认证机构(CA)对公钥进行的数字签名。
CA是层次认证的,下级的公钥由上级CA进行签名认证,根CA是自签名。
实现
公钥基础设施(Public-Key Infrastructure)
组成:
用户:
1)生成密钥对,并将公钥信息交给认证机构去认证。(注册者)
2)从仓库获取注册者的公钥以及认证机构的数字签名,通过认证机构的公钥对签名进行认证。(使用者)
认证机构:
负责注册者的信息,并为注册者颁发证书。同时也能够作废证书。
仓库:
负责存储证书。
缺陷
1.公钥注册前受到截取
注册方向认证机构传送公钥信息的时候,被第三方截取偷换公钥。
解决方案:注册方使用认证机构的公钥对自己的公钥进行加密,同时,注册方也可以通过公钥的指纹确认认证机构。
2.利用CRL(证书作废清单)发布的时间差进行攻击
注册方私钥被窃取后,需要向认证机构申请作废证书,而使用者还没来得及更新自己的公钥信息,则会造成漏洞。另外一方面,注册方如果有恶意的倾向,也可以伪造成被窃取的迹象。
伪随机生成器
定义
可以生成伪随机数的软件。
随机数 = 种子 * 某种处理
随机数的性质:
1)随机性:数列完全杂乱无章
2)不可预测性:不能从过去的数列推测下一个出现的数
3)不可重现性:相同的数列不能重现
具备性质1称为弱伪随机数【不可用于密码技术】
具备性质1和2称为强伪随机数
具备性质1,2和3称为真随机数
实现
线性同余法
Rn = (A * Rn-1 + C) mod M 其中A和C需要小于M
该方法生成的数列有周期性,不具备不可预测性,不可用于密码技术
C语言的rand,Java的Random都是采用线性同余法的
单向散列函数法
Rn = (种子+n) * 单向散列处理
通过单向散列函数的单向性来支撑伪随机生成器的不可预测性。
密码法
Rn = (种子+n) * 加密处理
通过密码的机密性来支撑伪随机生成器的不可预测性。
ANSI X9.17
伪随机种子由内部状态值和加密密钥构成,其生成伪代码如下
while(true){
掩码 = 当前时间加密
伪随机数 = (内部状态 XOR 掩码)* 加密
输出伪随机数
内部状态 = (伪随机数 XOR 掩码)* 加密
}
应用
1.生成密钥
用于对称密码和消息认证码
2.生成密钥对
用于公钥密码和数字签名
3.生成初始向量
用于分组密码的CBC,CFB和OFB模式
4.生成nonce
用于防御重放攻击以及分组密码的CTR模式
5.生成盐
用于基于口令的密码(PBE)
密码技术的区别与联系
各个密码技术可谓是相辅相成的,他们都是为了解决相关问题而产生的。整个密码技术栈其实可以归纳如下:
对称密码的诞生其实是想解决消息的机密性,然而密钥的配送问题却是十分头痛。
公钥密码的诞生就是为对称密码的密钥配送护航,然而公钥密码却面临无法识别发送方的问题,也无法对传送的消息进行完整性验证。
单向散列函数的诞生能够确保消息的完整性,然而却无法认证消息发送方的身份。
消息认证码使用了单向散列函数和密钥,能够验证消息的完整性以及对消息进行认证,因为密钥是双方持有,但是不能对第三方进行认证,同时也不能防止否认。
数字签名巧妙逆用公钥密码,用密钥签名,用公钥认证,这样就能确定发送方的身份,也能保证消息完整性(因为签名也是用到了单向散列函数的)。但问题是无法保证公钥是可信任的。
证书的出现就是为了保护数字签名里的公钥是合法的,通过认证机构来对相关的公钥进行签名,以此来表明公钥是可信任的。
以上密码技术均需要生成相应的密钥或者密钥对,此时就需要伪随机数生成器,保证密钥不被攻击者看穿。
他们的联系其实可以通过下面这张图来解释:
密码技术本质其实是压缩,如下图: