对称加密算法
- 对称加密算法又可以分成流加密算法和块加密 算法。
- 流加密算法又称为序列加密算法或序列密码,它每次只对明文中的单个位或单个字节 进行加密操作。这种算法的优点是能够实时进行数据传输和解密,缺点是抗攻击能力比 较弱。
- 块加密算法又称为分组加密算法或分组密码,它每次对明文中的一组数据位进行加密 操作。现在使用的分组加密算法典型的分组长度是64位,因为经过密码学家们证明,这 个长度大到足以防止破译攻击,而又小到足以方便使用。块加密算法的优点是抗攻击能力 好,但是实时性稍微差一点。
算法的安全性
-
唯密文攻击。密码分析者通过各种途径得到了使用同一算法加密的密文,密码分 析者通过分析这些密文得出部分或全部明文消息,有时候也能够得到加密密钥,这样就可 以用来解密别的密文。这种情况下一般要求有较多的密文作为攻击资料
-
已知明文攻击。密码分析者在幸运的情况下,不但得到了密文,而且得到了这些 密文相应的明文。他们通过密文和明文的对照推导出加密的密钥或者设计一种新的算法, 使得使用相同密钥和算法加密的信息都能够被解密。
-
选择明文攻击。密码分析者不但可以得到密文和相应的明文,并且在必要的时候 可以选择被加密的明文,这样,密码分析者能够获取更多的信息用来获得加密的密钥或者 设计一种新的算法,使得使用相同密钥和算法加密的信息都能够被解密。
-
选择密文攻击。密码分析者可以选择不同的被加密的密文,而且能够得到相应的 明文,从而从这些信息中推导出密钥或设计新的解密算法。
-
选择密钥攻击。事实上密码分析者并不能选择加密密钥,这里指他可能具有各种 密钥之间相互关系的一些专业知识,从而用这些专业知识达到破译目的。
-
社会工程。事实上,很多情况下这是最有效的方法,就是通过欺骗、威胁、贿赂、 监视和其他非法手段对密钥持有人进行攻击,直到得到密钥为止。
上述的所有攻击手段 (除了最后一个)都可以作为我们评估一个算法安全性的参考依 据。事实上,没有一个算法可以宣称是绝对安全的,各种算法有不同层次的安全性。对算 法安全性的评估没有统一的标准,但基本上可以从以下几个方面考虑。
- 价值代价。如果破译算法的代价大于加密数据的价值,算法可以算是安全的。
- 时间代价。如果破译算法所需要的时间比加密数据需要保密的时间更长,算法可 以算是安全的
- 可能性。如果使用该密钥加密的数据量远远小于破译该算法需要的数据量,算法 可以算是安全的。
根据破译算法程度的不同,可以将算法安全性分为五个等级,下面的安全性由低到高 列出。
- 全部破译。能得到密钥,使得所有使用该密钥加密的密文都能被恢复成明文。
- 全盘推导。通过分析,可以找到一个替代算法,在不知道密钥的情况下恢复出所 有该密钥加密的明文。
- 局部推导。能够从得到的密文中计算出相应的明文。 信息推导。通过分析可以得到部分有关密钥或明文的信息。 不能破译。无论给出多少密文信息,都不能恢复出明文信息。事实上,只要使用蛮力攻击,几乎所有实际的算法都是可以破译的 (除了一次一乱密码)。 在实际使用中,我们只要考虑一个算法在计算上的安全性就可以了。也就是说,当一 个算法用当前所能得到的所有资源都不能破译的时候,就可以说这个算法是安全的。破译 算法的难易程度可以用攻击算法的复杂性来衡量。
攻击算法的复杂性从下面三个方面衡量。
- 数据复杂性。即攻击时需要的数据量。
- 计算复杂性。完成攻击计算所需要的时间或计算量。
- 存储量需求。进行攻击所需要的最大存储空间。
一般来说,攻击的复杂性值等同于这三个因素中最小的值。
- 复杂性一般用数量级来表示,比如一个算法的计算复杂性是2^128,那么破译这个算法 就需要2128次运算。这可能用最好的计算机也要花费1015年以上的时间才能完成计算,这 在实际中是不可行的,那么该算法也就是安全的。当然,现在的计算机速度快速发展,目 前看起来不可能破解的算法过几年或几十年可能就能轻而易举地被破解。但是没有必要担 心,只要你使用的算法在最近的几年或几十年是安全的,那么就是一个计算上安全的算 法。以后计算能力增强了,自然会出现更强大的加密算法
非对称算法的存在的问题
- 公开密钥算法比对称加密算法慢
- 公开密钥算法抵抗选择明文攻击的能力较低。这是因为公开密钥算法的加密密钥 是公开的,攻击者可以尝试加密各种明文以跟获取的密文相对照来确定明文。如果明文的 取值范围是有限的,这种攻击就很有效。而对称加密算法因为密钥都是秘密的,所以不容 易受到这种攻击。
单向散列函数
- 单向散列函数结合了单向函数和散列函数的特点,是指在一个方向上工作的散列函 数。也就是说,从输入值得到散列值很容易,但使散列值等于某一个值却是非常困难的事 情。好的单向散列函数应该具备无冲突的特点。所谓无冲突,并非真正意义上的无冲突, 它实际上是指两个不同的输入产生相同散列值的可能性非常小。一般来说,一个好的单向 散列函数如果其输入值有一位改变,那么将引起其散列值一半数据位的改变。所以,已知 一个散列值,要找到一个输入值,使得其散列值等于已知散列值在计算上是不可能的。
- 单向散列函数在密码学中的应用非常广泛,基本上来说可以分为不加密散列值和加密 散列值的应用。不加密的散列值一般用作文件指纹或数据指纹。
- 加密的散列值一般称为消息鉴别码 (MAC),它的功能跟单向散列函数基本一样,只有拥有解密密钥的人才能验证该信息。单向散列函数还应用在数字签名中以提高运算 的速度。
数字签名的弊端
- 数字签名的抗抵赖功能时,基于一个隐性前提,即私钥跟签名者个人是 绝对等同的,但是私钥和其使用者是两个不可以等同的实体,因此 使用者完全可以声明私钥丢失造成数据的泄露。
- 增加限制的措施,比如将私钥隐藏在不能读出的硬件模块 中,用于密码用途的智能卡就是这样的设备。
- 采用时间标记也可以一定程度上限制这种抵 赖行为,至少可以确保以前旧的签名依然有效。事实上,时间标记在实际的数字签名应用 中经常采用,它可以防止签名重用和信息重放等攻击。
多重签名
- 多重签名也是实际应用中可能经常遇到的问题,一般都使用单向散列函数,多个签名 者可以分别对文件的散列值进行签名,然后再一起发给接收者。如果不使用单向散列函 数,问题会麻烦得多。一种可能的方案是签名者分别对原来的文件签名,这样得到的签名 文件内容将是原来的n倍,n等于签名者的个数;另一种可能方案是后一个签名者在前一 个签名者的签名基础上继续进行签名,直到所有签名者都完成签名,但是这样同样带来一 个问题,即验证的时候必须先验证最后一个签名者的签名,然后往前类推,这带来了应用 上的限制。
高级密钥交换协议
连锁密钥交换协议
- 连锁密钥交换协议是解决中间人攻击的一个巧妙的协议,当然不是一个能够完全防止 中间人攻击的协议,只是增加了中间人攻击的难度。它基于这样一种技术,即拥有加密消息的一半是没有意义的,不能进行解密。这种技术是存在的,最简单的例子就是分组加密算法,因为分组加密算法中消息的解密依赖初始向量,后面部分消息的解密要依靠前面的 消息,所以可以先发送后面部分的消息,然后再发送前面部分的消息,这样,即使先得到 消息的后面部分也是不能解密信息的。
- 连锁密钥交换协议的基本步骤如下。
- 连锁协议最重要的特点是,双方发送消息的时候是相互连锁的,也就是说,通信一方只有收到另一方发送的消息的一部分后才会继续协议,否则就会等待或终止协议。这样的 信息发送连锁,使得中间的攻击者没有办法进行窃听式的中间人攻击。
- 攻击者可以在通信中截获通信双方的公钥,并用自己的公钥替代通信双方的公开密 钥。但是当攻击者在第2步截获到消息的时候,虽然该消息是用他的公钥加密的,但是因 为只有一半,所以至少暂时没有办法解密,同时因为协议是连锁的,所以他这时候只有两 个选择,要么伪造一个假消息给Jim,要么终止攻击行为,我们假设他有勇气继续碰运 气。在第3步的时候,他存在同样的困难选择,只好再伪造一个假消息。这样,当他在后 续的两步收到可以解密的全部消息时,他已经没有办法修改以前伪造的消息。当然,这样 他还可以用伪造的消息假装跟通信双方继续进行交谈,但是这样显然比窃听获取有用的信 息更加困难。因为 他不使用自己的公钥替换通信双方的公钥,一旦分组第一块成功之后,就没有机会解密双方通信的内容;但是一旦替换了,就只能一直替换下去,就无法完成窃听的功能。
使用证书的密钥交换协议
- 基于公钥算法的密钥交换协议 之所以被中间人进行攻击是因为无法将公钥和个人的身份证明相互关联。所以攻击者可以随意地用任何公开密钥替代通 信双方的公开密钥。假设我们使得公开密钥跟身份证明是紧紧联系在一起的,那么攻击者 就难以通过简单的替换公开密钥的方式冒充通信任一方。数字证书或者说数字签名技术可 以将公开密钥跟某个人的身份证明关联在一起。
- 在这种高级密钥交换协议中,需要一个可信任的第三方,这个第三方能够验证任何想 通过验证的用户,他是绝对可信的。他用自己的私钥对一个用户的公钥和用户个人信息进 行签名,形成一个数字证书。可信任的第三方自己的公钥是任何用户都可以取得的,这样 任何用户都可以通过验证这个第三方的数字签名来确定通信对方发送过来的公钥是不是真 的是他自己的公钥。这样,攻击者想要冒充第三方就很困难,因为他没有可信任的第三方 的私钥,没有办法伪造他的签名。
- 当然,这种使用证书的密钥交换协议很依赖可信任的第三方,如果可信任的第三方受 到攻击,整个通信系统的安全性将面临威胁,但是这种攻击显然比中间人攻击难得多。事实上,即便攻击者取得了对第三方私钥的控制权,也难以对以前签发的公钥证书进行更方便的攻击。
不需要密钥交换协议的安全通信