1、import java.security.Key;import java.security.Security;import java.util.Scanner;import javax.crypto.Cipher;public class Des /* 字符串默认键值 */private static String strDefaultKey = “national“;/* 加密工具 */private Cipher encryptCipher = null;/* 解密工具 */private Cipher decryptCipher = null;/* * 将 byte 数组转换为表示 16
2、 进制值的字符串, 如:byte8,18 转换为:0813, 和 public static byte * hexStr2ByteArr(String strIn) 互为可逆的转换过程 * * param arrB * 需要转换的 byte 数组 * return 转换后的字符串 * throws Exception * 本方法不处理任何异常,所有异常全部抛出 */public static String byteArr2HexStr(byte arrB) throws Exception int iLen = arrB.length;/ 每个 byte 用两个字符才能表示,所以字符串的长度是
3、数组长度的两倍 StringBuffer sb = new StringBuffer(iLen * 2);for (int i = 0; i LiGuoQing */public static byte hexStr2ByteArr(String strIn) throws Exception byte arrB = strIn.getBytes();int iLen = arrB.length;/ 两个字符表示一个字节,所以字节数组长度是字符串长度除以 2 byte arrOut = new byteiLen / 2;for (int i = 0; i iLen; i = i + 2) St
4、ring strTmp = new String(arrB, i, 2);arrOuti / 2 = (byte) Integer.parseInt(strTmp, 16);return arrOut;/* * 默认构造方法,使用默认密钥 * * throws Exception */public DesUtils() throws Exception this(strDefaultKey);/* * 指定密钥构造方法 * * param strKey * 指定的密钥 * throws Exception */public DesUtils(String strKey) throws Exce
5、ption /Security.addProvider(new com.sun.crypto.provider.SunJCE();Key key = getKey(strKey.getBytes();encryptCipher = Cipher.getInstance(“DES“);encryptCipher.init(Cipher.ENCRYPT_MODE, key);decryptCipher = Cipher.getInstance(“DES“);decryptCipher.init(Cipher.DECRYPT_MODE, key);/* * 加密字节数组 * * param arrB
6、 * 需加密的字节数组 * return 加密后的字节数组 * throws Exception */public byte encrypt(byte arrB) throws Exception return encryptCipher.doFinal(arrB);/* * 加密字符串 * * param strIn * 需加密的字符串 * return 加密后的字符串 * throws Exception */public String encrypt(String strIn) throws Exception return byteArr2HexStr(encrypt(strIn.ge
7、tBytes();/* * 解密字节数组 * * param arrB * 需解密的字节数组 * return 解密后的字节数组 * throws Exception */public byte decrypt(byte arrB) throws Exception return decryptCipher.doFinal(arrB);/* * 解密字符串 * * param strIn * 需解密的字符串 * return 解密后的字符串 * throws Exception */public String decrypt(String strIn) throws Exception ret
8、urn new String(decrypt(hexStr2ByteArr(strIn);/* * 从指定字符串生成密钥,密钥所需的字节数组长度为 8 位 不足 8 位时后面补0,超出 8 位只取前 8 位 * * param arrBTmp * 构成该字符串的字节数组 * return 生成的密钥 * throws java.lang.Exception */private Key getKey(byte arrBTmp) throws Exception / 创建一个空的 8 位字节数组(默认值为 0) byte arrB = new byte8;/ 将原始字节数组转换为 8 位 for
9、(int i = 0; i arrBTmp.length i+) arrBi = arrBTmpi;/ 生成密钥 Key key = new javax.crypto.spec.SecretKeySpec(arrB, “DES“);return key;public static void main(String args) System.out.println(“请输入加密前的字符:“);Scanner reader=new Scanner(System.in);while(reader.hasNext()try String test=reader.nextLine();DesUtils des = new DesUtils(“leemenz“);/自定义密钥 System.out.println(“加密后的字符:“ + des.encrypt(test);System.out.println(“解密后的字符:“ + des.decrypt(des.encrypt(test);catch (Exception e) e.printStackTrace(); System.out.println(“请输入加密前的字符:“);