奇妙的安全旅行之DES算法(一)
hi,大家好,從今天開始我們介紹加密算法中的對稱加密算法。相信大家看了前幾篇文章,已經(jīng)對摘要算法的使用已經(jīng)有了比較深的認識,摘要算法由于其算法特性,只能單向加密,無法對數(shù)據(jù)反向解密,這時對稱加密算法就出現(xiàn)了。對稱算法主要有DES、3DES 和 AES,今天我們重點介紹一下對稱加密算法中的DES 算法。
DES 算法介紹
DES (Data Encryption Standard)算法是世界上最常用的加密算法。在很長時間內(nèi),許多人心目中“密碼生成”與DES一直是個同義詞。盡管后來有個叫Electronic Frontier Foundation的組織造了臺價值22萬的機器嘗試破解DES加密的數(shù)據(jù),直到現(xiàn)在DES和它的變種3DES(三重數(shù)據(jù)加密算法)仍然在政府和銀行中被廣泛使用。
注:在2001年AES算法成為了DES算法的替代品。
國家標準局催生了DES
1973年5月,在尼克松任期,美國國家標準局下發(fā)了紅頭文件,征求加密算法來保護傳輸過程中的數(shù)據(jù)。國家標準局等了很久一直沒有人投標,一直到1974年8月6日,尼克松卸任前三天,IBM才拿出了自己家開發(fā)的一套代號LUCIFER(金星)的東西。美國安全局評估后,在1977年7月15日采用了LUCIFER的一個變種作為數(shù)據(jù)加密標準DES。
DES很快被非數(shù)字媒體采用,比如電話線中的信號加密。在那些年里,國際香料組織IFF曾用DES來加密那些用電話線傳輸?shù)拿孛芘浞健?#xff08;“With Data Encryption, Scents Are Safe at IFF,” Computerworld 14, No. 21, 95 (1980))
同時,作為政府之后第二大急需加密的銀行業(yè)也將DES作為廣泛應(yīng)用的標準,美國國家標準協(xié)會ANSI制定了整個銀行業(yè)的加密規(guī)范。1980年采用的ANSI X3.92指定了DES算法的應(yīng)用。
DES 算法特點
-
DES加密算法屬于對稱加密,加密與解密用的是同一個密鑰。
-
DES加密算法要求密鑰必須是8個字節(jié),即64bit長度;有效秘鑰長度為56位,每個字節(jié)第8位用作奇偶校驗。
-
因為密鑰是byte[8],代表字符串也可以是非可見的字節(jié),可以與Base64編碼算法一起使用。
-
加密、解密都需要通過字節(jié)數(shù)組作為數(shù)據(jù)和密鑰進行處理。
-
DES 算法是兩種加密技術(shù)的組合:混亂和擴散。先替代后置換。
-
易于實現(xiàn),DES 算法只是使用了標準的算術(shù)和邏輯運算,其作用的數(shù)最多也只有64 位,因此用70年代末期的硬件技術(shù)很容易實現(xiàn)。
DES 算法的優(yōu)缺點
優(yōu)點:
-
效率高,算法簡單,系統(tǒng)開銷小
-
適合加密大量數(shù)據(jù)
-
明文長度和密文長度相等
缺點:
-
需要以安全方式進行秘鑰交換
-
秘鑰管理復(fù)雜
DES算法具有很高的安全性,到目前為止,除了用窮舉搜索法對DES算法進行攻擊外,還沒有發(fā)現(xiàn)更有效的辦法。而56位長的密鑰的窮舉空間為256,這意味著如果一臺計算機的速度是每一秒種檢測一百萬個密鑰,則它搜索完全部密鑰就需要將近2285年的時間,可見,這是難以實現(xiàn)的,當然,隨著科學(xué)技術(shù)的發(fā)展,當出現(xiàn)超高速計算機后,我們可考慮把DES密鑰的長度再增長一些,以此來達到更高的保密程度。
DES 加密原理:
DES 使用一個 56 位的密鑰以及附加的 8 位奇偶校驗位,產(chǎn)生最大 64 位的分組大小。這是一個迭代的分組密碼,使用稱為 Feistel 的技術(shù),其中將加密的文本塊分成兩半。使用子密鑰對其中一半應(yīng)用循環(huán)功能,然后將輸出與另一半進行"異或"運算;接著交換這兩半,這一過程會繼續(xù)下去,但最后一個循環(huán)不交換。DES 使用 16 個循環(huán),使用異或,置換,代換,移位操作四種基本運算。
DES的加密過程
64位密鑰經(jīng)子密鑰產(chǎn)生算法產(chǎn)生出16個48位子密鑰:K1,K2,…,K16,分別供第1次,第2次,…,第16次加密迭代使用。
64位明文首先經(jīng)過初始置換IP,將數(shù)據(jù)打亂重新排列并分成左右兩半,左邊32位構(gòu)成L0,右邊32位構(gòu)成R0。
第i次加密迭代:由輪函數(shù)f實現(xiàn)子密鑰Ki對Ri-1的加密,結(jié)果為32位的數(shù)據(jù)組f ( Ri-1 , Ki )。f ( Ri-1 , Ki )再與Li-1模2相加,又得到一個32位的數(shù)據(jù)組Li-1 ⊕ f ( Ri-1 , Ki )。以Li ⊕ f ( Ri-1 , Ki )作為下一次加密迭代的Ri,以Ri-1作為下一次加密迭代的Li ( i = 1,2,…,16)。
按照上一步的規(guī)則進行16次加密迭代。
第16次加密迭代結(jié)束后,以R16為左,L16為右,合并產(chǎn)生一個64位的數(shù)據(jù)組。再經(jīng)過逆初始置換IP-1,將數(shù)據(jù)重新排列,便得到64位密文。
DES的解密過程
64位密鑰經(jīng)子密鑰產(chǎn)生算法產(chǎn)生出16個48位子密鑰:K1,K2,…,K16,分別供第1次,第2次,…,第16次解密迭代使用。
64位密文首先經(jīng)過初始置換IP,將數(shù)據(jù)打亂重新排列并分成左右兩半,左邊32位構(gòu)成R16,右邊32位構(gòu)成L16。
第17-i次解密迭代:由輪函數(shù)f實現(xiàn)子密鑰Ki對Li的解密,結(jié)果為32位的數(shù)據(jù)組f ( Li , Ki )。f ( Li , Ki )再與Ri模2相加,又得到一個32位的數(shù)據(jù)組Ri ⊕ f ( Li , Ki )。以Ri ⊕ f ( Li , Ki )作為下一次解密迭代的Li-1,以Li作為下一次解密迭代的Li-1 ( i = 16,15,…,1)。
按照上一步的規(guī)則進行16次解密迭代。
第16次解密迭代結(jié)束后,以L0為左,R0為右,合并產(chǎn)生一個64位的數(shù)據(jù)組。再經(jīng)過逆初始置換IP-1,將數(shù)據(jù)重新排列,便得到64位明文。
DES 算法實現(xiàn)
對稱加密算法會有不同的分組模式和填充方式,這里我們使用的分組模式是ECB,填充模式為NoPadding,目前這種方式是比較常見的應(yīng)用場景,實現(xiàn)代碼示例如下:
private static final String DES_ALGORITHM = "DES";private static final String DES_CIPHER = "DES/ECB/NoPadding";// des 加密 public static byte[] encryptDES(String data, String key) throws Exception {// 生成SecretKey對象SecretKey secretKey = desKeyGenerator(key);// Cipher對象實際完成加密操作Cipher cipher = Cipher.getInstance(DES_CIPHER);// 用密匙初始化Cipher對象cipher.init(Cipher.ENCRYPT_MODE, secretKey);// 執(zhí)行加密操作return cipher.doFinal(data.getBytes()); }// des 解密 public static byte[] decryptDES(byte[] data, String key) throws Exception {// 生成SecretKey對象SecretKey secretKey = desKeyGenerator(key);// Cipher對象實際完成解密操作Cipher cipher = Cipher.getInstance(DES_CIPHER);// 用密匙初始化Cipher對象cipher.init(Cipher.DECRYPT_MODE, secretKey);// 執(zhí)行解密操作return cipher.doFinal(data); }/*** DES Key 生成方法** @param key* @return */ private static SecretKey desKeyGenerator(String key) {try {// 創(chuàng)建一個DESKeySpec對象DESKeySpec desKey = new DESKeySpec(key.getBytes());// 創(chuàng)建一個密匙工廠SecretKeyFactory keyFactory = SecretKeyFactory.getInstance(DES_ALGORITHM);// 將DESKeySpec對象轉(zhuǎn)換成SecretKey對象return keyFactory.generateSecret(desKey);} catch (InvalidKeyException e) {e.printStackTrace();} catch (NoSuchAlgorithmException e) {e.printStackTrace();} catch (InvalidKeySpecException e) {e.printStackTrace();}return null; }/*** Nopadding填充時,明文不是8位的倍數(shù)時需補足,這里補位0x00** @param b* @return*/ private static byte[] fillZero(byte[] b) {int len = b.length;//data不足8位以0補足8位if (b.length % 8 != 0) {len = b.length - b.length % 8 + 8;} else {return b;}byte[] needData = null;needData = new byte[len];for (int i = 0; i < len; i++) {needData[i] = 0x00;}System.arraycopy(b, 0, needData, 0, b.length);return needData; }查看完整代碼請訪問:
https://github.com/ForTheDevelopers/JavaSecurity
應(yīng)用場景
DES算法最常用的場景是銀行業(yè),如銀行卡收單,信用卡持卡人的PIN的加密傳輸,IC卡與POS間的雙向認證、金融交易數(shù)據(jù)包的MAC校驗等,均用到DES算法。另外,在POS、ATM、磁卡及智能卡(IC卡)、加油站、高速公路收費站等領(lǐng)域,DES算法也被廣泛應(yīng)用,以此來實現(xiàn)關(guān)鍵數(shù)據(jù)的保密。
總結(jié)
上面介紹了一下DES 算法的和DES的實現(xiàn),3DES算法是DES的變種,并不是一種新的算法,這里就不做過多介紹了,實現(xiàn)方式可以去下載完整源碼查看。關(guān)于對稱加密算法我們還沒有完整的討論對稱加密中的分組模式以及填充模式,雖然代碼實現(xiàn)中也涉及了分組和填充,下一節(jié)我們會詳細介紹這部分內(nèi)容。
DES算法雖然有被破解的可能,但是目前依然在一些金融系統(tǒng)中被廣泛使用,尤其工作是在金融方面的小伙伴們,也是需要大家去了解和掌握的,以便于工作中遇到時可以有的放矢。
創(chuàng)作不易,如果大家喜歡本文,歡迎點贊,轉(zhuǎn)發(fā),你的關(guān)注是我們繼續(xù)前進的動力_
總結(jié)
以上是生活随笔為你收集整理的奇妙的安全旅行之DES算法(一)的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: lamp mysql5.0_CentOS
- 下一篇: 模拟网页行为之实践篇三