三重DES
目录
3DES(或称为Triple DES)是三重数据加密算法(TDEA,Triple Data Encryption Algorithm)块密码的通称。它相当于是对每个数据块应用三次DES加密算法。由于计算机运算能力的增强,原版DES密码的密钥长度变得容易被暴力破解;3DES即是设计用来提供一种相对简单的方法,即通过增加DES的密钥长度来避免类似的攻击,而不是设计一种全新的块密码算法。
DES是一种分组加密算法。明文分组长度为64位。加密得到的密文分组长度为64位。密钥长度64位,8个字节。每一个字节的最高位用于奇偶效验,所以有效密钥长度为56位。其分组加密过程描述如下:①子密钥Ki的生成。②64位的明文经过一个初始置换IP后,被分成左右两半部分,每个部分32位,以L0和R0表示。③进行16轮迭代变换:第i 轮变换将上一轮变换所得到的结果的右半部分与第i个子密钥Ki结合,这个过程称为f函数。第i轮变换结果的左半部分为上一轮变换结果的右半部分(即:Li=Ri-1),其右半部分为上一轮变换结果的左半部与上一轮变换结果的右半部经过F函数处理所的结果的异或:Ri=Li-1⊕F(Ri-1,Ki)。④16轮变换之后左右两部分再连接起来,经过一个初始逆置换IP-1得到密文。
DES的解密算法与加密算法完全相同,只需要将密钥的应用次序与加密时相反应用即可。即解密过程是初始置换函IP数接受长度为64比特的密文输入,将16个子密钥按照K16到K1的顺序应用与F函数的16轮迭代运算中, 然后将迭代的结果经由末置换函数IP-1得到64位的明文输出。
由于DES密钥只有56bit,易于遭受穷举时攻击。作为一种替代加密方案,Tuchman提出使用两个密钥的三重DES加密方法,并在1985年成为美国的一个商用加密标准。该方法使用两个密钥,执行三次DES算法,如图2所示。加密的过程是加密-解密-加密,解密的过程是解密-加密-解密。
采用两个密钥进行三重加密的好处有:①两个密钥合起来有效密钥长度有112bit,可以满足商业应用的需要,若采用总长为168bit的三个密钥,会产生不必要的开销。②加密时采用加密-解密-加密,而不是加密-加密-加密的形式,这样有效的实现了与现有DES系统的向后兼容问题。因为当K1=K2时,三重DES的效果就和原来的DES一样,有助于逐渐推广三重DES。③三重DES具有足够的安全性,目前还没有关于攻破三重DES的报道。
DES(Data Encryption Standard),数据加密标准算法是一种传统的加密技术,在20世纪7O年代发展起来,该算法的加密和解密密钥是等价的,算法公开但是密钥不公开,系统的安全性依赖于密钥的秘密性。DES算法综合运用了置换、代替和代数等多种密码技术、是一种乘积密码。加密时把明文以64bit单位分成块进行加密,密钥长度64位,有效长度 56位 (其余8位用于奇偶校验)。首先将 64位数据经过初始置换后,分成左右各32位两个部分,然后进入迭代过程。在每一轮迭代中,先将右半32位扩展为48位,然后与由64位密钥生成的48位的某一子密钥进行异或运算,得到48位结果后再经s盒压缩为32位,再将这32位数据经置换后与输入数据的左半部分的32位数据异或,得到新一轮迭代的右半部分,同时将该轮迭代输入数据的右半部分作为这一轮迭代输出数据的左半部分。如此,就完成了一轮迭代。通过16轮这样的迭代后,产生了一个新的64位数据。注意:最后一次迭代后,所得的结果的左半部分和右半部分不再交换,其目的是为了使加密和解密可使用同一算法。最后,再将这64位的数据进行一个逆置换,就得到了64位密文
设Ek()和Dk()代表DES算法的加密和解密过程,K代表DES算法使用的密钥,P代表明文,C代表密表,这样,
3DES加密过程为:C=Ek3(Dk2(Ek1(P)))
3DES解密过程为:P=Dk1((EK2(Dk3(C)))
using System;
using System.Text;
using System.IO;
using System.Security.Cryptography;
class Class1
{
static void Main()
{
Console.WriteLine("Encrypt String...");
txtKey = "tkGGRmBErvc=";
btnKeyGen();
Console.WriteLine("Encrypt Key :{0}",txtKey);
txtIV = "Kl7ZgtM1dvQ=";
btnIVGen();
Console.WriteLine("Encrypt IV :{0}",txtIV);
Console.WriteLine();
string txtEncrypted = EncryptString("1111");
Console.WriteLine("Encrypt String : {0}",txtEncrypted);
string txtOriginal = DecryptString(txtEncrypted);
Console.WriteLine("Decrypt String : {0}",txtOriginal);
}
private static SymmetricAlgorithm mCSP;
private static string txtKey;
private static string txtIV;
private static void btnKeyGen()
{
mCSP = SetEnc();
byte[] byt2 = Convert.FromBase64String(txtKey);
mCSP.Key = byt2;
}
private static void btnIVGen()
{
byte[] byt2 = Convert.FromBase64String(txtIV);
mCSP.IV = byt2;
}
private static string EncryptString(string Value)
{
ICryptoTransform ct;
MemoryStream ms;
CryptoStream cs;
byte[] byt;
ct = mCSP.CreateEncryptor(mCSP.Key, mCSP.IV);
byt = Encoding.UTF8.GetBytes(Value);
ms = new MemoryStream();
cs = new CryptoStream(ms, ct, CryptoStreamMode.Write);
cs.Write(byt, 0, byt.Length);
cs.FlushFinalBlock();
cs.Close();
return Convert.ToBase64String(ms.ToArray());
}
private static string DecryptString(string Value)
{
ICryptoTransform ct;
MemoryStream ms;
CryptoStream cs;
byte[] byt;
ct = mCSP.CreateDecryptor(mCSP.Key, mCSP.IV);
byt = Convert.FromBase64String(Value);
ms = new MemoryStream();
cs = new CryptoStream(ms, ct, CryptoStreamMode.Write);
cs.Write(byt, 0, byt.Length);
cs.FlushFinalBlock();
cs.Close();
return Encoding.UTF8.GetString(ms.ToArray());
}
private static SymmetricAlgorithm SetEnc()
{
return new DESCryptoServiceProvider();
}
}
1) PC-1变换。
将原密钥的各位按照PC-1矩阵重新排列,这一过程剔除了奇偶校验位。PC-1如下:
57 49 41 33 25 17 9
1 58 50 42 34 26 18
10 2 59 51 43 35 27
19 11 3 60 52 44 36
63 55 47 39 31 23 15
7 62 54 46 38 30 22
14 6 61 53 45 37 29
21 13 5 28 20 12 4
2) 将排好的密钥分成两部分,前面28位为C0,后面28位为D0。
3) 从i=1开始,循环执行16次以下步骤得到16个子密钥。
①对Ci-1和Di-1进行相同位数的循环左移,得到Ci和Di
左移的位数为:
i取数值: 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16
移动数: 1 1 2 2 2 2 2 2 1 2 2 22 221
②连接Ci和Di,按照矩阵PC-2排列选择合适的位,构成子密钥Ki,该过程将56位压缩到48位,PC-2如下:
14 17 11 24 1 5
3 28 15 6 21 10
23 19 12 4 26 8
16 7 27 20 13 2
41 52 31 37 47 55
30 40 51 45 33 48
44 49 39 56 34 53
46 42 50 36 29 32
③ i=i+1,转到①,直到生成16个全部自密钥。
1) 取得64位明文,不足补齐(补0)
2) 对明文各位按照IP矩阵进行排列,矩阵为:
58 50 42 34 26 18 10 2
60 52 44 36 28 20 12 4
62 54 46 38 30 22 14 6
64 56 48 40 32 24 16 8
57 49 41 33 25 17 9 1
59 51 43 35 27 19 11 3
61 53 45 37 29 21 13 5
63 55 47 39 31 23 15 7
3) 将得到的结果分为左右各32位两部分,称为L0, R0
4) 从i=1开始,循环执行16次下列的加密过程
①按照下面矩阵E将32位的Ri-1扩展为48位,所得结果称为E( Ri-1),E阵为:
32 1 2 3 4 5
4 5 6 7 8 9
8 9 10 11 12 13
12 13 14 15 16 17
161718192021
202122232425
242526272829
28293031321
②将E( Ri-1)和Ki按位异或
③将所得结果分为8个部分,每个部分6位,形成B[1],…B[8]
④ S盒替代。
S盒是8个子矩阵,称为S[1],….S[8],替代如下:将B[i]的第1位和第6位组成一个数称为R,第2、3、4、5位组成一个数称为C,用S[i]中对应的(R,C)中的4位数替换B[i],这样就将原来的48位替换成32位。
⑤ P盒置换,按照下面的矩阵重新排列上面的结果
16 7 20 21
29 12 28 17
1 15 23 26
5 18 31 10
2 8 24 14
32 2 3 9
19 13 30 6
22 11 4 25
⑥将上一步处理的结果与Li-1按位异或,得到新的Ri,该过程可以简单记为:Ri=Li-1⊕F(Ri-1,Ki)
⑦ i=i+1 转④的第一步,直到完成16次循环
⑧进行IP-1置换,将上面得到的L16R16按照下面的矩阵进行置换:
40 8 48 16 56 24 64 32
39 7 47 15 55 23 63 31
38 6 46 14 54 22 62 30
37 5 45 13 53 21 61 29
36 4 44 12 52 20 60 28
35 3 43 11 51 19 59 27
34 2 42 10 50 18 58 26
33 1 41 9 49 17 57 25
加密过程结束,解密过程是用K16,K15,…..K1
C[0]d[0]=PC1(KEY)
FOR I=1 TO 16
C[I]=LS[I](C[I-1])
D[I]=LS[I](D[I-1])
K[I]=PC2(C[I]D[I])
L[0]R[0]=IP(PLAIN BLOCK)
FOR I=1 TO 16
L[I]=R[I-1]
R[I]=L[I-1] ⊕F(R[I-1],K[I])
CIPHER BLOCK=FP-1(L[16]R[16])
附件列表
故事内容仅供参考,如果您需要解决具体问题
(尤其在法律、医学等领域),建议您咨询相关领域专业人士。
如果您认为本故事还有待完善,请 编辑
上一篇 江苏新长江实业集团有限公司 下一篇 通威集团有限公司
