數(shù)據(jù)加密中的DES加密算法詳解
[摘要] 本文詳細(xì)介紹了DES數(shù)據(jù)加密算法的原理,并給出了一個例子演示了如何使用c#中的加密包進(jìn)行DES算法加密,最后對DES進(jìn)行了評價。
本文引用地址:http://2s4d.com/article/202130.htm[關(guān)鍵詞] 加密 對稱 非對稱 DES 密鑰 明文 密文
從最初的保密通信發(fā)展到目前的網(wǎng)絡(luò)信息加密,信息加密技術(shù)一直伴隨著信息技術(shù)的發(fā)展而發(fā)展。作為計算機信息保護的最實用和最可靠的方法,信息加密技術(shù)被廣泛應(yīng)用到信息安全的各個領(lǐng)域。信息加密技術(shù)是一門涉及數(shù)學(xué)、密碼學(xué)和計算機的交叉學(xué)科?,F(xiàn)代密碼學(xué)的發(fā)展,使信息加密技術(shù)已經(jīng)不再依賴于對加密算法本身的保密,而是通過在統(tǒng)計學(xué)意義上提高破解的成本來提供高加密算法的安全性。
密碼學(xué)是一門古老而又年輕的科學(xué),它用于保護軍事和外交通信,可追溯到幾千年前。1976年Diffie和Hellman的“密碼學(xué)的新方向”一文引發(fā)的密碼學(xué)的一場革命,開創(chuàng)了公鑰密碼學(xué)的新紀(jì)元。
常用加密算法主要用來對敏感數(shù)據(jù)、摘要、簽名等信息進(jìn)行加密。按照密鑰方式劃分,可分為對稱加密算法和非對稱加密算法。
一、對稱加密算法
對稱加密算法有時又叫做傳統(tǒng)密碼算法,加密密鑰可以從解密密鑰中推導(dǎo)出來,解密密鑰也可以從加密密鑰中推導(dǎo)出來。在大多數(shù)的對稱算法中,加密密鑰和解密密鑰是相同的,因此也成為秘密密鑰算法或者單密鑰算法。它要求發(fā)送發(fā)和接收方在安全通信之前先商定一個密鑰。對稱算法的安全性依賴于密鑰,所以密鑰的保密性對通信至關(guān)重要。對稱加密算法主要有分組加密和流加密兩類。分組加密是指將明文分成固定商都的組,用同一密鑰分別對每一組加密,輸出固定長度的密文,典型代表:DES、3DES、IDEA。
二、非對稱加密算法
非對稱加密算法有時又叫做公開密鑰算法。其中用到兩個密鑰。一個是公共的,一個事私有的。一個密鑰用于加密,另一個密鑰用于解密。兩個密鑰不能夠互相推導(dǎo)。常用的非對稱加密算法有RSA公鑰算法、Diffie-Hellman算法和ECC橢圓曲線密碼。
我們詳細(xì)分析一下DES加密算法的處理過程。
DES加密算法是分組加密算法,明文以64位為單位分成塊。64位數(shù)據(jù)在64位密鑰的控制下,經(jīng)過初始變換后,進(jìn)行16輪加密迭代:64位數(shù)據(jù)被分成左右兩半部分,每部分32位,密鑰與右半部分相結(jié)合,然后再與左半部分相結(jié)合,結(jié)果作為新的右半部分;結(jié)合前的右半部分作為新的左半部分。這一系列步驟組成一輪。這種輪換要重復(fù)16次。最后一輪之后,再進(jìn)行初始置換的逆置換,就得到了64位的密文。
DES的加密過程可分為加密處理,加密變換和子密鑰生成幾個部分組成。
1.加密處理過程
(1)初始變換。加密處理首先要對64位的明文按表1所示的初始換位表IP進(jìn)行變換。表中的數(shù)值表示輸入位被置換后的新位置。例如輸入的第58位,在輸出的時候被置換到第1位;輸入的是第7位,在輸出時被置換到第64位。
(2)加密處理。上述換位處理的輸出,中間要經(jīng)過16輪加密變換。初始換位的64位的輸出作為下一次的輸入,將64位分為左、右兩個32位,分別記為L0和R0,從L0、R0到L16、R16,共進(jìn)行16輪加密變換。其中,經(jīng)過n輪處理后的點左右32位分別為Ln和Rn,則可做如下定義
其中,kn是向第n輪輸入的48位的子密鑰,Ln-1和Rn-1分別是第n-1輪的輸出,f是Mangler函數(shù)。
(3)最后換位。進(jìn)行16輪的加密變換之后,將L16和R16合成64位的數(shù)據(jù),再按照表2所示的
最后換位表進(jìn)行IP-1的換位,得到64位的密文,這就是DES算法加密的結(jié)果。
2.加密變換過程
通過重復(fù)某些位將32位的右半部分按照擴展表3擴展換位表擴展為48位,而56位的密鑰先移位然后通過選擇其中的某些位減少至48位,48位的右半部分通過異或操作和48位的密鑰結(jié)合,并分成6位的8個分組,通過8個S-盒將這48位替代成新的32位數(shù)據(jù),再將其置換一次。這些S-盒輸入6位,輸出4位。S盒如表5所示。
一個S盒中具有4種替換表(行號用0、1、2、3表示),通過輸入的6位的開頭和末尾兩位選定行,然后按選定的替換表將輸入的6位的中間4位進(jìn)行替代,例如:當(dāng)向S1輸入011011時,開頭和結(jié)尾的組合是01,所以選中編號為1的替代表,根據(jù)中間4位1101,選定第13列,查找表中第1行第13列所示的值為5,即輸出0101,這4位就是經(jīng)過替代后的值。按此進(jìn)行,輸出32位,再按照表4 單純換位表P進(jìn)行變換,這樣就完成了f(R,K)的變換,如圖2所示。
3.子密鑰生成過程
鑰通常表示為64位的自然數(shù),首先通過壓縮換位PC-1去掉每個字節(jié)的第8位,用作奇偶校驗,因此,密鑰去掉第8、16、24……64位減至56位,所以實際密鑰長度為56位,而每輪要生成48位的子密鑰。
輸入的64位密鑰,首先通過壓縮換位得到56位的密鑰,每層分成兩部分,上部分28位為C0,下部分為D0。C0和D0依次進(jìn)行循環(huán)左移操作生成了C1和D1,將C1和D1合成56位,再通過壓縮換位PC-2輸出48位的子密鑰K1,再將C1和D1進(jìn)行循環(huán)左移和PC-2壓縮換位,得到子密鑰K2......以此類推,得到16個子密鑰。密鑰壓縮換位表如表6所示。在產(chǎn)生子密鑰的過程中,L1、L2、L9、L16是循環(huán)左移1位,其余都是左移2位,左移次數(shù)如表7所示。
4.解密處理過程
從密文到明文的解密過程可采用與加密完全相同的算法。不過解密要用加密的逆變換,就是把上面的最后換位表和初始換位表完全倒過來變換。這里不再贅述。
下面這個例子中演示了如何使用c#中的加密包進(jìn)行DES算法加密,大家可以借助這個例子一窺DES加密的用法。
des_demo.cs代碼如下
using System;
using System.Security.Cryptography;
using System.IO;
using System.Text;
public class EncryptStringDES {
public static void Main(String[] args) {
if (args.Length 1) {
Console.WriteLine(Usage: des_demo
encrypt, args[0]);
return;
}
// 使用UTF8函數(shù)加密輸入?yún)?shù)
UTF8Encoding utf8Encoding = new UTF8Encoding();
byte[] inputByteArray = utf8Encoding.GetBytes(args
評論