密码学发展概述
密码学应用非常广泛 大致的讲就是从古典密码学到现代密码学
这两者有一个最大的不同在于:kerckhoff法则
kerckhoff法则:
加密不应该依赖于加密算法的保密性 而是要依赖于秘钥的保密性
即使加密算法开源 攻击者得不到秘钥就无法通过密文解出明文
古典密码学:
加密的效果依赖于加密算法本身的保密性 当加密算法被得到后 秘钥会被轻易解出 从而破解密文
比如我们常见的 栅栏密码 凯撒加密 单表代换密码
这些加密手段容易被破解 比如栅栏密码和凯撒密码 其只是做了移位运算
通过穷举可以得出 也可以通过普遍规律推测 比如英文字母中最常用的为e 那么密文中出现次数最多的英文字母是e的可能性很高 通过此就轻易地推断出了明文
现代密码学:
现代密码学 现代密码学都可以归约为一个难解的数学问题
我们现在常用的公钥密码体质基于三种数学问题:
- 大数分解问题
- 离散对数问题
- 基于椭圆曲线的离散对数问题
刻画敌手能力:
在开放信道中攻击者可能会拥有:
加密算法
密文
密文对应明文
加密盒子 能够根据明文产生密文
强大的计算能力
- 已知明文攻击(kpa): 即已知明文以及明文对应的密文 通过这些信息推断出加密算法与秘钥
- 选择密文攻击(cca): 即可以使用明文得到密文 并且可以有限的将密文转换为明文 求出算法和秘钥
- 选择明文攻击(cpa): 可以使用明文得到密文 知道加密算法 需要推出秘钥
- 唯密文攻击(coa): 只能看到密文 通过穷举或者密文统计规律求出明文或者秘钥
大数分解问题
在这一问题下诞生了RSA算法
其计算方式如下:
选择两个大的素数 p q
p*q=n
n作为秘钥组成的一部分
φ(n)=(p-1)*(q-1)
从一到φ(n)之间选择一个与φ(n)互质的数e作为私钥
e*d = 1(mod φ(n))
求出公钥
最终加密解密采用秘钥(e,n) (d,n)
其安全性依赖于两个大质数的乘积n
显然n是很容易求出的 但通过n求p,q是很难的
p与q当这两者被得到后 秘钥将被轻易解出
由于大数分解其确定性 不能实现cpa安全 即选择明文攻击我可以通过任意明文得到密文
加密计算: M^e mod n=C
解密计算: C^d mod n=M
其中(e,n) (d,n)为秘钥对
离散对数问题
这一数学问题衍生出了dh秘钥交换 以及ElGamal秘钥交换
离散对数:(m ^ X)mod p = k1 已知k求出X是很难的
((m ^ Y)mod p)^X mod p = key=(m^XY)mod p
离散对数问题天生存在随机性 同一个明文加密后得到的密文不一定会一致
作为一个非确定性算法 能够保证cpa安全
dh秘钥交换时 依靠等式((m ^ Y)mod p)^X mod p = key=(m^XY)mod p
k1=(m^X)mod p
k2=(m^Y)mod p
双方会交换k1 k2 信道上只会交换k1 k2 攻击者得不到XY就无法求出秘钥
key=k1^Y mod p=k2^X mod p
最终使用key做秘钥进行信息交换
在这一过程中攻击者就算监听信道 也无法得到有效的信息 秘钥不会因此暴露
随机数生成
随机数在网络中的应用很多 可以通过随机数的生成防止重放攻击
重放攻击字面意思就是重新发送一个服务器已经接受过的数据包从而达到 绕过身份验 重复触发动作的目的
随机数的特性:
分布均匀: 即序列中每个字符出现的概率要相等
独立: 即下一个出现的字符与上一个字符的出现无关
不可预测性: 后续成员无法预测
如今使用的主要是伪随机数生成器:
使用算法确定性的计算产生随即位 取一个固定值 我们称之为种子 通过种子经过算法的计算后得到伪随机位流 而种子一般由
真随机数生成器生成:
真随机数生成器使用非确定性熵源生成随机数
伪随机数算法分为两类:
专用算法 为生成伪随机数专门设计
现有的密码算法 能够随机化输入数据 哈希函数 消息认证码
MAC与哈希函数
哈希函数:
有人称之为摘要算法 非常形象 哈希算法可以将不定长度的内容转换成为一个定长的字符串
哈希算法的特征有:
抗碰撞性:即消息之间不会碰撞 不同的信息源生成的摘要结果不会重复
雪崩效应:信息源的一点点变化都会引起信息发生巨大的改变
不可逆性:不能通过密文经过任何计算得出明文
其虽然抗碰撞但是不能完全不发生碰撞:
因为哈希函数的结果位数是有限的 有限的位数只能存储有限的信息 所以哈希函数一定会存在碰撞 但是在信息长度一定的范围内碰撞是很难发生的
MAC称为消息认证码 其可以被看做与秘钥相关联的单向哈希散列函数:
就像是加盐的哈希 没有盐值就得不到消息的哈希值
双方约定好一个秘钥 用于消息认证的鉴定
HMAC是MAC的一种 其基于哈希算法
通过 sha系列 md5 等哈希算法加盐生成唯一的消息验证码
公钥密码体制:
密码被分为公钥和私钥 私钥只能由自己保管 公钥可以交换传递
私钥和公钥互相能进行加密解密
一般使用对端的公钥 加密数据实现保密性
使用自己的私钥 加密数据实现数据的不可抵赖性
如今 安全性较高的并非rsa这种基于大数分解的算法 而是dh,elgamal这种基于离散对数的加密算法