Java實(shí)現(xiàn)DES加解密算法解析
本文實(shí)例講述了Java實(shí)現(xiàn)DES加解密算法解析。分享給大家供大家參考,具體如下:
簡介:
數(shù)據(jù)加密算法(Data Encryption Algorithm,DEA)是一種對(duì)稱加密算法,很可能是使用最廣泛的密鑰系統(tǒng),特別是在保護(hù)金融數(shù)據(jù)的安全中,最初開發(fā)的DEA是嵌入硬件中的。通常,自動(dòng)取款機(jī)(Automated Teller Machine,ATM)都使用DEA。它出自IBM的研究工作,IBM也曾對(duì)它擁有幾年的專利權(quán),但是在1983年已到期后,處于公有范圍中,允許在特定條件下可以免除專利使用費(fèi)而使用。1977年被美國政府正式采納。
1998年后實(shí)用化DES破譯機(jī)的出現(xiàn)徹底宣告DES算法已不具備安全性,1999年NIST頒布新標(biāo)準(zhǔn),規(guī)定DES算法只能用于遺留加密系統(tǒng),但不限制使用DESede算法。當(dāng)今DES算法正是推出歷史舞臺(tái),AES算法稱為他的替代者。
加密原理:
DES 使用一個(gè) 56 位的密鑰以及附加的 8 位奇偶校驗(yàn)位,產(chǎn)生最大 64 位的分組大小。這是一個(gè)迭代的分組密碼,使用稱為 Feistel 的技術(shù),其中將加密的文本塊分成兩半。使用子密鑰對(duì)其中一半應(yīng)用循環(huán)功能,然后將輸出與另一半進(jìn)行“異或”運(yùn)算;接著交換這兩半,這一過程會(huì)繼續(xù)下去,但 最后一個(gè)循環(huán)不交換。DES 使用 16 個(gè)循環(huán),使用異或,置換,代換,移位操作四種基本運(yùn)算。
JDK對(duì)DES算法的支持
密鑰長度:56位
工作模式:ECB/CBC/PCBC/CTR/CTS/CFB/CFB8 to CFB128/OFB/OBF8 to OFB128
填充方式:Nopadding/PKCS5Padding/ISO10126Padding/
Java 加密解密之對(duì)稱加密算法DESede
DESede 即三重DES加密算法,也被稱為3DES或者Triple DES。使用三(或兩)個(gè)不同的密鑰對(duì)數(shù)據(jù)塊進(jìn)行三次(或兩次)DES加密(加密一次要比進(jìn)行普通加密的三次要快)。三重DES的強(qiáng)度大約和112- bit的密鑰強(qiáng)度相當(dāng)。通過迭代次數(shù)的提高了安全性,但同時(shí)也造成了加密效率低的問題。正因DESede算法效率問題,AES算法誕生了。
到目前為止,還沒有人給出攻擊三重DES的有效方法。對(duì)其密鑰空間中密鑰進(jìn)行蠻干搜索,那么由于空間太大,這實(shí)際上是不可行的。若用差分攻擊的方法,相對(duì)于單一DES來說復(fù)雜性以指數(shù)形式增長。
三重DES有四種模型
- DES-EEE3,使用三個(gè)不同密鑰,順序進(jìn)行三次加密變換。
- DES-EDE3,使用三個(gè)不同密鑰,依次進(jìn)行加密-解密-加密變換。
- DES-EEE2,其中密鑰K1=K3,順序進(jìn)行三次加密變換。
- DES-EDE2, 其中密鑰K1=K3,依次進(jìn)行加密-解密-加密變換。
Java對(duì)DES算法的加密代碼
package com.favccxx.codelib; import java.security.SecureRandom; import javax.crypto.Cipher; import javax.crypto.SecretKey; import javax.crypto.SecretKeyFactory; import javax.crypto.spec.DESKeySpec; public class EncryptCoder { private final static String DES = "DES"; public static byte[] encrypt(byte[] src, byte[] key) throws Exception { // DES算法要求有一個(gè)可信任的隨機(jī)數(shù)源 SecureRandom sr = new SecureRandom(); // 從原始密匙數(shù)據(jù)創(chuàng)建DESKeySpec對(duì)象 DESKeySpec dks = new DESKeySpec(key); // 創(chuàng)建一個(gè)密匙工廠,然后用它把DESKeySpec轉(zhuǎn)換成一個(gè)SecretKey對(duì)象 SecretKeyFactory keyFactory = SecretKeyFactory.getInstance(DES); SecretKey securekey = keyFactory.generateSecret(dks); // Cipher對(duì)象實(shí)際完成加密操作 Cipher cipher = Cipher.getInstance(DES); // 用密匙初始化Cipher對(duì)象 cipher.init(Cipher.ENCRYPT_MODE, securekey, sr); // 正式執(zhí)行加密操作 return cipher.doFinal(src); } /** * * @param password 密碼 * @param key 加密字符串 * @return */ public final static String encrypt(String password, String key) { try { return byte2String(encrypt(password.getBytes(), key.getBytes())); } catch (Exception e) { } return null; } public static String byte2String(byte[] b) { String hs = ""; String stmp = ""; for (int n = 0; n < b.length; n++) { stmp = (java.lang.Integer.toHexString(b[n] & 0XFF)); if (stmp.length() == 1) hs = hs + "0" + stmp; else hs = hs + stmp; } return hs.toUpperCase(); } public static void main(String[] args){ String encryptString = encrypt("is張三豐","test中英文雜七爛八混搭@123654{"); System.out.println(encryptString); } //輸出:B00542E93695F4CFCE34FC4393C2F4BF }
Java對(duì)DES解密算法的實(shí)現(xiàn)
package com.favccxx.codelib; import java.security.SecureRandom; import javax.crypto.Cipher; import javax.crypto.SecretKey; import javax.crypto.SecretKeyFactory; import javax.crypto.spec.DESKeySpec; public class DescryptCoder { private final static String DES = "DES"; /** * * @param src 數(shù)據(jù)源 * @param key 密鑰,長度必須是8的倍數(shù) * @return * @throws Exception */ public static byte[] decrypt(byte[] src, byte[] key) throws Exception { // DES算法要求有一個(gè)可信任的隨機(jī)數(shù)源 SecureRandom sr = new SecureRandom(); // 從原始密匙數(shù)據(jù)創(chuàng)建一個(gè)DESKeySpec對(duì)象 DESKeySpec dks = new DESKeySpec(key); // 創(chuàng)建一個(gè)密匙工廠,然后用它把DESKeySpec對(duì)象轉(zhuǎn)換成一個(gè)SecretKey對(duì)象 SecretKeyFactory keyFactory = SecretKeyFactory.getInstance(DES); SecretKey securekey = keyFactory.generateSecret(dks); // Cipher對(duì)象實(shí)際完成解密操作 Cipher cipher = Cipher.getInstance(DES); // 用密匙初始化Cipher對(duì)象 cipher.init(Cipher.DECRYPT_MODE, securekey, sr); // 正式執(zhí)行解密操作 return cipher.doFinal(src); } public final static String decrypt(String data, String key) { try { return new String(decrypt(String2byte(data.getBytes()), key.getBytes())); } catch (Exception e) { e.printStackTrace(); } return null; } public static byte[] String2byte(byte[] b) { if ((b.length % 2) != 0) throw new IllegalArgumentException("長度不是偶數(shù)"); byte[] b2 = new byte[b.length / 2]; for (int n = 0; n < b.length; n += 2) { String item = new String(b, n, 2); b2[n / 2] = (byte) Integer.parseInt(item, 16); } return b2; } public static void main(String[] args){ String desencryptString = decrypt("B00542E93695F4CFCE34FC4393C2F4BF","test中英文雜七爛八混搭@123654"); System.out.println(desencryptString); } //輸出:is張三豐 }
希望本文所述對(duì)你有所幫助,Java實(shí)現(xiàn)DES加解密算法解析內(nèi)容就給大家介紹到這里了。希望大家繼續(xù)關(guān)注我們的網(wǎng)站!想要學(xué)習(xí)java可以繼續(xù)關(guān)注本站。
- Java實(shí)現(xiàn)AES/CBC/PKCS7Padding加解密的方法
- 詳細(xì)分析JAVA加解密算法
- Java實(shí)現(xiàn)與JS相同的Des加解密算法完整實(shí)例
- java加解密RSA使用方法代碼示例
- Java OpenSSL生成的RSA公私鑰進(jìn)行數(shù)據(jù)加解密詳細(xì)介紹
- Java加解密技術(shù)系列之RSA詳解
- java使用RSA與AES加密解密的實(shí)例代碼詳解
- java使用Base64實(shí)現(xiàn)文件加密解密
- java實(shí)現(xiàn)置換密碼加密解密
- java實(shí)現(xiàn)仿射密碼加密解密
- JAVA 實(shí)現(xiàn)磁盤文件加解密操作的示例代碼
相關(guān)文章
Mybatis之typeAlias配置的3種方式小結(jié)
這篇文章主要介紹了Mybatis之typeAlias配置的3種方式小結(jié),具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2022-01-01Mybatis持久層框架入門之CRUD實(shí)例代碼詳解
這篇文章主要介紹了Mybatis持久層框架入門之CRUD實(shí)例,需要的朋友可以參考下2022-05-05Spring Security實(shí)現(xiàn)身份認(rèn)證和授權(quán)的示例代碼
在 Spring Boot 應(yīng)用中使用 Spring Security 可以非常方便地實(shí)現(xiàn)用戶身份認(rèn)證和授權(quán),本文主要介紹了Spring Security實(shí)現(xiàn)身份認(rèn)證和授權(quán)的示例代碼,感興趣的可以了解一下2023-06-06mybatis-plus自帶QueryWrapper自定義sql實(shí)現(xiàn)復(fù)雜查詢實(shí)例詳解
MyBatis-Plus是一個(gè)MyBatis(opens new window)的增強(qiáng)工具,在 MyBatis的基礎(chǔ)上只做增強(qiáng)不做改變,MyBatis可以無損升級(jí)為MyBatis-Plus,這篇文章主要給大家介紹了關(guān)于mybatis-plus自帶QueryWrapper自定義sql實(shí)現(xiàn)復(fù)雜查詢的相關(guān)資料,需要的朋友可以參考下2022-10-10Springboot+QueryDsl實(shí)現(xiàn)融合數(shù)據(jù)查詢
這篇文章主要將介紹的是 Springboot 使用 QueryDsl 實(shí)現(xiàn)融合數(shù)據(jù)查詢,文中有詳細(xì)的代碼講解,對(duì) SpringBoot?Querydsl?查詢操作感興趣的朋友一起看看吧2023-08-08如何實(shí)現(xiàn)廣告彈窗觸達(dá)頻率的控制?
這篇文章主要介紹了如何實(shí)現(xiàn)廣告彈窗觸達(dá)頻率的控制,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2019-04-04SpringBoot結(jié)合JWT實(shí)現(xiàn)用戶登錄、注冊(cè)、鑒權(quán)
用戶登錄、注冊(cè)及鑒權(quán)是我們基本所有系統(tǒng)必備的,也是很核心重要的一塊,本文主要介紹了SpringBoot結(jié)合JWT實(shí)現(xiàn)用戶登錄、注冊(cè)、鑒權(quán),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2023-05-05