詳細解析DES系列加密技術(一)

melon_jj發表於2018-07-25

DES的加密和解密 一提到對稱加密,大家首先想到的可能就是DES(Data Encryption Standard)技術了.DES技術是一種將64位元的明文加密成64位元的密文的對稱密碼演算法,因此理論上來講,他的金鑰長度也是64位,但因為在DES的金鑰中每隔7位元,就會設定一個用於錯誤檢查的位元,所以實際上DES的金鑰的長度只有56位元. DES是以64位元的明文(位元序列)為一個單位進行加密,這64位元的單位成為分組,一般來說,以分組為單位進行處理的密碼演算法成為分組密碼.因此它只能加密64位元的資料,對於長度超過64位元的明文,就需要對DES加密進行迭代.DES加密和解密的過程如下圖所示:

詳細解析DES系列加密技術(一)
DES的結構(Feistel網路) 因為DES的基本結構是由Horst Feistel設計的,所以DES的基本結構也被稱為Feistel網路.在Feistel網路中,加密的各個步驟稱為輪,整個加密過程就是進行若干次輪的迴圈.DES就是一種16輪迴圈的Feistel網路.

上面的圖表示出了Feistel網路中一輪的計算流程.通過上面的圖我們可以知道,在這一過程中起到關鍵作用的就是輪函式:他根據歐策和子金鑰生成對”左側”進行加密的位元序列.然後輪函式的輸出與左側進行XOR運算,得到了左側的加密結果,過程梳理如下:

詳細解析DES系列加密技術(一)
(一) 輸入的資料被分為左右兩部分 (二) 輸入的右側直接傳送到輸出的右側 (三) 輸入的右側傳送到輪函式 (四) 輪函式根據右側資料和子金鑰,計算出位元序列 (五) 左側資料與輪函式的輸出進行XOR運算,得到輸出的加密後的左側. 但是,我們根據圖也能發現,這樣雖然左側經過加密了,但右側並沒有經過加密.所以Feistel網路需要進行第二次的輪加密,並且需要將左側和右側進行對調.一般來說DES加密是需要三次輪加密的,並且這一過程是可逆的,只要子金鑰不變,就能夠從密文推匯出明文.這也就是Feistel網路的解密操作原理.我們現在來總結一下Feistel網路的一些性質: (一) 經過我們之上的說明,很容易就知道Feistel網路的輪數是可以任意增加的.並且無論有多少輪,都是可以解密的. (二) 加密時無論使用任何函式作為輪函式,都可以正確解密 (三) 加密和解密可以用完全相同的結構來實現. 現在我們附上一段DES加密演算法在Java中的實現:package org.shangzeng.cipher;

import javax.crypto.*; import javax.crypto.spec.DESKeySpec; import java.security.InvalidKeyException; import java.security.NoSuchAlgorithmException; import java.security.SecureRandom; import java.security.spec.InvalidKeySpecException;

public class DESTest { public static void main(String[] args) { String greeting="HelloWorld"; String key="shangzeng"; try { byte[] encryptArray=DESTest.encryptDES(greeting.getBytes(),key.getBytes()); System.out.println(greeting+"加密後的結果為:"+new String(encryptArray)); byte[] decryptArray=DESTest.decryptDES(encryptArray,key.getBytes()); System.out.println(greeting+"解密後的結果為:"+new String(decryptArray)); } catch (InvalidKeyException e) { e.printStackTrace(); } catch (NoSuchAlgorithmException e) { e.printStackTrace(); } catch (InvalidKeySpecException e) { e.printStackTrace(); } catch (NoSuchPaddingException e) { e.printStackTrace(); } catch (BadPaddingException e) { e.printStackTrace(); } catch (IllegalBlockSizeException e) { e.printStackTrace(); } }

//DES演算法要有一個隨機數源,因為Random是根據時間戳生成的有限隨機數,比較容易破解,所以在這裡使用SecureRandom
private static SecureRandom secureRandom=new SecureRandom();

private static SecretKey getSecretKey(byte[] keyArray) throws InvalidKeyException, NoSuchAlgorithmException, InvalidKeySpecException {
    DESKeySpec desKeySpec=new DESKeySpec(keyArray);
    //建立DES金鑰工廠
    SecretKeyFactory keyFactory=SecretKeyFactory.getInstance("DES");
    //用金鑰工廠將DESKeySpec轉換成金鑰key
    SecretKey secretKey=keyFactory.generateSecret(desKeySpec);
    return secretKey;
}

public static byte[] encryptDES(byte[] contentArray,byte[] keyArray) throws InvalidKeyException, NoSuchAlgorithmException, InvalidKeySpecException, NoSuchPaddingException, BadPaddingException, IllegalBlockSizeException {
    return des(contentArray,keyArray,Cipher.ENCRYPT_MODE);
}

public static byte[] decryptDES(byte[] encryptArray,byte[] keyArray) throws NoSuchPaddingException, NoSuchAlgorithmException, IllegalBlockSizeException, BadPaddingException, InvalidKeyException, InvalidKeySpecException {
    return des(encryptArray,keyArray,Cipher.DECRYPT_MODE);
}

private static byte[] des(byte[] contentArray,byte[] keyArray,int mode) throws NoSuchPaddingException, NoSuchAlgorithmException, InvalidKeyException, InvalidKeySpecException, BadPaddingException, IllegalBlockSizeException {
    SecretKey secretKey=getSecretKey(keyArray);
    //獲取真正執行加/解密操作的Cipher
    Cipher cipher=Cipher.getInstance("DES");
    //執行加/解密操作
    cipher.init(mode,secretKey,secureRandom);
    byte[] result=cipher.doFinal(contentArray);
    return result;
}
複製程式碼

}

講到這裡,必須要提一下,差分分析和線性分析. 差分分析是一種針對分組密碼的分析方法,他的思路是”改變一部分明文並分析密文如何隨之改變”.理論上來說,明文只要改變,哪怕是一個位元的改變,密文的位元排列也應該徹底的改變.因此只要通過分析密文改變中所產生的偏差,就可以獲得破譯密碼的線索. 線性分析是由鬆井充提出的,他的思路是:”將明文和密文的一些對應位元進行XOR並計算其結果為零的概率”,如果密文具備足夠的隨機性,則任選一些明文和密文的對應位元進行XOR結果為零的概率為1/2.如果能夠找到大幅偏離1/2的部分,則可以藉此獲得一些與金鑰有關的資訊.如果使用線性分析,對於DES只需要2^47組明文和密文就能夠完成破解.相比需要嘗試2^56個金鑰的暴力破解來說,所需的計算量大幅減少. 密碼破譯者可以選擇任意明文並獲得其加密的結果,這是差分分析和線性分析的一個大前提.這種攻擊方式也被稱為 選擇明文攻擊(CPA,Chosen Plaintext Attack) DES從1977年開始被美國聯邦資訊處理標準(FIPS)採用,主要被用於國家政府和銀行等行業,但在1999年1月,distributed.net與電子前哨基金會合作,在22小時15分鐘內即公開破解了一個DES金鑰,另有一些分析報告提出了該演算法的理論上的弱點。在2001年,DES作為一個標準已經被所取代。另外,DES已經不再作為美國國家標準科技協會(前國家標準局)的一個標準. 如果說DES不安全,那麼我們該用什麼加密演算法呢?期待下次分享 《詳細解析DES系列加密技術(二)》 如果大家有什麼建議或問題,歡迎大家進群討論,另群裡有學習資料奉送哦 群號為: 661594029

相關文章