1. 程式人生 > >AES,SHA,SHA1,MD5加密及解密技術

AES,SHA,SHA1,MD5加密及解密技術

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;
	}
}