第11章 加密算法与随机数

11.1 概述

***密码系统的方法

密码分析者***密码系统的方法主要有以下三种:

1)穷举***

    所谓穷举***是指密码分析者采用依次试遍所有可能的密钥对所获密文进行解密,直至得到正确的明文.

2)统计分析***

    所谓统计分析***就是指密码分析者通过分析密文和明文的统计规律来破译密码。

3)数学分析***

所谓数学分析***是指密码分析者针对加解密算法的数学基础和某些密码学特性,通过数学求解的方法来破译密码。

 

破译密码的类型

1唯密文***Ciphertext-only attack

已知:

   C1EK ( P1 )C2EK( P2 )……CiEK(Pi)

推导出:

   P1P2……PiK或者找出一个算法从Ci1EK(Pi1 )推出Pi1

 

2已知明文***Know-plaintext attack

已知:

 P1C1EK ( P1 )P2 C2EK(P2 ) …… PiCiEK( Pi)

推导出:

      密钥k,或从Ci1EK(Pi1 )推出Pi1

 

3选择明文***Chosen-plaintext attack

已知:

 P1C1EK ( P1 )P2 C2EK(P2 ) …… PiCiEK( Pi) ,其中P1P2…… Pi是由密码分析者选择的。

推导出:

     密钥k,或从Ci1EK(Pi1 )推出Pi1

 

4自适应选择明文***Adaptive-chosen-plaintext attack

5选择密文***Chosen-ciphertext attack

6选择密钥***Chosen-key attack

7软磨硬泡*** 

11.6 密钥管理

密钥的保密性比算法的保密性重要多了。密钥最好是动态的,会定期更新。

11.7 伪随机数问题

Java中使用java.util.Random是不安全的,因为其是使用系统时间的作为种子生成的伪随机数。在种子相同的情况下,其生成的随机数的顺序都是相同的。

java.security.SecureRandom是安全随机数,可以在项目中使用。

加密算法的最佳实践:

q  不要使用ECB模式

q  不要使用流密码

q  使用HMAC-SHA1代替MD5(甚至代替SHA1

q  不要使用相同的key做不同的事

q  saltsIV需要随机产生

q  不要自己实现加密算法,尽量使用稳定的加密库

q  不要依赖于系统的保密性