回顾前面讲过的Vernam密码,它的特点是密钥与明文一样长,且没有统计关系,采用二进制数据。
加密:Ci=Pi⊕Ki
解密:Pi=Ci⊕Ki
(⊕表示模2加法)
Ki每次不同时,成为一次一密。
设明文为101,密钥是110
则加密101⊕110=011
解密011⊕110=101
然而在实际中,我们希望密钥应该是容易记住的,要记住一个与明文长度一样的密钥有些强人所难。
所以我们就改造一下结构图,变成:
多加了一个密钥流生成器,密钥K长度短,容易记住,那么问题就到了密钥流生成器那里,因为要实现Vernam密码,密钥流必须是随机的。实际中,我们无法做到完全随机,只能是伪随机,那么如何判断随机性的好坏程度呢?有一系列的标准,只要达到标准要求之上,那么就认为随机性较好,可以应用。
随机位测试:FIPS140-1标准
1.单个位测试:校验1和0的个数是否大致相等。
方法:测试20,000个二进制位; 计算流中1和0的个数; 如果1的个数在9654在10346之间,则通过单个位测试。
2.扑克牌测试:测试0至15的分布的随机随机性
方法:测试20,000个二进制位; 将20,000个位分成多个段,每段4位; 每段的数值表示0至15中的一个数; 对于随机流,0至15的分布应该是随机的。
设Ni是数字i的个数 x=16/5000* ∑ Ni2 -5000 (i=0..15) 如果1.03<X<57.4, 则测试通过。
3.连续串测试:测试连续串长度分布的随机性
方法:测试20,000个二进制位; 计算出所有各种长度的连续串的个数; 如果每种长度连续串的个数符合以下要求,则通过测试。
长度 | 个数 |
1 | 2267-2733 |
2 | 1079-1421 |
3 | 502-748 |
4 | 223-402 |
5 | 90-223 |
6 | 90-223 |
密钥流生成器使用线性反馈移位寄存器(LFSR)
我们希望LFSR能达到最大周期,这样随机性才会更好。
如上面的特征多项式是P(x)=x3+x+1。
有这样一个定理,当LSFR的特征多项式是不可约分多项式时,LSFR达到最大周期。