java 實現(xiàn)DES 加密解密的示例
更新時間:2020年12月02日 09:47:58 作者:紅塵沙漏
這篇文章主要介紹了java 實現(xiàn)DES 加密解密的示例代碼,幫助大家更好的理解和使用Java進行加解密,感興趣的朋友可以了解下
package com.cn.peitest;
import javax.crypto.Cipher;
import javax.crypto.SecretKey;
import javax.crypto.SecretKeyFactory;
import javax.crypto.spec.DESKeySpec;
import javax.crypto.spec.IvParameterSpec;
/**
* @功能說明: <BR>
* @創(chuàng)建日期:2016年9月21日<BR>
* @變更記錄:<BR>
* 1、2016年9月21日 LeoLu 更新
*/
public class DESUtil {
/**用于建立大寫的十六進制字符的輸出*/
private static final char[] DIGITS_UPPER = { '0', '1', '2', '3', '4', '5', '6', '7', '8', '9', 'A', 'B', 'C', 'D', 'E', 'F' };
/**DES向量*/
private static final byte[] iv = {0x12, 0x34, 0x56, 0x78, (byte) 0x90, (byte) 0xab, (byte) 0xcd, (byte) 0xef};
//private static final Logger log = LoggerFactory.getLogger(DESUtil.class);
/**
* @函數(shù)名稱:encodeHex<br>
* @創(chuàng)建日期:2016年9月22日<br>
* @功能說明: 將字節(jié)數(shù)組轉(zhuǎn)換為十六進制字節(jié)數(shù)組 <br>
* @參數(shù)說明:data byte[] 字節(jié)數(shù)組<br>
* @參數(shù)說明:toDigits char[] 向量<br>
* @返回說明:十六進制char[]
*/
private static char[] encodeHex(byte[] data, char[] toDigits) {
int l = data.length;
char[] out = new char[l << 1];
for (int i = 0, j = 0; i < l; i++) {
out[j++] = toDigits[(0xF0 & data[i]) >>> 4];
out[j++] = toDigits[0x0F & data[i]];
}
return out;
}
/**
* @函數(shù)名稱:encodeHexStr<br>
* @創(chuàng)建日期:2016年9月22日<br>
* @功能說明:將16進制字節(jié)數(shù)組轉(zhuǎn)換為十六進制字符串 <br>
* @參數(shù)說明:data byte[] 16進制字節(jié)數(shù)組 <br>
* @參數(shù)說明:toDigits char[] 向量 <br>
* @返回說明:String 返回16進制字符串
*/
private static String encodeHexStr(byte[] data, char[] toDigits) {
return new String(encodeHex(data, toDigits));
}
/**
* @函數(shù)名稱:hexStringToString<br>
* @創(chuàng)建日期:2016年9月21日<br>
* @功能說明:將16進制字符串轉(zhuǎn)換為10進制字符串 <br>
* @參數(shù)說明:str String 16進制字符串 <br>
* @返回說明:String
*/
private static String hexStringToString(String str) {
if (str == null || str.equals("")) {
return null;
}
str = str.replace(" ", "");
byte[] baKeyword = new byte[str.length() / 2];
for (int i = 0; i < baKeyword.length; i++) {
try {
baKeyword[i] = (byte) (0xff & Integer.parseInt(
str.substring(i * 2, i * 2 + 2), 16));
} catch (Exception e) {
e.printStackTrace();
}
}
try {
str = new String(baKeyword, "UTF-8");
new String();
} catch (Exception e1) {
e1.printStackTrace();
}
return str;
}
/**
* @函數(shù)名稱:encrypt<br>
* @創(chuàng)建日期:2016年9月22日<br>
* @功能說明:加密字節(jié)數(shù)組 <br>
* @參數(shù)說明:arrB byte[] 需要加密的字節(jié)數(shù)組 <br>
* @參數(shù)說明:key String 秘鑰 <br>
* @返回說明:byte[]
*/
private static byte[] encrypt(byte[] arrB, String key) throws Exception {
return converCrypt(arrB, key, true);
}
/**
* @函數(shù)名稱:encrypt<br>
* @創(chuàng)建日期:2016年9月22日<br>
* @功能說明:加密字符串 <br>
* @參數(shù)說明:xml String 加密字符串 <br>
* @參數(shù)說明:key String 秘鑰 <br>
* @返回說明:String 返回加密后的16進制字符串
*/
public static String encrypt(String xml, String key) {
try {
return encodeHexStr(encrypt(xml.getBytes("UTF-8"), key), DIGITS_UPPER);
} catch (Exception e) {
System.out.println(e);
return "";
}
}
/**
* @函數(shù)名稱:decrypt<br>
* @創(chuàng)建日期:2016年9月22日<br>
* @功能說明: 將16進制字節(jié)數(shù)組進行解密 <br>
* @參數(shù)說明: arrB byte[] 解密字節(jié)數(shù)組<br>
* @參數(shù)說明:key String 秘鑰 <br>
* @返回說明:byte[] 返回解密后 的16位字節(jié)數(shù)組
*/
private static byte[] decrypt(byte[] arrB, String key) throws Exception {
return converCrypt(arrB, key, false);
}
/**
* @函數(shù)名稱:converCrypt<br>
* @創(chuàng)建日期:2016年9月22日<br>
* @功能說明:將16位的字節(jié)數(shù)據(jù)進行加密或解密 <br>
* @參數(shù)說明: arrB byte[] 需要加密的字節(jié)數(shù)組<br>
* @參數(shù)說明: key String 秘鑰<br>
* @參數(shù)說明:encrypt boolean是否加密,true加密,false解密 <br>
* @返回說明:byte[] 返回16進制字節(jié)數(shù)組
*/
private static byte[] converCrypt(byte[] arrB, String key, boolean encrypt) throws Exception{
String vikey = MD5.sign(key).substring(0, 8).toUpperCase();
DESKeySpec desKeySpec = new DESKeySpec(vikey.getBytes());
SecretKeyFactory keyFactory = SecretKeyFactory.getInstance("DES");
SecretKey secretKey = keyFactory.generateSecret(desKeySpec);
IvParameterSpec ivp = new IvParameterSpec(vikey.getBytes());
Cipher cipher = Cipher.getInstance("DES/CBC/PKCS5Padding");
/**加密*/
if (encrypt == true) {
cipher.init(Cipher.ENCRYPT_MODE, secretKey, ivp);
} else{
/**解密*/
cipher.init(Cipher.DECRYPT_MODE, secretKey, ivp);
}
return cipher.doFinal(arrB);
}
/**
* @函數(shù)名稱:decrypt<br>
* @創(chuàng)建日期:2016年9月22日<br>
* @功能說明:解密16進制字符串 <br>
* @參數(shù)說明: desStr String 需要解密的16進制字符串<br>
* @參數(shù)說明: key String 秘鑰<br>
* @返回說明:String 返回解密后的10進制字符串
*/
public static String decrypt(String desStr, String key) {
try{
if (null == desStr || null == key) {
return "";
}
return hexStringToString(encodeHexStr(decrypt(hexStringToByte(new String(desStr.getBytes("UTF-8"))), key), DIGITS_UPPER));
} catch (Exception e) {
System.out.println();
return "";
}
}
/**
* @函數(shù)名稱:hexStringToByte<br>
* @創(chuàng)建日期:2016年9月22日<br>
* @功能說明:將16進制字符串轉(zhuǎn)換為16進制字節(jié)數(shù)組 <br>
* @參數(shù)說明:hex String需要轉(zhuǎn)換的16進制字符串 <br>
* @返回說明:byte[] 返回轉(zhuǎn)換后的16進制字節(jié)數(shù)組
*/
private static byte[] hexStringToByte(String hex) {
int len = (hex.length() / 2);
byte[] result = new byte[len];
char[] achar = hex.toCharArray();
for (int i = 0; i < len; i++) {
int pos = i * 2;
result[i] = (byte) (toByte(achar[pos]) << 4 | toByte(achar[pos + 1]));
}
return result;
}
/**
* @函數(shù)名稱:toByte<br>
* @創(chuàng)建日期:2016年9月22日<br>
* @功能說明: 將字符轉(zhuǎn)換為字節(jié)<br>
* @參數(shù)說明: c char 需要轉(zhuǎn)換的字符<br>
* @返回說明:int 返回字符對應(yīng)的字節(jié)碼
*/
private static int toByte(char c) {
byte b = (byte) "0123456789ABCDEF".indexOf(c);
return b;
}
/**
* @構(gòu)造函數(shù)
*/
public DESUtil() {
// TODO Auto-generated constructor stub
}
/**
* @函數(shù)名稱:main<br>
* @創(chuàng)建日期:2016年9月21日<br>
* @功能說明: <br>
* @參數(shù)說明: <br>
* @返回說明:void
*/
public static void main(String[] args) {
// TODO Auto-generated method stub
try {
System.out.println("-----------------------------");
String bStr = "123";
String key = "SZAOA589";
String binSing = encrypt(bStr, key);
System.out.println("加密前:"+bStr);
System.out.println("加密后:"+binSing);
System.out.println("解密后:"+decrypt(binSing, key));
System.out.println("-------------------------");
} catch (Exception e) {
// TODO Auto-generated catch bloc
e.printStackTrace();
}
//3B976A2A2919A60B57DFF3518F65E1FF
//3B976A2A2919A60B57DFF3518F65E1FF
/*
* C4A737D04D0D05E2
BD2DD4FC5050EBD0
*/
}
}
//================================
package com.cn.peitest;
import java.security.MessageDigest;
public class MD5 {
// 生成MD5(截取16位長度)
public static String sign(String message) {
String md5 = "";
try {
MessageDigest md = MessageDigest.getInstance("MD5"); // 創(chuàng)建一個md5算法對象
byte[] messageByte = message.getBytes("UTF-8");
byte[] md5Byte = md.digest(messageByte); // 獲得MD5字節(jié)數(shù)組,16*8=128位
md5 = bytesToHex(md5Byte).substring(0, 16); // 轉(zhuǎn)換為16進制字符串
} catch (Exception e) {
e.printStackTrace();
}
return md5;
}
// 二進制轉(zhuǎn)十六進制
public static String bytesToHex(byte[] bytes) {
StringBuffer hexStr = new StringBuffer();
int num;
for (int i = 0; i < bytes.length; i++) {
num = bytes[i];
if (num < 0) {
num += 256;
}
if (num < 16) {
hexStr.append("0");
}
hexStr.append(Integer.toHexString(num));
}
return hexStr.toString().toUpperCase();
}
}
以上就是java 實現(xiàn)DES 加密解密的示例代碼的詳細內(nèi)容,更多關(guān)于java des加密解密的資料請關(guān)注腳本之家其它相關(guān)文章!
您可能感興趣的文章:
- java必懂的冷知識點之Base64加密與解密
- plsql實現(xiàn)DES對稱加密 Java解密
- Java AES加密和解密教程
- Java實現(xiàn)md5和base64加密解密的示例代碼
- Java上傳下載文件并實現(xiàn)加密解密
- java使用RSA加密方式實現(xiàn)數(shù)據(jù)加密解密的代碼
- Java AES256加密解密示例代碼
- 如何通過Java實現(xiàn)加密、解密Word文檔
- java使用RSA與AES加密解密的實例代碼詳解
- java使用Base64實現(xiàn)文件加密解密
- java使用異或?qū)ξ募M行加密解密
- java實現(xiàn)微信小程序加密數(shù)據(jù)解密算法
- Java可視化之實現(xiàn)文本的加密和解密
相關(guān)文章
SpringMVC @RequestMapping注解作用詳解
通過@RequestMapping注解可以定義不同的處理器映射規(guī)則,下面這篇文章主要給大家介紹了關(guān)于SpringMVC中@RequestMapping注解用法的相關(guān)資料,文中通過實例代碼介紹的非常詳細,需要的朋友可以參考下2023-01-01
教你如何使用Java8實現(xiàn)菜單樹形數(shù)據(jù)
今天給大家?guī)淼氖顷P(guān)于JAVA的相關(guān)知識,文中圍繞著如何使用Java8實現(xiàn)菜單樹形數(shù)據(jù)展開,文中有非常詳細的介紹及代碼示例,需要的朋友可以參考下2021-06-06
MyBatis游標Cursor的正確使用和百萬數(shù)據(jù)傳輸?shù)膬?nèi)存測試
這篇文章主要介紹了MyBatis游標Cursor的正確使用和百萬數(shù)據(jù)傳輸?shù)膬?nèi)存測試,具有很好的參考價值,希望對大家有所幫助,如有錯誤或未考慮完全的地方,望不吝賜教2024-01-01
Java實現(xiàn)精準Excel數(shù)據(jù)排序的方法詳解
在數(shù)據(jù)處理或者數(shù)據(jù)分析的場景中,需要對已有的數(shù)據(jù)進行排序,在Excel中可以通過排序功能進行整理數(shù)據(jù),而在Java中,則可以借助Excel表格插件對數(shù)據(jù)進行批量排序,下面我們就來學(xué)習(xí)一下常見的數(shù)據(jù)排序方法吧2023-10-10
Java 調(diào)用天氣Webservice詳解及實例代碼
這篇文章主要介紹了Java 調(diào)用天氣Webservice詳解及實例代碼的相關(guān)資料,這里附實例代碼,使用java 調(diào)用webservice 的小應(yīng)用,需要的朋友可以參考下2016-11-11

