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> * @创建日期: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); /** * @函数名称:encodeHex<br> * @创建日期:2016年9月22日<br> * @功能说明: 将字节数组转换为十六进制字节数组 <br> * @参数说明:data byte[] 字节数组<br> * @参数说明: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; } /** * @函数名称:encodeHexStr<br> * @创建日期:2016年9月22日<br> * @功能说明:将16进制字节数组转换为十六进制字符串 <br> * @参数说明:data byte[] 16进制字节数组 <br> * @参数说明:toDigits char[] 向量 <br> * @返回说明:String 返回16进制字符串 */ private static String encodeHexStr(byte[] data, char[] toDigits) { return new String(encodeHex(data, toDigits)); } /** * @函数名称:hexStringToString<br> * @创建日期:2016年9月21日<br> * @功能说明:将16进制字符串转换为10进制字符串 <br> * @参数说明: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; } /** * @函数名称:encrypt<br> * @创建日期:2016年9月22日<br> * @功能说明:加密字节数组 <br> * @参数说明:arrB byte[] 需要加密的字节数组 <br> * @参数说明:key String 秘钥 <br> * @返回说明:byte[] */ private static byte[] encrypt(byte[] arrB, String key) throws Exception { return converCrypt(arrB, key, true); } /** * @函数名称:encrypt<br> * @创建日期:2016年9月22日<br> * @功能说明:加密字符串 <br> * @参数说明:xml String 加密字符串 <br> * @参数说明: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 ""; } } /** * @函数名称:decrypt<br> * @创建日期:2016年9月22日<br> * @功能说明: 将16进制字节数组进行解密 <br> * @参数说明: arrB byte[] 解密字节数组<br> * @参数说明:key String 秘钥 <br> * @返回说明:byte[] 返回解密后 的16位字节数组 */ private static byte[] decrypt(byte[] arrB, String key) throws Exception { return converCrypt(arrB, key, false); } /** * @函数名称:converCrypt<br> * @创建日期:2016年9月22日<br> * @功能说明:将16位的字节数据进行加密或解密 <br> * @参数说明: arrB byte[] 需要加密的字节数组<br> * @参数说明: key String 秘钥<br> * @参数说明:encrypt boolean是否加密,true加密,false解密 <br> * @返回说明:byte[] 返回16进制字节数组 */ 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); } /** * @函数名称:decrypt<br> * @创建日期:2016年9月22日<br> * @功能说明:解密16进制字符串 <br> * @参数说明: desStr String 需要解密的16进制字符串<br> * @参数说明: 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 ""; } } /** * @函数名称:hexStringToByte<br> * @创建日期:2016年9月22日<br> * @功能说明:将16进制字符串转换为16进制字节数组 <br> * @参数说明:hex String需要转换的16进制字符串 <br> * @返回说明:byte[] 返回转换后的16进制字节数组 */ 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; } /** * @函数名称:toByte<br> * @创建日期:2016年9月22日<br> * @功能说明: 将字符转换为字节<br> * @参数说明: c char 需要转换的字符<br> * @返回说明:int 返回字符对应的字节码 */ private static int toByte(char c) { byte b = (byte) "0123456789ABCDEF".indexOf(c); return b; } /** * @构造函数 */ public DESUtil() { // TODO Auto-generated constructor stub } /** * @函数名称:main<br> * @创建日期:2016年9月21日<br> * @功能说明: <br> * @参数说明: <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"); // 创建一个md5算法对象 byte[] messageByte = message.getBytes("UTF-8"); byte[] md5Byte = md.digest(messageByte); // 获得MD5字节数组,16*8=128位 md5 = bytesToHex(md5Byte).substring(0, 16); // 转换为16进制字符串 } catch (Exception e) { e.printStackTrace(); } return md5; } // 二进制转十六进制 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 实现DES 加密解密的示例代码的详细内容,更多关于java des加密解密的资料请关注小牛知识库其它相关文章!
本文向大家介绍java中DES加密解密,包括了java中DES加密解密的使用技巧和注意事项,需要的朋友参考一下 废话不多说,直接奉上代码: 代码一 代码二 以上就是本文关于DES加密解密的代码了,希望对大家学习java有所帮助。
本文向大家介绍PHP实现的DES加密解密实例代码,包括了PHP实现的DES加密解密实例代码的使用技巧和注意事项,需要的朋友参考一下 本文实例讲述了PHP实现的DES加密解密实例。分享给大家供大家参考,具体如下: 更多关于PHP相关内容感兴趣的读者可查看本站专题:《php加密方法总结》、《PHP运算与运算符用法总结》、《PHP网络编程技巧总结》、《PHP基本语法入门教程》、《php操作office文
本文向大家介绍C#使用DES和AES实现加密解密功能示例,包括了C#使用DES和AES实现加密解密功能示例的使用技巧和注意事项,需要的朋友参考一下 本文实例讲述了C#使用DES和AES实现加密解密功能。分享给大家供大家参考,具体如下: PS:关于加密解密感兴趣的朋友还可以参考本站在线工具: 文字在线加密解密工具(包含AES、DES、RC4等): http://tools.jb51.net/pass
本文向大家介绍Python和Java进行DES加密和解密的实例,包括了Python和Java进行DES加密和解密的实例的使用技巧和注意事项,需要的朋友参考一下 DES 为 Data Encryption Standard (数据加密标准)的缩写,是一种常见的对称加密算法。有关对称加密与非对称加密的特点及其应用场景,本文就不描述了,读者可以自行 google 。本文说明如何使用 Java 和 Pyt
本文向大家介绍java基于Des对称加密算法实现的加密与解密功能详解,包括了java基于Des对称加密算法实现的加密与解密功能详解的使用技巧和注意事项,需要的朋友参考一下 本文实例讲述了java基于Des对称加密算法实现的加密与解密功能。分享给大家供大家参考,具体如下: Des 加密相关类介绍: SecureRandom 这个类是继承自java.util.Random 这个类 SecureRan
本文向大家介绍C++实现DES加密算法实例解析,包括了C++实现DES加密算法实例解析的使用技巧和注意事项,需要的朋友参考一下 本文所述实例是一个实现DES加密算法的程序代码,在C++中,DES加密是比较常用的加密算法了,且应用非常广泛。本CPP类文件可满足你的DES加密需要,代码中附带了丰富的注释,相信对于大家理解DES可以起到很大的帮助。 具体实现代码如下: 感兴趣的朋友可以测试运行一下本文实