AES、DES 加密、解密ITeye - 牛牛娱乐

AES、DES 加密、解密ITeye

2019-01-12 00:58:12 | 作者: 幻丝 | 标签: 加密,解密,数组 | 浏览: 1432

private static final String TRIPLE_DES_CBC_PKCS5PADDING = "TripleDES/CBC/PKCS5Padding"; private static final String UTF_8 = "utf-8"; private static final String DES_CBC_PKCS5PADDING = "DES/CBC/PKCS5Padding"; private static final String DES = "DES"; // 密钥是16位长度的byte[]进行Base64转化后得到的字符串 static String SECRET_PWD = ""; static { // 获取密钥 try { String str = "1234567890abcdef"; byte[] b = str.getBytes(UTF_8); SECRET_PWD = new String(new Base64().encode(b)); System.out.println("加密后的密钥:" + SECRET_PWD); } catch (UnsupportedEncodingException e) { e.printStackTrace(); * b 加密办法 /b li 办法称号:encrypt /li * @param str * 需求加密的音讯字符串 * @return 加密后的字符串 public static String encrypt(String str) { try { // 取需求加密内容的utf-8编码。 byte[] encrypt = str.getBytes(UTF_8); // 取MD5Hash码,并组合加密数组 byte[] md5Hasn = EncryptUtil_DES.MD5Hash(encrypt, 0, encrypt.length); // 组合音讯体 byte[] totalByte = EncryptUtil_DES.addMD5(md5Hasn, encrypt); // 取密钥和偏转向量 byte[] key = new byte[8]; byte[] iv = new byte[8]; getKeyIV(EncryptUtil_DES.SECRET_PWD, key, iv); SecretKeySpec deskey = new SecretKeySpec(key, DES); IvParameterSpec ivParam = new IvParameterSpec(iv); // 运用DES算法运用加密音讯体 byte[] temp = EncryptUtil_DES.DES_CBC_Encrypt(totalByte, deskey, ivParam); // 运用Base64加密后回来 return new String(new Base64().encode(temp)); } catch (UnsupportedEncodingException e) { e.printStackTrace(); return null; } catch (NoSuchAlgorithmException e) { e.printStackTrace(); return null; } catch (InvalidKeyException e) { e.printStackTrace(); return null; } catch (NoSuchPaddingException e) { e.printStackTrace(); return null; } catch (InvalidAlgorithmParameterException e) { e.printStackTrace(); return null; } catch (IllegalBlockSizeException e) { e.printStackTrace(); return null; } catch (BadPaddingException e) { e.printStackTrace(); return null; * b 解密办法 /b li 办法称号:encrypt /li * @param str * 需求解密的音讯字符串 * @return 解密后的字符串 * @throws Exception public static String decrypt(String str) { try { // base64解码 Base64 decoder = new Base64(); byte[] encBuf = decoder.decode(str.getBytes()); // 取密钥和偏转向量 byte[] key = new byte[8]; byte[] iv = new byte[8]; getKeyIV(EncryptUtil_DES.SECRET_PWD, key, iv); SecretKeySpec deskey = new SecretKeySpec(key, DES); IvParameterSpec ivParam = new IvParameterSpec(iv); // 运用DES算法解密 byte[] temp = EncryptUtil_DES.DES_CBC_Decrypt(encBuf, deskey, ivParam); // 进行解密后的md5Hash校验 byte[] md5Hash = EncryptUtil_DES.MD5Hash(temp, 16, temp.length - 16); // 进行解密校检 for (int i = 0; i md5Hash.length; i++) { if (md5Hash[i] != temp[i]) { System.out.println(md5Hash[i] + "MD5校验过错。" + temp[i]); //throw new Exception("MD5校验过错。"); return null; // 回来解密后的数组,其间前16位MD5Hash码要除掉。 return new String(temp, 16, temp.length - 16, UTF_8); } catch (InvalidKeyException e) { e.printStackTrace(); return null; } catch (NoSuchAlgorithmException e) { e.printStackTrace(); return null; } catch (NoSuchPaddingException e) { e.printStackTrace(); return null; } catch (InvalidAlgorithmParameterException e) { e.printStackTrace(); return null; } catch (IllegalBlockSizeException e) { e.printStackTrace(); return null; } catch (BadPaddingException e) { e.printStackTrace(); return null; } catch (UnsupportedEncodingException e) { e.printStackTrace(); return null; * li 办法称号:DES_CBC_Encrypt /li * li 功用描绘: * pre 经过封装的DES/CBC加密算法,假如包括中文,请注意编码。 /pre * /li * @param sourceBuf * 需求加密内容的字节数组。 * @param deskey * KEY 由8位字节数组经过SecretKeySpec类转化而成。 * @param ivParam * IV偏转向量,由8位字节数组经过IvParameterSpec类转化而成。 * @return 加密后的字节数组 * @throws NoSuchPaddingException * @throws NoSuchAlgorithmException * @throws InvalidAlgorithmParameterException * @throws InvalidKeyException * @throws BadPaddingException * @throws IllegalBlockSizeException * @throws Exception public static byte[] DES_CBC_Encrypt(byte[] sourceBuf, SecretKeySpec deskey, IvParameterSpec ivParam) throws NoSuchAlgorithmException, NoSuchPaddingException, InvalidKeyException, InvalidAlgorithmParameterException, IllegalBlockSizeException, BadPaddingException { byte[] cipherByte; // 运用DES对称加密算法的CBC形式加密 Cipher encrypt = Cipher.getInstance(DES_CBC_PKCS5PADDING); encrypt.init(Cipher.ENCRYPT_MODE, deskey, ivParam); cipherByte = encrypt.doFinal(sourceBuf, 0, sourceBuf.length); // 回来加密后的字节数组 return cipherByte; * li 办法称号:DES_CBC_Decrypt /li * li 功用描绘: * pre 经过封装的DES/CBC解密算法。 /pre * /li * @param sourceBuf * 需求解密内容的字节数组 * @param deskey * KEY 由8位字节数组经过SecretKeySpec类转化而成。 * @param ivParam * IV偏转向量,由6位字节数组经过IvParameterSpec类转化而成。 * @return 解密后的字节数组 * @throws Exception public static byte[] DES_CBC_Decrypt(byte[] sourceBuf, SecretKeySpec deskey, IvParameterSpec ivParam) throws NoSuchAlgorithmException, NoSuchPaddingException, InvalidKeyException, InvalidAlgorithmParameterException, IllegalBlockSizeException, BadPaddingException { byte[] cipherByte; // 取得Cipher实例,运用CBC形式。 Cipher decrypt = Cipher.getInstance(DES_CBC_PKCS5PADDING); // 初始化加密实例,界说为解密功用,并传入密钥,偏转向量 decrypt.init(Cipher.DECRYPT_MODE, deskey, ivParam); cipherByte = decrypt.doFinal(sourceBuf, 0, sourceBuf.length); // 回来解密后的字节数组 return cipherByte; * li 办法称号:MD5Hash /li * li 功用描绘: * pre MD5,进行了简略的封装,以适用于加,解密字符串的校验。 /pre * /li * @param buf * 需求MD5加密字节数组。 * @param offset * 加密数据开始方位。 * @param length * 需求加密的数组长度。 * @return * @throws NoSuchAlgorithmException * @throws Exception public static byte[] MD5Hash(byte[] buf, int offset, int length) throws NoSuchAlgorithmException { MessageDigest md = MessageDigest.getInstance("MD5"); md.update(buf, offset, length); return md.digest(); * li 办法称号:byte2hex /li * li 功用描绘: * pre 字节数组转化为二行制表明 /pre * /li * @param inStr * 需求转化字节数组。 * @return 字节数组的二进制表明。 public static String byte2hex(byte[] inStr) { String stmp; StringBuffer out = new StringBuffer(inStr.length * 2); for (int n = 0; n inStr.length; n++) { // 字节做"与"运算,去除高方位字节 11111111 stmp = Integer.toHexString(inStr[n] 0xFF); if (stmp.length() == 1) { // 假如是0至F的单位字符串,则增加0 out.append("0" + stmp); } else { out.append(stmp); return out.toString(); * li 办法称号:addMD5 /li * li 功用描绘: * pre MD校验码 组合办法,前16位放MD5Hash码。 把MD5验证码byte[],加密内容byte[]组合的办法。 /pre * /li * @param md5Byte * 加密内容的MD5Hash字节数组。 * @param bodyByte * 加密内容字节数组 * @return 组合后的字节数组,比加密内容长16个字节。 public static byte[] addMD5(byte[] md5Byte, byte[] bodyByte) { int length = bodyByte.length + md5Byte.length; byte[] resutlByte = new byte[length]; // 前16位放MD5Hash码 for (int i = 0; i length; i++) { if (i md5Byte.length) { resutlByte[i] = md5Byte[i]; } else { resutlByte[i] = bodyByte[i - md5Byte.length]; return resutlByte; * li 办法称号:getKeyIV /li * li 功用描绘: * pre /pre * /li * @param encryptKey * @param key * @param iv public static void getKeyIV(String encryptKey, byte[] key, byte[] iv) { // 密钥Base64解密 Base64 decoder = new Base64(); byte[] buf = decoder.decode(encryptKey.getBytes()); // 前8位为key int i; for (i = 0; i key.length; i++) { key[i] = buf[i]; // 后8位为iv向量 for (i = 0; i iv.length; i++) { iv[i] = buf[i + 8];

 

 

 

 

 

版权声明
本文来源于网络,版权归原作者所有,其内容与观点不代表牛牛娱乐立场。转载文章仅为传播更有价值的信息,如采编人员采编有误或者版权原因,请与我们联系,我们核实后立即修改或删除。

猜您喜欢的文章

阅读排行

  • 1
  • 2

    第02章 根底中心ITeye

    目标,根底,中心
  • 3
  • 4
  • 5

    Java中字符串的使用ITeye

    字符串,字符,比较
  • 6
  • 7

    UTLITeye

    数据,目录,文件
  • 8
  • 9
  • 10

    java与函数式编程ITeye

    函数,编程,一些