AES,SHA,SHA1,MD5加密及解密技術
阿新 • • 發佈:2019-02-14
package com.gant.encrypt; import java.io.UnsupportedEncodingException; import java.security.InvalidKeyException; import java.security.MessageDigest; 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.spec.SecretKeySpec; /** * @ClassName Encrypt * @Description 加密技術 * @author chao * @date 2017年12月11日 * @version 1.0 */ public class Encrypt { public static void main(String[] args) { encryptSHA1("彭超"); encryptMD5("彭超"); getMD5("彭"); } /** * @Description AES加密方式 * @param str * 待加密的字串 * @param secretKeyBase * 用於生成祕鑰的基礎字串 * @return byte[] 加密位元組陣列 */ public static byte[] encryptAES(String str, String secretKeyBase) { try { KeyGenerator keyGenerator; keyGenerator = KeyGenerator.getInstance("AES"); keyGenerator.init(128, new SecureRandom(secretKeyBase.getBytes())); SecretKey secretKey = keyGenerator.generateKey(); byte[] enCodeFormat = secretKey.getEncoded(); SecretKeySpec sks = new SecretKeySpec(enCodeFormat, "AES"); Cipher cipher = Cipher.getInstance("AES"); // 建立密碼器 byte[] byteContent = str.getBytes("UTF-8"); cipher.init(Cipher.ENCRYPT_MODE, sks); // 初始化 byte[] result = cipher.doFinal(byteContent); System.out.println("加密後的結果是:" + result); return result; } catch (IllegalBlockSizeException | BadPaddingException e) { e.printStackTrace(); } catch (InvalidKeyException e) { e.printStackTrace(); } catch (NoSuchPaddingException e) { e.printStackTrace(); } catch (NoSuchAlgorithmException e) { e.printStackTrace(); } catch (UnsupportedEncodingException e) { e.printStackTrace(); } return null; } /** * @Description AES解密 * @param bytes * 待解密的位元組陣列 * @param secretKeyBase * 用於生成金鑰的基礎字串, 需要注意的是AES是對稱加密,所以secretKeyBase在加密解密時要一樣的 * @return 解密後的字串 */ public static String decryptAES(byte[] bytes, String secretKeyBase) { try { KeyGenerator keGenerator = KeyGenerator.getInstance("AES"); keGenerator.init(128, new SecureRandom(secretKeyBase.getBytes())); SecretKey secretKey = keGenerator.generateKey(); byte[] enCodeFormat = secretKey.getEncoded(); SecretKeySpec sks = new SecretKeySpec(enCodeFormat, "AES"); Cipher cipher = Cipher.getInstance("AES"); // 建立密碼器 cipher.init(Cipher.DECRYPT_MODE, sks); // 初始化 String result = new String(cipher.doFinal(bytes), "UTF-8"); System.out.println("解密後的結果為:" + result.toUpperCase()); return result.toUpperCase(); } catch (UnsupportedEncodingException | IllegalBlockSizeException | BadPaddingException e) { e.printStackTrace(); } catch (InvalidKeyException e) { e.printStackTrace(); } catch (NoSuchPaddingException e) { e.printStackTrace(); } catch (NoSuchAlgorithmException e) { e.printStackTrace(); } return null; } /** * @Description SHA,SHA1加密(不可逆,不能解密) * @param str * 待加密的字串 * @return String 加密後的字串 */ public static String encryptSHA1(String str) { try { MessageDigest messageDigest = MessageDigest.getInstance("SHA-1"); // 如果是SHA加密只需將"SHA-1"改成"SHA" messageDigest.update(str.getBytes()); byte messageDigestArray[] = messageDigest.digest(); StringBuffer hexStr = new StringBuffer(); // 以下是將位元組陣列轉換為16進位制陣列 for (int i = 0; i < messageDigestArray.length; i++) { String shaHex = Integer.toHexString(messageDigestArray[i] & 0xFF); // & 0xFF解釋 // :計算機儲存資料機制:正數儲存的二進位制原碼,負數儲存的是二進位制的補碼 if (shaHex.length() < 2) { hexStr.append(0); } hexStr.append(shaHex); } System.out.println("SHA1加密後的結果是:" + hexStr.toString().toUpperCase()); return hexStr.toString().toUpperCase(); } catch (NoSuchAlgorithmException e) { e.printStackTrace(); } return str; } /** * @Description MD5加密(不可逆,不能解密) * @param str * 待加密字串 * @return String 加密後的字串 */ public static String encryptMD5(String str) { try { // 獲取MD5摘要演算法的 MessageDigest物件 MessageDigest messageDigest = MessageDigest.getInstance("MD5"); // 使用指定的位元組更新摘要 messageDigest.update(str.getBytes("UTF-8")); // 獲取密文 byte md[] = messageDigest.digest(); // 把密文轉換為16進位制的字串 StringBuffer hexString = new StringBuffer(); // 位元組陣列轉換為16進位制數 for (int i = 0; i < md.length; i++) { String mdHex = Integer.toHexString(md[i] & 0xFF); if (mdHex.length() < 2) { hexString.append(0); } hexString.append(mdHex); } System.out.println("MD5加密後的結果是:" + hexString.toString().toUpperCase()); return hexString.toString().toUpperCase(); } catch (UnsupportedEncodingException e) { e.printStackTrace(); } catch (NoSuchAlgorithmException e) { e.printStackTrace(); } return null; } }