现代密码(由乘积密码构成)包括DES, Blowfish, IDEA, LOKI, RC5, Rijndael (AES) 及其它一些算法
先来看看一些基本概念和密码学的基础知识:
对称算法可分为两类:分组密码和流密码。
1.分组密码是将明文分成固定长度的组或块(如64比特为一组),然后用同一密钥和算法对每一块进行加密,输出密文的长度也是固定的。
2.流密码(stream cipher)的主要原理是通过伪随机序列发生器产生性能优良的随机序列,使用该序列与明文序列叠加来输出密文序列。解密时,再用同一个随机序列与密文序列进行叠加来恢复明文。
分组密码中,
S-P network 替换-置换乘积密码的现代形式
S-P networks 是基于下列两种最基本的密码运算(前面介绍过):
替换( Substitution )一个二进制字用其它二进制字替换,这种替换函数就构成密钥,可以看作是一个大的查表运算,叫做 S-boxes
置换( Permutation )二进制字次序被打乱,重新排序的方法构成密钥,叫这种变换为 P-boxes
把这两种运算组合在一起,一些 S-boxes 由 P-box 连接,这种变换叫做混合变换(mixing transformations )。这种效果进一步解释为”雪崩(输入改变10bit, 导致近一半的比特发生变化)”与”完全性(每个输出比特是所有输入比特的复杂函数的输出)” 。这些设计原理是设计好的分组密码准则。 “雪崩”保证小的输入变化导致大的输出变化。完全性保证每个输出比特依赖于所有的输出比特。
分组长度64比特,密文64比特
算法分三个阶段实现: 1.对明文X,通过一个固定的初始置换IP得到X0。 X0=IP(X)=L0 R0 分为左右两部分
2.函数F的16次迭代:LiRi(0<=i<=15) Li=Ri-1, Ri=Li-1 F(Ri-1, Ki) 其中Ki是长为48位的子密钥。子密钥K1,K2,…,K16是作为密钥K(56位)的函数而计算出的。
3.对比特串R16 L16使用逆置换IP-1得到密文Y。 Y=IP-1(R15 L15)
DES中使用的其它特定函数
初始置换IP:对明文输入进行次序的打乱。
逆置换IP-1:
扩展函数E;(32到48)
置换函数P
DES算法概要:
1.对输入的明文从右向左按顺序每64位分为一组(不足64位时,在高位补0),并按组进行加密或解密。
2.进行初始换位。
3.将换位后的明文分成左、右两个部分,每部分为32位长。
4.进行16轮相同的变换,包括密钥变换。
5.将变换后左右两部分合并在一起。
6.逆初始变换,输出64位密文。
F(Ri-1, Ki):
函数F有两个输入:32的消息A=R(32bits)作第一个输入,48比特的子密钥J=K(48bits)作为第二个输入。产生的输出为长度为32的位串。
(1)对第一个变元A,先利用扩展函数E,扩展成48位E(A)
(2)计算E(A)+J,结果写成8个6位串,B=b1b2b3b4b5b6b7b8(3)使用8个S盒,每个Sj是一个固定的416矩阵,它的元素取0~15的整数。给定长度为6个比特串,如 Bj=b1b2b3b4b5b6
计算Sj(Bj)如下:b1b6两个比特确定了Sj的行数, r(0<=r<=3); 而b2b3b4b5四个比特确定了Sj的列数c(0<=c<=15)。最后Sj(Bj)的值为S-盒矩阵Sj中r行c列的元素(r,c), 得Cj=Sj(Bj)。 (4) 最后,P为固定置换。
DES的核心是S盒,除此之外的计算是属线性的。S盒作为该密码体制的非线性组件对安全性至关重要。
S盒的设计准则: 1. S盒不是它输入变量的线性函数 2.改变S盒的一个输入位至少要引起两位的输出改变 3. 对任何一个S盒,如果固定一个输入比特,其它输入变化时,输出数字中0和1的总数近于相等。
密钥长度是否足够?
迭代的长度?(8、16、32?)
三重DES
假设两个密钥是K1和K2:
(1)用密钥K1进行DES加密。
(2)用K2对步骤1的结果进行DES解密。
(3)对(2)的结果使用密钥K1进行DES加密。
3DES的缺点是加、解密速度比DES慢。
加密: C=Ek1[Dk2 [Ek1(P)]]
解密: P=Dk1[Ek2 [Dk1(C)]]