欢迎您访问科普小知识本站旨在为大家提供日常生活中常见的科普小知识,以及科普文章!
您现在的位置是:首页  > 科普文章

三重DES

科普小知识2022-12-11 18:32:15
...

三重数据加密算法相当于是对每个数据块应用三次DES加密算法。由于计算机运算能力的增强,原版DES密码的密钥长度变得容易被暴力破解;3DES即是设计用来提供一种相对简单的方法,即通过增加DES的密钥长度来避免类似的攻击.

1、定义

3DES(或称为TripleDES)是三重数据加密算法(TDEA,TripleDataEncryptionAlgorithm)块密码的通称。它相当于是对每个数据块应用三次DES加密算法。由于计算机运算能力的增强,原版DES密码的密钥长度变得容易被暴力破解;3DES即是设计用来提供一种相对简单的方法,即通过增加DES的密钥长度来避免类似的攻击,而不是设计一种全新的块密码算法。

2、算法原理

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位的明文输出。

3、两个密钥的三重DES

由于DES密钥只有56bit,易于遭受穷举时攻击。作为一种替代加密方案,Tuchman提出使用两个密钥的三重DES加密方法,并在1985年成为美国的一个商用加密标准。该方法使用两个密钥,执行三次DES算法,如图2所示。加密的过程是加密-解密-加密,解密的过程是解密-加密-解密。

采用两个密钥进行三重加密的好处有:①两个密钥合起来有效密钥长度有112bit,可以满足商业应用的需要,若采用总长为168bit的三个密钥,会产生不必要的开销。②加密时采用加密-解密-加密,而不是加密-加密-加密的形式,这样有效的实现了与现有DES系统的向后兼容问题。因为当K1=K2时,三重DES的效果就和原来的DES一样,有助于逐渐推广三重DES。③三重DES具有足够的安全性,目前还没有关于攻破三重DES的报道。

4、DES算法

DES(DataEncryptionStandard),数据加密标准算法是一种传统的加密技术,在20世纪7O年代发展起来,该算法的加密和解密密钥是等价的,算法公开但是密钥不公开,系统的安全性依赖于密钥的秘密性。DES算法综合运用了置换、代替和代数等多种密码技术、是一种乘积密码。加密时把明文以64bit单位分成块进行加密,密钥长度64位,有效长度56位(其余8位用于奇偶校验)。首先将64位数据经过初始置换后,分成左右各32位两个部分,然后进入迭代过程。在每一轮迭代中,先将右半32位扩展为48位,然后与由64位密钥生成的48位的某一子密钥进行异或运算,得到48位结果后再经s盒压缩为32位,再将这32位数据经置换后与输入数据的左半部分的32位数据异或,得到新一轮迭代的右半部分,同时将该轮迭代输入数据的右半部分作为这一轮迭代输出数据的左半部分。如此,就完成了一轮迭代。通过16轮这样的迭代后,产生了一个新的64位数据。注意:最后一次迭代后,所得的结果的左半部分和右半部分不再交换,其目的是为了使加密和解密可使用同一算法。最后,再将这64位的数据进行一个逆置换,就得到了64位密文


DEA加密算法流程

5、加密过程

设Ek()和Dk()代表DES算法的加密和解密过程,K代表DES算法使用的密钥,P代表明文,C代表密表,这样,

3DES加密过程为:C=Ek3(Dk2(Ek1(P)))

3DES解密过程为:P=Dk1((EK2(Dk3(C)))

usingSystem;

usingSystem.Text;

usingSystem.IO;

usingSystem.Security.Cryptography;

classClass1

{

staticvoidMain()

{

Console.WriteLine("EncryptString...");

txtKey="tkGGRmBErvc=";

btnKeyGen();

Console.WriteLine("EncryptKey:{0}",txtKey);

txtIV="Kl7ZgtM1dvQ=";

btnIVGen();

Console.WriteLine("EncryptIV:{0}",txtIV);

Console.WriteLine();

stringtxtEncrypted=EncryptString("1111");

Console.WriteLine("EncryptString:{0}",txtEncrypted);

stringtxtOriginal=DecryptString(txtEncrypted);

Console.WriteLine("DecryptString:{0}",txtOriginal);

}

privatestaticSymmetricAlgorithmmCSP;

privatestaticstringtxtKey;

privatestaticstringtxtIV;

privatestaticvoidbtnKeyGen()

{

mCSP=SetEnc();

bytebyt2=Convert.FromBase64String(txtKey);

mCSP.Key=byt2;

}

privatestaticvoidbtnIVGen()

{

bytebyt2=Convert.FromBase64String(txtIV);

mCSP.IV=byt2;

}

privatestaticstringEncryptString(stringValue)

{

ICryptoTransformct;

MemoryStreamms;

CryptoStreamcs;

bytebyt;

ct=mCSP.CreateEncryptor(mCSP.Key,mCSP.IV);

byt=Encoding.UTF8.GetBytes(Value);

ms=newMemoryStream();

cs=newCryptoStream(ms,ct,CryptoStreamMode.Write);

cs.Write(byt,0,byt.Length);

cs.FlushFinalBlock();

cs.Close();

returnConvert.ToBase64String(ms.ToArray());

}

privatestaticstringDecryptString(stringValue)

{

ICryptoTransformct;

MemoryStreamms;

CryptoStreamcs;

bytebyt;

ct=mCSP.CreateDecryptor(mCSP.Key,mCSP.IV);

byt=Convert.FromBase64String(Value);

ms=newMemoryStream();

cs=newCryptoStream(ms,ct,CryptoStreamMode.Write);

cs.Write(byt,0,byt.Length);

cs.FlushFinalBlock();

cs.Close();

returnEncoding.UTF8.GetString(ms.ToArray());

}

privatestaticSymmetricAlgorithmSetEnc()

{

returnnewDESCryptoServiceProvider();

}

}

6、Java语言编程实现DES算法

子密钥的生成

1)PC-1变换。

将原密钥的各位按照PC-1矩阵重新排列,这一过程剔除了奇偶校验位。PC-1如下:

5749413325179

1585042342618

1025951433527

1911360524436

63554739312315

7625446383022

1466153453729

211352820124

2)将排好的密钥分成两部分,前面28位为C0,后面28位为D0。

3)从i=1开始,循环执行16次以下步骤得到16个子密钥。

①对Ci-1和Di-1进行相同位数的循环左移,得到Ci和Di

左移的位数为:

i取数值:12345678910111213141516

移动数:1122222212222221

②连接Ci和Di,按照矩阵PC-2排列选择合适的位,构成子密钥Ki,该过程将56位压缩到48位,PC-2如下:

1417112415

3281562110

2319124268

1672720132

415231374755

304051453348

444939563453

464250362932

③i=i+1,转到①,直到生成16个全部自密钥。

对64位明文分组加密

1)取得64位明文,不足补齐(补0)

2)对明文各位按照IP矩阵进行排列,矩阵为:

585042342618102

605244362820124

625446383022146

645648403224168

57494133251791

595143352719113

615345372921135

635547393123157

3)将得到的结果分为左右各32位两部分,称为L0,R0

4)从i=1开始,循环执行16次下列的加密过程

①按照下面矩阵E将32位的Ri-1扩展为48位,所得结果称为E(Ri-1),E阵为:

3212345

456789

8910111213

121314151617

161718192021

202122232425

242526272829

28293031321

②将E(Ri-1)和Ki按位异或

③将所得结果分为8个部分,每个部分6位,形成B,…B

④S盒替代。

S盒是8个子矩阵,称为S,….S,替代如下:将B的第1位和第6位组成一个数称为R,第2、3、4、5位组成一个数称为C,用S中对应的(R,C)中的4位数替换B,这样就将原来的48位替换成32位。

⑤P盒置换,按照下面的矩阵重新排列上面的结果

1672021

29122817

1152326

5183110

282414

32239

1913306

2211425

⑥将上一步处理的结果与Li-1按位异或,得到新的Ri,该过程可以简单记为:Ri=Li-1⊕F(Ri-1,Ki)

⑦i=i+1转④的第一步,直到完成16次循环

⑧进行IP-1置换,将上面得到的L16R16按照下面的矩阵进行置换:

408481656246432

397471555236331

386461454226230

375451353216129

364441252206028

353431151195927

342421050185826

33141949175725

加密过程结束,解密过程是用K16,K15,…..K1

DES算法的伪代码表示

Cd=PC1(KEY)

FORI=1TO16

C=LS(C)

D=LS(D)

K=PC2(CD)

LR=IP(PLAINBLOCK)

FORI=1TO16

L=R

R=L⊕F(R,K)

CIPHERBLOCK=FP-1(LR)