DES、AES加密解密的方法

来源:互联网 发布:java游戏开发 编辑:程序博客网 时间:2024/06/02 14:59

最近碰到的问题找到的两种方法


DES

private static String strDefaultKey = "defineyourself";    /** 加密工具 */    private Cipher encryptCipher = null;    /** 解密工具 */    private Cipher decryptCipher = null;    /**     * 将byte数组转换为表示16进制值的字符串, 如:byte[]{8,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用两个字符才能表示,所以字符串的长度是数组长度的两倍        StringBuffer sb = new StringBuffer(iLen * 2);        for (int i = 0; i < iLen; i++) {            int intTmp = arrB[i];            // 把负数转换为正数            while (intTmp < 0) {                intTmp = intTmp + 256;            }            // 小于0F的数需要在前面补0            if (intTmp < 16) {                sb.append("0");            }            sb.append(Integer.toString(intTmp, 16));        }        return sb.toString();    }    /**     * 将表示16进制值的字符串转换为byte数组, 和public static String byteArr2HexStr(byte[] arrB)     * 互为可逆的转换过程     *     * @param strIn 需要转换的字符串     * @return 转换后的byte数组     * @throws Exception     *     */    public static byte[] hexStr2ByteArr(String strIn) throws Exception {        byte[] arrB = strIn.getBytes();        int iLen = arrB.length;        // 两个字符表示一个字节,所以字节数组长度是字符串长度除以2        byte[] arrOut = new byte[iLen / 2];        for (int i = 0; i < iLen; i = i + 2) {            String strTmp = new String(arrB, i, 2);            arrOut[i / 2] = (byte) Integer.parseInt(strTmp, 16);        }        return arrOut;    }    /**     * 默认构造方法,使用默认密钥     *     * @throws Exception     */    public EncryptionDecryption() throws Exception {        this(strDefaultKey);    }    /**     * 指定密钥构造方法     *     * @param strKey     *            指定的密钥     * @throws Exception     */    public EncryptionDecryption(String strKey) throws Exception {        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     *            需加密的字节数组     * @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.getBytes()));    }    /**     * 解密字节数组     *     * @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 {        try {            return new String(decrypt(hexStr2ByteArr(strIn)));        } catch (Exception e) {            return "";        }    }    /**     * 从指定字符串生成密钥,密钥所需的字节数组长度为8位 不足8位时后面补0,超出8位只取前8位     *     * @param arrBTmp     *            构成该字符串的字节数组     * @return 生成的密钥     * @throws java.lang.Exception     */    private Key getKey(byte[] arrBTmp) throws Exception {        // 创建一个空的8位字节数组(默认值为0)        byte[] arrB = new byte[8];        // 将原始字节数组转换为8位        for (int i = 0; i < arrBTmp.length && i < arrB.length; i++) {            arrB[i] = arrBTmp[i];        }        // 生成密钥        Key key = new javax.crypto.spec.SecretKeySpec(arrB, "DES");        return key;    }
AES

private final static String encoding = "UTF-8"; /** * AES加密 *  * @param content * @param password * @return */public static String encryptAES(String content, String password) {byte[] encryptResult = encrypt(content, password);String encryptResultStr = parseByte2HexStr(encryptResult);// BASE64位加密encryptResultStr = ebotongEncrypto(encryptResultStr);return encryptResultStr;}/** * AES解密 *  * @param encryptResultStr * @param password * @return */public static String decrypt(String encryptResultStr, String password) {// BASE64位解密String decrpt = ebotongDecrypto(encryptResultStr);byte[] decryptFrom = parseHexStr2Byte(decrpt);byte[] decryptResult = decrypt(decryptFrom, password);return new String(decryptResult);}/** * 加密字符串 */public static String ebotongEncrypto(String str) {BASE64Encoder base64encoder = new BASE64Encoder();String result = str;if (str != null && str.length() > 0) {try {byte[] encodeByte = str.getBytes(encoding);result = base64encoder.encode(encodeByte);} catch (Exception e) {e.printStackTrace();}}//base64加密超过一定长度会自动换行 需要去除换行符return result.replaceAll("\r\n", "").replaceAll("\r", "").replaceAll("\n", "");}/** * 解密字符串 */public static String ebotongDecrypto(String str) {BASE64Decoder base64decoder = new BASE64Decoder();try {byte[] encodeByte = base64decoder.decodeBuffer(str);return new String(encodeByte);} catch (IOException e) {e.printStackTrace();return str;}}/**   * 加密   *    * @param content 需要加密的内容   * @param password  加密密码   * @return   */  private static byte[] encrypt(String content, String password) {           try {                              KeyGenerator kgen = KeyGenerator.getInstance("AES");                 //防止linux下 随机生成key                SecureRandom secureRandom = SecureRandom.getInstance("SHA1PRNG" );                   secureRandom.setSeed(password.getBytes());                   kgen.init(128, secureRandom);                //kgen.init(128, new SecureRandom(password.getBytes()));                   SecretKey secretKey = kgen.generateKey();                   byte[] enCodeFormat = secretKey.getEncoded();                   SecretKeySpec key = new SecretKeySpec(enCodeFormat, "AES");                   Cipher cipher = Cipher.getInstance("AES");// 创建密码器                   byte[] byteContent = content.getBytes("utf-8");                   cipher.init(Cipher.ENCRYPT_MODE, key);// 初始化                   byte[] result = cipher.doFinal(byteContent);                   return result; // 加密           } catch (NoSuchAlgorithmException e) {                   e.printStackTrace();           } catch (NoSuchPaddingException e) {                   e.printStackTrace();           } catch (InvalidKeyException e) {                   e.printStackTrace();           } catch (UnsupportedEncodingException e) {                   e.printStackTrace();           } catch (IllegalBlockSizeException e) {                   e.printStackTrace();           } catch (BadPaddingException e) {                   e.printStackTrace();           }           return null;   }  /**解密   * @param content  待解密内容   * @param password 解密密钥   * @return   */  private static byte[] decrypt(byte[] content, String password) {           try {                    KeyGenerator kgen = KeyGenerator.getInstance("AES");                //防止linux下 随机生成key             SecureRandom secureRandom = SecureRandom.getInstance("SHA1PRNG" );                secureRandom.setSeed(password.getBytes());                kgen.init(128, secureRandom);                 //kgen.init(128, new SecureRandom(password.getBytes()));                    SecretKey secretKey = kgen.generateKey();                    byte[] enCodeFormat = secretKey.getEncoded();                    SecretKeySpec key = new SecretKeySpec(enCodeFormat, "AES");                                Cipher cipher = Cipher.getInstance("AES");// 创建密码器                   cipher.init(Cipher.DECRYPT_MODE, key);// 初始化                   byte[] result = cipher.doFinal(content);                   return result; // 加密           } catch (NoSuchAlgorithmException e) {                   e.printStackTrace();           } catch (NoSuchPaddingException e) {                   e.printStackTrace();           } catch (InvalidKeyException e) {                   e.printStackTrace();           } catch (IllegalBlockSizeException e) {                   e.printStackTrace();           } catch (BadPaddingException e) {                   e.printStackTrace();           }           return null;   }  /**将二进制转换成16进制   * @param buf   * @return   */  public static String parseByte2HexStr(byte buf[]) {           StringBuffer sb = new StringBuffer();           for (int i = 0; i < buf.length; i++) {                   String hex = Integer.toHexString(buf[i] & 0xFF);                   if (hex.length() == 1) {                           hex = '0' + hex;                   }                   sb.append(hex.toUpperCase());           }           return sb.toString();   }  /**将16进制转换为二进制   * @param hexStr   * @return   */  public static byte[] parseHexStr2Byte(String hexStr) {           if (hexStr.length() < 1)                   return null;           byte[] result = new byte[hexStr.length()/2];           for (int i = 0;i< hexStr.length()/2; i++) {                   int high = Integer.parseInt(hexStr.substring(i*2, i*2+1), 16);                   int low = Integer.parseInt(hexStr.substring(i*2+1, i*2+2), 16);                   result[i] = (byte) (high * 16 + low);           }           return result;   }