一、DES加密算法簡介
DES(Data Encryption Standard)是目前最為流行的加密算法之一。DES是對稱的,也就是說它使用同一個(gè)密鑰來加密和解密數(shù)據(jù)。
DES還是一種分組加密算法,該算法每次處理固定長度的數(shù)據(jù)段,稱之為分組。DES分組的大小是64位,如果加密的數(shù)據(jù)長度不是64位的倍數(shù),可以按照某種具體的規(guī)則來填充位。
從本質(zhì)上來說,DES的安全性依賴于虛假表象,從密碼學(xué)的術(shù)語來講就是依賴于“混亂和擴(kuò)散”的原則?;靵y的目的是為隱藏任何明文同密文、或者密鑰之間的關(guān)系,而擴(kuò)散的目的是使明文中的有效位和密鑰一起組成盡可能多的密文。兩者結(jié)合到一起就使得安全性變得相對較高。
DES算法具體通過對明文進(jìn)行一系列的排列和替換操作來將其加密。過程的關(guān)鍵就是從給定的初始密鑰中得到16個(gè)子密鑰的函數(shù)。要加密一組明文,每個(gè)子密鑰按照順序(1-16)以一系列的位操作施加于數(shù)據(jù)上,每個(gè)子密鑰一次,一共重復(fù)16次。每一次迭代稱之為一輪。要對密文進(jìn)行解密可以采用同樣的步驟,只是子密鑰是按照逆向的順序(16-1)對密文進(jìn)行處理。
二、DES加密算法加密原理
DES是采用分組加密。使用64位的分組長度和56位的密鑰長度,將64位的輸入經(jīng)過一系列變換得到64位的輸出。DES算法利用多次組合替代算法和換位算法,通過混淆和擴(kuò)散的相互作用,把明文編輯成密碼強(qiáng)度很高的密文。解密則使用了相同的步驟和相同的密鑰。
64位數(shù)據(jù)為一組進(jìn)行加密;
初始置換根據(jù)一張8*8的置換表,將64位的明文打亂
與56位的密鑰經(jīng)16輪次迭代運(yùn)算形成的初始密文
最后經(jīng)過初始逆置換得到分組的最終密文
三、DES加密算法的實(shí)現(xiàn)
考慮到DES算法中涉及的位操作很多,因此DES算法通常都是在硬件中實(shí)現(xiàn)。DES算法中的圖表和術(shù)語(通過線、框畫的流程圖,以及諸如S盒、P盒這樣的術(shù)語)使其更傾向于在硬件中實(shí)現(xiàn),當(dāng)然,軟件實(shí)現(xiàn)也有它的價(jià)值所在。在軟件開發(fā)中,通過幾種基本的指令操作來幫助實(shí)現(xiàn)DES中的各種置換、轉(zhuǎn)換以及替換操作都是很有效的。
des_encipher
函數(shù)des_encipher將明文的一個(gè)64位的明文分組通過DES算法加密。
由于DES的一個(gè)很好的特點(diǎn)是同樣的過程既能用來加密數(shù)據(jù)也能用來解密數(shù)據(jù),因此des_encipher只需要簡單的調(diào)用des_main,而des_decipher同樣也只需要調(diào)用des_main即可。
函數(shù)des_main通過使用其參數(shù)direction來確定到參數(shù)source提供的數(shù)據(jù)是明文還是密文。direction參數(shù)只是簡單地修改子密鑰的順序。
在des_encipher中,direction設(shè)置為encipher。
函數(shù)des_main()首先檢測參數(shù)key是否為NULL。這將允許des_encipher的調(diào)用者重用上一次調(diào)用時(shí)計(jì)算出來的子密鑰。將子密鑰數(shù)組subkeys聲明為static類型。如果key不為NULL,將計(jì)算子密鑰。
要計(jì)算子密鑰,可以按照前面介紹過的步驟(計(jì)算16個(gè)子密鑰)來執(zhí)行。key的轉(zhuǎn)換是通過函數(shù)permute來實(shí)現(xiàn)的,這里就是根據(jù)一個(gè)特定的表在一個(gè)緩沖區(qū)中置換位。假設(shè)表中的每個(gè)位置(i)上都存在一個(gè)值p,函數(shù)permute通過將位置p的位移動(dòng)到位置(i)上來完成對傳入的buffer的置換。
要置換密鑰,將表Des_Transform(同表1)傳給函數(shù)permute。必要的旋轉(zhuǎn)操作可以通過調(diào)用位操作bit_rot_left來實(shí)現(xiàn)。該操作將buffer按照指定的位數(shù)向左旋轉(zhuǎn)。每一輪要正確旋轉(zhuǎn)28位的子密鑰分組,將表Des_Rotations(同表2)中合適的元素傳給bit_rot_left。通過調(diào)用permute,并把傳入表Des_permuted(同表3),來對每一個(gè)子密鑰做置換選擇。
?要加密一個(gè)數(shù)據(jù)塊,首先要執(zhí)行初始置換。為實(shí)現(xiàn)這一步,首先調(diào)用函數(shù)permute并將表Des_Initial(同表4)傳入。然后,將數(shù)據(jù)分為兩個(gè)32位的分組:lblk以及rblk?;仡櫼幌拢用軘?shù)據(jù)的大部分工作都是將一系列的操作重復(fù)執(zhí)行16輪。每一輪的主要工作都花在計(jì)算函數(shù)(f)的值上,將值保存在fblk中。
每一輪操作開始時(shí),將對rblk執(zhí)行一個(gè)擴(kuò)展置換。為了實(shí)現(xiàn)這個(gè)步驟,將調(diào)用函數(shù)permute,并把表Des_Expansion(同表5)傳入。然后,通過調(diào)用位操作bit_xor來計(jì)算擴(kuò)展后的rblk和某個(gè)適當(dāng)?shù)淖用荑€的異或值。無論是加密還是解密數(shù)據(jù),與本輪操作相關(guān)的子密鑰都需要參與執(zhí)行。一旦完成了異或計(jì)算,將對結(jié)果執(zhí)行一系列的S盒替換操作。Des_Sbox(同表6)定義了8個(gè)用于DES算法中的S盒。對于當(dāng)前fblk中的每個(gè)6位分組,第1位和最后1位聯(lián)合起來確定Des_Sbox中的行號(hào),而中間的4位用來確定列號(hào)。最后執(zhí)行P盒置換來完成函數(shù)f的計(jì)算。通過調(diào)用permute函數(shù)并傳入表Des_Pbox(同表7)來實(shí)現(xiàn)這個(gè)步驟。計(jì)算出lblk與函數(shù)f的值的異或結(jié)果,并交換lblk和rblk來結(jié)束一輪的操作。
將上述過程重復(fù)16次,每輪一次。當(dāng)全部16輪操作完成后,將rblk拷貝到target的前32位中,將lblk拷貝到之后的32位中(按照要求,最后一輪不交換lblk和rblk)。最終,通過調(diào)用permute并把Des_Final(同表8)傳入來完成最后的置換操作。
des_encipher的時(shí)間復(fù)雜度是O(1),因?yàn)榧用軘?shù)據(jù)塊的所有步驟都能在恒定的時(shí)間內(nèi)完成。
des_decipher
函數(shù)des_decipher將一個(gè)64位的密文分組通過DES算法進(jìn)行解密。同des_encipher一樣,des_decipher實(shí)際通過調(diào)用des_main來完成解密任務(wù),但這里direction需要設(shè)置為decipher。因此,des_decipher的工作方式同des_encipher一樣,只是這里的子密鑰需要以逆序的方式參與。具體來說,就是在des_main中,針對每一輪i(從0開始計(jì)數(shù)),參與計(jì)算的子密鑰為subkeys數(shù)組中下標(biāo)為(15-i)的元素。
des_decipher的時(shí)間復(fù)雜度為O(1),因?yàn)榻饷軘?shù)據(jù)塊中的所有步驟都可以在恒定的時(shí)間內(nèi)完成。
考慮到DES算法中涉及的位操作很多,因此DES算法通常都是在硬件中實(shí)現(xiàn)。DES算法中的圖表和術(shù)語(通過線、框畫的流程圖,以及諸如S盒、P盒這樣的術(shù)語)使其更傾向于在硬件中實(shí)現(xiàn),當(dāng)然,軟件實(shí)現(xiàn)也有它的價(jià)值所在。在軟件開發(fā)中,通過幾種基本的指令操作來幫助實(shí)現(xiàn)DES中的各種置換、轉(zhuǎn)換以及替換操作都是很有效的。
des_encipher
函數(shù)des_encipher將明文的一個(gè)64位的明文分組通過DES算法加密。
由于DES的一個(gè)很好的特點(diǎn)是同樣的過程既能用來加密數(shù)據(jù)也能用來解密數(shù)據(jù),因此des_encipher只需要簡單的調(diào)用des_main,而des_decipher同樣也只需要調(diào)用des_main即可。
函數(shù)des_main通過使用其參數(shù)direction來確定到參數(shù)source提供的數(shù)據(jù)是明文還是密文。direction參數(shù)只是簡單地修改子密鑰的順序。
在des_encipher中,direction設(shè)置為encipher。
函數(shù)des_main()首先檢測參數(shù)key是否為NULL。這將允許des_encipher的調(diào)用者重用上一次調(diào)用時(shí)計(jì)算出來的子密鑰。將子密鑰數(shù)組subkeys聲明為static類型。如果key不為NULL,將計(jì)算子密鑰。
要計(jì)算子密鑰,可以按照前面介紹過的步驟(計(jì)算16個(gè)子密鑰)來執(zhí)行。key的轉(zhuǎn)換是通過函數(shù)permute來實(shí)現(xiàn)的,這里就是根據(jù)一個(gè)特定的表在一個(gè)緩沖區(qū)中置換位。假設(shè)表中的每個(gè)位置(i)上都存在一個(gè)值p,函數(shù)permute通過將位置p的位移動(dòng)到位置(i)上來完成對傳入的buffer的置換。
要置換密鑰,將表Des_Transform(同表1)傳給函數(shù)permute。必要的旋轉(zhuǎn)操作可以通過調(diào)用位操作bit_rot_left來實(shí)現(xiàn)。該操作將buffer按照指定的位數(shù)向左旋轉(zhuǎn)。每一輪要正確旋轉(zhuǎn)28位的子密鑰分組,將表Des_Rotations(同表2)中合適的元素傳給bit_rot_left。通過調(diào)用permute,并把傳入表Des_permuted(同表3),來對每一個(gè)子密鑰做置換選擇。
?要加密一個(gè)數(shù)據(jù)塊,首先要執(zhí)行初始置換。為實(shí)現(xiàn)這一步,首先調(diào)用函數(shù)permute并將表Des_Initial(同表4)傳入。然后,將數(shù)據(jù)分為兩個(gè)32位的分組:lblk以及rblk?;仡櫼幌?,加密數(shù)據(jù)的大部分工作都是將一系列的操作重復(fù)執(zhí)行16輪。每一輪的主要工作都花在計(jì)算函數(shù)(f)的值上,將值保存在fblk中。
每一輪操作開始時(shí),將對rblk執(zhí)行一個(gè)擴(kuò)展置換。為了實(shí)現(xiàn)這個(gè)步驟,將調(diào)用函數(shù)permute,并把表Des_Expansion(同表5)傳入。然后,通過調(diào)用位操作bit_xor來計(jì)算擴(kuò)展后的rblk和某個(gè)適當(dāng)?shù)淖用荑€的異或值。無論是加密還是解密數(shù)據(jù),與本輪操作相關(guān)的子密鑰都需要參與執(zhí)行。一旦完成了異或計(jì)算,將對結(jié)果執(zhí)行一系列的S盒替換操作。Des_Sbox(同表6)定義了8個(gè)用于DES算法中的S盒。對于當(dāng)前fblk中的每個(gè)6位分組,第1位和最后1位聯(lián)合起來確定Des_Sbox中的行號(hào),而中間的4位用來確定列號(hào)。最后執(zhí)行P盒置換來完成函數(shù)f的計(jì)算。通過調(diào)用permute函數(shù)并傳入表Des_Pbox(同表7)來實(shí)現(xiàn)這個(gè)步驟。計(jì)算出lblk與函數(shù)f的值的異或結(jié)果,并交換lblk和rblk來結(jié)束一輪的操作。
將上述過程重復(fù)16次,每輪一次。當(dāng)全部16輪操作完成后,將rblk拷貝到target的前32位中,將lblk拷貝到之后的32位中(按照要求,最后一輪不交換lblk和rblk)。最終,通過調(diào)用permute并把Des_Final(同表8)傳入來完成最后的置換操作。
des_encipher的時(shí)間復(fù)雜度是O(1),因?yàn)榧用軘?shù)據(jù)塊的所有步驟都能在恒定的時(shí)間內(nèi)完成。
des_decipher
函數(shù)des_decipher將一個(gè)64位的密文分組通過DES算法進(jìn)行解密。同des_encipher一樣,des_decipher實(shí)際通過調(diào)用des_main來完成解密任務(wù),但這里direction需要設(shè)置為decipher。因此,des_decipher的工作方式同des_encipher一樣,只是這里的子密鑰需要以逆序的方式參與。具體來說,就是在des_main中,針對每一輪i(從0開始計(jì)數(shù)),參與計(jì)算的子密鑰為subkeys數(shù)組中下標(biāo)為(15-i)的元素。
des_decipher的時(shí)間復(fù)雜度為O(1),因?yàn)榻饷軘?shù)據(jù)塊中的所有步驟都可以在恒定的時(shí)間內(nèi)完成。
四、DES加密算法的三個(gè)原則
混淆:使密文與密鑰的關(guān)系可能復(fù)雜化,使得對手即使獲取了許多明文和對應(yīng)的密文,以及關(guān)于密文的一些統(tǒng)計(jì)特性,也無法推測密鑰。
擴(kuò)散:讓明文中的每一位影響密文中的許多位,后者說讓密文中的每一位受明文中的許多的影響。這樣可以隱蔽明文的統(tǒng)計(jì)特性。當(dāng)然,理想的情況是讓明文中的每一位影響密文中的所有為,或者說讓密文中的每一位受明文中所有位的影響。
分組:可以看成經(jīng)典的電報(bào)密碼本加密技術(shù)的現(xiàn)代傳承,其中由密鑰來決定電報(bào)密碼本的選擇。一次加密一組數(shù)據(jù),密鑰長度為一組數(shù)據(jù)的長度。
五、DES加密算法的特點(diǎn)
DES加密算法產(chǎn)生密鑰的方式簡單,密鑰一般也比較短。
DES加密算法解密速度快,效率很高,適合對大數(shù)據(jù)量的數(shù)據(jù)進(jìn)行加密。文章來源:http://www.zghlxwxcb.cn/news/detail-599811.html
DES加密算法的安全性依賴于密鑰的高度保密,通信雙方必須有方法能保證安全的分享密鑰,并定期更換DES密鑰。文章來源地址http://www.zghlxwxcb.cn/news/detail-599811.html
到了這里,關(guān)于DES加密算法的文章就介紹完了。如果您還想了解更多內(nèi)容,請?jiān)谟疑辖撬阉鱐OY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!