java DES加密解密实现
来源:互联网 发布:淘宝网无线话筒 编辑:程序博客网 时间:2024/04/30 04:49
java DES加密解密实现:
步骤一:定义一个通用的十六进制工具类
package com.client;/** * This class provides convenient functions to convert hex string to byte array and vice versa. * */public class HexUtil { private HexUtil() { } /** * Converts a byte array to hex string. * * @param b - * the input byte array * @return hex string representation of b. */ public static String toHexString(byte[] b) { StringBuffer sb = new StringBuffer(); for (int i = 0; i < b.length; i++) { sb.append(HexUtil.HEX_CHARS.charAt(b[i] >>> 4 & 0x0F)); sb.append(HexUtil.HEX_CHARS.charAt(b[i] & 0x0F)); } return sb.toString(); } /** * Converts a hex string into a byte array. * * @param s - * string to be converted * @return byte array converted from s */ public static byte[] toByteArray(String s) { byte[] buf = new byte[s.length() / 2]; int j = 0; for (int i = 0; i < buf.length; i++) { buf[i] = (byte) ((Character.digit(s.charAt(j++), 16) << 4) | Character .digit(s.charAt(j++), 16)); } return buf; } private static final String HEX_CHARS = "0123456789abcdef";}
步骤二:des 加解密工具类实现
package com.client;import java.io.UnsupportedEncodingException;import java.security.InvalidKeyException;import java.security.NoSuchAlgorithmException;import java.security.SecureRandom;import javax.crypto.BadPaddingException;import javax.crypto.Cipher;import javax.crypto.IllegalBlockSizeException;import javax.crypto.KeyGenerator;import javax.crypto.NoSuchPaddingException;import javax.crypto.SecretKey;import javax.crypto.SecretKeyFactory;import javax.crypto.spec.DESKeySpec;import javax.crypto.spec.SecretKeySpec;/** * <p> * Title: <B>DES encryption and decryption using Java Crypto </B> * </p> * <p> * Description: * </p> * This class provides a decryption and encryption service based on DES (Data * Encryption Standard). It always generates a key on encryption. On decryption, * it uses the embedded key. As such, it is not really secure and only prevents * simple attacks. In addition, the channel on which it is being used is * supposed to be secure. */public final class DESUtil { private DESUtil() { } private static final String ALGORITHM_OPTIONS = "DES/ECB/PKCS5Padding"; private static final String ALGORITHM_KEY = "DES"; private static final String ALGORITHM_ENCODING = "UTF-8"; private static final String PASSWORD_CRYPT_KEY = "__PAY__DES__KINGO__"; /** * Encrypts the provided clear text and returns encoded data as a string of * hex char representations. * * @param clearText * Clear text to be encrypted * @return String with the encrypted data of hex char. */ public static String encrypt(String clearText,String key) { String keyValue = null; try { // DES算法要求有一个可信任的随机数源 SecureRandom sr = new SecureRandom(); // 从原始密匙数据创建DESKeySpec对象 DESKeySpec dks = new DESKeySpec(key.getBytes()); // 创建一个密匙工厂,然后用它把DESKeySpec转换成 // 一个SecretKey对象 SecretKeyFactory keyFactory = SecretKeyFactory .getInstance(ALGORITHM_KEY); SecretKey securekey = keyFactory.generateSecret(dks); // Cipher对象实际完成加密操作 Cipher cipher = Cipher.getInstance(ALGORITHM_KEY); // 用密匙初始化Cipher对象 cipher.init(Cipher.ENCRYPT_MODE, securekey, sr); // 现在,获取数据并加密 // 正式执行加密操作 keyValue = HexUtil .toHexString(cipher.doFinal(clearText.getBytes())); } catch (Exception e) { keyValue = null; e.printStackTrace(); } if (keyValue == null) { keyValue = "NOKEY " + clearText; } return keyValue; } /** * 解密 */ public static String encrypt(String clearText) { return encrypt(clearText,PASSWORD_CRYPT_KEY); } /** * 加密 */ public static String decrypt(String encryptedText){ return decrypt(encryptedText,PASSWORD_CRYPT_KEY); } public static String decrypt(String encryptedText,String key){ String clearText = null; try{ // DES算法要求有一个可信任的随机数源 SecureRandom sr = new SecureRandom(); // 从原始密匙数据创建一个DESKeySpec对象 DESKeySpec dks = new DESKeySpec(key.getBytes()); // 创建一个密匙工厂,然后用它把DESKeySpec对象转换成 // 一个SecretKey对象 SecretKeyFactory keyFactory = SecretKeyFactory.getInstance(ALGORITHM_KEY); SecretKey securekey = keyFactory.generateSecret(dks); // Cipher对象实际完成解密操作 Cipher cipher = Cipher.getInstance(ALGORITHM_KEY); // 用密匙初始化Cipher对象 cipher.init(Cipher.DECRYPT_MODE, securekey, sr); // 现在,获取数据并解密 // 正式执行解密操作 byte[] dataPart = HexUtil.toByteArray(encryptedText); byte[] decryptedData = cipher.doFinal(dataPart); clearText = new String(decryptedData, ALGORITHM_ENCODING); }catch(Exception e){ clearText = null; } return clearText; } public static String encryptRandom(String clearText) { String keyValue = null; try { // generate a secret key KeyGenerator kg = KeyGenerator.getInstance(ALGORITHM_KEY); kg.init(56); SecretKey key = kg.generateKey(); // get the encoded value for the string and convert to hex byte[] encodedKey = key.getEncoded(); keyValue = HexUtil.toHexString(encodedKey); keyValue += " "; // run the encryption algorithm Cipher cipher = Cipher.getInstance(ALGORITHM_OPTIONS); cipher.init(Cipher.ENCRYPT_MODE, key); keyValue += HexUtil.toHexString(cipher.doFinal(clearText .getBytes(ALGORITHM_ENCODING))); /* * None of below exceptions should happen in runtime because we do * both the encoding and the decoding and we assert a very common * encrypt algorthm (DES). That is why we ignore them. Later on, we * can add log4j to log these unexpected exceptions. */ } catch (IllegalStateException e) { keyValue = null; } catch (IllegalBlockSizeException e) { keyValue = null; } catch (BadPaddingException e) { keyValue = null; } catch (NoSuchAlgorithmException e) { keyValue = null; } catch (NoSuchPaddingException e) { keyValue = null; } catch (InvalidKeyException e) { keyValue = null; } catch (UnsupportedEncodingException e) { keyValue = null; } if (keyValue == null) { keyValue = "NOKEY " + clearText; } return keyValue; } /** * Decrypts the string, which is supposed to have been encrypted with above * encrypt function. * * @param encryptedText * encrypted text to be decrypted * @return String with the decrypted data. */ public static String decryptRandom(String encryptedText) { String clearText = null; // split the hex into key and data parts. int spaceLoc = encryptedText.indexOf(' '); String encryptKey = encryptedText.substring(0, spaceLoc); String encryptData = encryptedText.substring(spaceLoc + 1); // special case of no encryption if (encryptKey.equals("NOKEY")) { return encryptData; } // convert hex data to byte array byte[] keyPart = HexUtil.toByteArray(encryptKey); byte[] dataPart = HexUtil.toByteArray(encryptData); // reconstruct the secret key SecretKeySpec sks = new SecretKeySpec(keyPart, ALGORITHM_KEY); try { // decrypt using the recovered key spec Cipher cipher = Cipher.getInstance(ALGORITHM_OPTIONS); cipher.init(Cipher.DECRYPT_MODE, sks); byte[] decryptedData = cipher.doFinal(dataPart); clearText = new String(decryptedData, ALGORITHM_ENCODING); } catch (NoSuchAlgorithmException e) { clearText = null; } catch (NoSuchPaddingException e) { clearText = null; } catch (InvalidKeyException e) { clearText = null; } catch (IllegalStateException e) { clearText = null; } catch (IllegalBlockSizeException e) { clearText = null; } catch (BadPaddingException e) { clearText = null; } catch (UnsupportedEncodingException e) { clearText = null; } return clearText; } public static void main(String[] args){ System.out.println("DES加密:" + encrypt("2222222")); System.out.println("DES解密:" + decrypt("df4cd223373955dd")); }}
步骤三:运行des加解密工具类中main方法,对比检测程序结果,如下
DES加密:df4cd223373955dd
DES解密:2222222
0 0
- Java 实现DES加密解密
- DES加密解密->java实现
- java DES加密解密实现
- Java实现DES加密解密
- 用java实现des加密和解密
- JAVA实现DES加密和解密软件
- DES加密解密算法JAVA实现
- java实现DES数据加密与解密
- DES加密与解密的java实现
- java DES加密,解密算法实现
- Java通过DES实现加密和解密
- JAVA实现DES加密和解密
- java实现DES加密和解密
- Java实现DES加密解密代码
- Java实现简单的DES加密解密
- java实现DES数据加密与解密
- java实现DES数据加密与解密
- DES加密解密算法Java实现
- 记录
- 日常杂记
- Ubuntu16.04下Qt交叉编译开发环境搭建
- 定位 position
- MySql5.7配置主从复制
- java DES加密解密实现
- 二两橙子的前端之路- -创建GitHub远程仓库
- java环境搭建基础知识
- Linked List Cycle II
- poj 2406 Power Strings(KMP)
- C++ 引用计数技术及智能指针的简单实现
- 练习2-8 编写一个函数rightrot(x, n),该函数返回将x循环右移(即从最右端移出的位将从最左端再移入)n(二进制)位后所得到的值。
- 电脑快捷键
- NYOJ 12 喷水装置(二)【贪心+区间覆盖】