最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

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)文章!

相關(guān)文章

  • Java編程中的vector類用法學(xué)習(xí)筆記

    Java編程中的vector類用法學(xué)習(xí)筆記

    Vector通常被用來實現(xiàn)動態(tài)數(shù)組,即可實現(xiàn)自動增長的對象數(shù)組,和C++一樣vector類同樣被Java內(nèi)置,下面就來看一下vector類的基本用法.
    2016-05-05
  • springboot對象為null的屬性在json中不顯示的解決

    springboot對象為null的屬性在json中不顯示的解決

    這篇文章主要介紹了springboot對象為null的屬性在json中不顯示的解決方案,具有很好的參考價值,希望對大家有所幫助,如有錯誤或未考慮完全的地方,望不吝賜教
    2023-09-09
  • pageHelper一對多分頁解決方案示例

    pageHelper一對多分頁解決方案示例

    這篇文章主要為大家介紹了pageHelper一對多分頁解決方案示例詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步,早日升職加薪
    2023-04-04
  • Java?ArrayList集合之解鎖數(shù)據(jù)存儲新姿勢

    Java?ArrayList集合之解鎖數(shù)據(jù)存儲新姿勢

    這篇文章主要介紹了Java?ArrayList集合之解鎖數(shù)據(jù)存儲新姿勢,ArrayList是一個動態(tài)數(shù)組,可以自動調(diào)整大小,并提供了豐富的操作方法,文中通過代碼介紹的非常詳細,需要的朋友可以參考下
    2025-03-03
  • SpringBoot訪問請求404解決方法

    SpringBoot訪問請求404解決方法

    這篇文章主要介紹了SpringBoot訪問請求404解決方法,文中有詳細的解決方法供大家參考,對我們學(xué)習(xí)或工作有一定的幫助,需要的朋友跟著小編一起來學(xué)習(xí)吧
    2023-07-07
  • Java線程狀態(tài)轉(zhuǎn)換關(guān)系實例解析

    Java線程狀態(tài)轉(zhuǎn)換關(guān)系實例解析

    這篇文章主要介紹了Java線程狀態(tài)轉(zhuǎn)換關(guān)系實例解析,文中通過示例代碼介紹的非常詳細,對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友可以參考下
    2020-08-08
  • 學(xué)會Java字節(jié)碼指令,成為技術(shù)大佬

    學(xué)會Java字節(jié)碼指令,成為技術(shù)大佬

    Java 字節(jié)碼指令是 JVM 體系中非常難啃的一塊硬骨頭,我估計有些讀者會有這樣的疑惑,“Java 字節(jié)碼難學(xué)嗎?我能不能學(xué)會啊?”本文帶領(lǐng)大家一探究竟,幫助大家搞懂java底層代碼如何執(zhí)行
    2021-08-08
  • 使用WebUploader實現(xiàn)上傳文件功能(一)

    使用WebUploader實現(xiàn)上傳文件功能(一)

    這篇文章主要為大家詳細介紹了使用WebUploader實現(xiàn)上傳文件功能,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2018-01-01
  • 對Java中傳值調(diào)用的理解分析

    對Java中傳值調(diào)用的理解分析

    這篇文章主要介紹了對Java中傳值調(diào)用的理解分析,通過分析對比,較為深入的分析了Java中傳值調(diào)用的原理與用法,需要的朋友可以參考下
    2015-01-01
  • Java編寫實現(xiàn)登陸窗口

    Java編寫實現(xiàn)登陸窗口

    這篇文章主要為大家詳細介紹了Java編寫實現(xiàn)登陸窗口,文中示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2022-04-04

最新評論

宜昌市| 大余县| 苍南县| 晋宁县| 嵩明县| 大邑县| 江陵县| 上杭县| 扎赉特旗| 潍坊市| 曲阜市| 龙泉市| 巴林右旗| 门源| 西城区| 贡嘎县| 潍坊市| 承德市| 镇安县| 雅安市| 新密市| 邳州市| 扶风县| 襄城县| 峨边| 汤阴县| 多伦县| 文昌市| 涿州市| 仙桃市| 宜兰县| 新邵县| 耿马| 德保县| 桃园市| 仙居县| 宜城市| 那曲县| 苍南县| 许昌县| 丹巴县|