Java實現(xiàn)DES加解密算法解析
本文實例講述了Java實現(xiàn)DES加解密算法解析。分享給大家供大家參考,具體如下:
簡介:
數(shù)據(jù)加密算法(Data Encryption Algorithm,DEA)是一種對稱加密算法,很可能是使用最廣泛的密鑰系統(tǒng),特別是在保護金融數(shù)據(jù)的安全中,最初開發(fā)的DEA是嵌入硬件中的。通常,自動取款機(Automated Teller Machine,ATM)都使用DEA。它出自IBM的研究工作,IBM也曾對它擁有幾年的專利權(quán),但是在1983年已到期后,處于公有范圍中,允許在特定條件下可以免除專利使用費而使用。1977年被美國政府正式采納。
1998年后實用化DES破譯機的出現(xiàn)徹底宣告DES算法已不具備安全性,1999年NIST頒布新標準,規(guī)定DES算法只能用于遺留加密系統(tǒng),但不限制使用DESede算法。當今DES算法正是推出歷史舞臺,AES算法稱為他的替代者。
加密原理:
DES 使用一個 56 位的密鑰以及附加的 8 位奇偶校驗位,產(chǎn)生最大 64 位的分組大小。這是一個迭代的分組密碼,使用稱為 Feistel 的技術(shù),其中將加密的文本塊分成兩半。使用子密鑰對其中一半應(yīng)用循環(huán)功能,然后將輸出與另一半進行“異或”運算;接著交換這兩半,這一過程會繼續(xù)下去,但 最后一個循環(huán)不交換。DES 使用 16 個循環(huán),使用異或,置換,代換,移位操作四種基本運算。
JDK對DES算法的支持
密鑰長度:56位
工作模式:ECB/CBC/PCBC/CTR/CTS/CFB/CFB8 to CFB128/OFB/OBF8 to OFB128
填充方式:Nopadding/PKCS5Padding/ISO10126Padding/
Java 加密解密之對稱加密算法DESede
DESede 即三重DES加密算法,也被稱為3DES或者Triple DES。使用三(或兩)個不同的密鑰對數(shù)據(jù)塊進行三次(或兩次)DES加密(加密一次要比進行普通加密的三次要快)。三重DES的強度大約和112- bit的密鑰強度相當。通過迭代次數(shù)的提高了安全性,但同時也造成了加密效率低的問題。正因DESede算法效率問題,AES算法誕生了。
到目前為止,還沒有人給出攻擊三重DES的有效方法。對其密鑰空間中密鑰進行蠻干搜索,那么由于空間太大,這實際上是不可行的。若用差分攻擊的方法,相對于單一DES來說復(fù)雜性以指數(shù)形式增長。
三重DES有四種模型
- DES-EEE3,使用三個不同密鑰,順序進行三次加密變換。
- DES-EDE3,使用三個不同密鑰,依次進行加密-解密-加密變換。
- DES-EEE2,其中密鑰K1=K3,順序進行三次加密變換。
- DES-EDE2, 其中密鑰K1=K3,依次進行加密-解密-加密變換。
Java對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算法要求有一個可信任的隨機數(shù)源
SecureRandom sr = new SecureRandom();
// 從原始密匙數(shù)據(jù)創(chuàng)建DESKeySpec對象
DESKeySpec dks = new DESKeySpec(key);
// 創(chuàng)建一個密匙工廠,然后用它把DESKeySpec轉(zhuǎn)換成一個SecretKey對象
SecretKeyFactory keyFactory = SecretKeyFactory.getInstance(DES);
SecretKey securekey = keyFactory.generateSecret(dks);
// Cipher對象實際完成加密操作
Cipher cipher = Cipher.getInstance(DES);
// 用密匙初始化Cipher對象
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對DES解密算法的實現(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算法要求有一個可信任的隨機數(shù)源
SecureRandom sr = new SecureRandom();
// 從原始密匙數(shù)據(jù)創(chuàng)建一個DESKeySpec對象
DESKeySpec dks = new DESKeySpec(key);
// 創(chuàng)建一個密匙工廠,然后用它把DESKeySpec對象轉(zhuǎn)換成一個SecretKey對象
SecretKeyFactory keyFactory = SecretKeyFactory.getInstance(DES);
SecretKey securekey = keyFactory.generateSecret(dks);
// Cipher對象實際完成解密操作
Cipher cipher = Cipher.getInstance(DES);
// 用密匙初始化Cipher對象
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張三豐
}
希望本文所述對你有所幫助,Java實現(xiàn)DES加解密算法解析內(nèi)容就給大家介紹到這里了。希望大家繼續(xù)關(guān)注我們的網(wǎng)站!想要學習java可以繼續(xù)關(guān)注本站。
相關(guān)文章
IDEA2022搭建Spring?Cloud多模塊項目的詳細過程
這篇文章主要介紹了IDEA2022搭建Spring?Cloud多模塊項目,網(wǎng)上有很多教程父模塊都是通過maven的方式創(chuàng)建的,然后子模塊是通過Spring?Initalizr方式創(chuàng)建,這種方式父模塊無法管理子模塊的依賴仲裁,需要每個子模塊自行管理,就失去了父模塊的用處了2022-10-10
SpringBoot基于Redis實現(xiàn)生成全局唯一ID的方法
在項目中生成全局唯一ID有很多好處,生成全局唯一ID有助于提高系統(tǒng)的可用性、數(shù)據(jù)的完整性和安全性,同時也方便數(shù)據(jù)的管理和分析,所以本文給大家介紹了SpringBoot基于Redis實現(xiàn)生成全局唯一ID的方法,文中有詳細的代碼講解,需要的朋友可以參考下2023-12-12
Java使用自定義注解+反射實現(xiàn)字典轉(zhuǎn)換代碼實例
這篇文章主要介紹了Java使用自定義注解+反射實現(xiàn)字典轉(zhuǎn)換代碼實例,注解是一種能被添加到j(luò)ava代碼中的元數(shù)據(jù),類、方法、變量、參數(shù)和包都可以用注解來修飾,注解對于它所修飾的代碼并沒有直接的影響,需要的朋友可以參考下2023-09-09
70行Java代碼實現(xiàn)深度神經(jīng)網(wǎng)絡(luò)算法分享
這篇文章主要介紹了70行Java代碼實現(xiàn)深度神經(jīng)網(wǎng)絡(luò)算法分享,涉及神經(jīng)網(wǎng)絡(luò)的計算過程,神經(jīng)網(wǎng)絡(luò)的算法程序?qū)崿F(xiàn),多層神經(jīng)網(wǎng)絡(luò)完整程序?qū)崿F(xiàn)等相關(guān)內(nèi)容,具有一定參考價值,需要的朋友可以參考下。2017-11-11
java 判斷一個數(shù)組中的數(shù)值是否連續(xù)相鄰的方法
下面小編就為大家分享一篇java 判斷一個數(shù)組中的數(shù)值是否連續(xù)相鄰的方法,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧2018-03-03

