AES在Android、JAVA端正常加密解密

public class AESUtil {
	static final public byte[] KEY_VI = { 1, 2, 3, 4, 5, 6, 7, 8, 1, 2, 3, 4, 5, 6, 7, 8};
	public static final String bm = "UTF-8";  
	public static String encrypt(String dataPassword, String cleartext)
			throws Exception {
		IvParameterSpec zeroIv = new IvParameterSpec(KEY_VI);
		SecretKeySpec key = new SecretKeySpec(dataPassword.getBytes(), "AES");
		Cipher cipher = Cipher.getInstance("AES/CBC/PKCS5Padding");
		cipher.init(Cipher.ENCRYPT_MODE, key, zeroIv);
		byte[] encryptedData = cipher.doFinal(cleartext.getBytes(bm));
		return new String (parseByte2HexStr(encryptedData));
	}

	public static String decrypt(String dataPassword, String encrypted)
			throws Exception {
		byte[] byteMi = parseHexStr2Byte(encrypted);
		IvParameterSpec zeroIv = new IvParameterSpec(KEY_VI);
		SecretKeySpec key = new SecretKeySpec(dataPassword.getBytes(), "AES");
		Cipher cipher = Cipher.getInstance("AES/CBC/PKCS5Padding");
		cipher.init(Cipher.DECRYPT_MODE, key, zeroIv);
		byte[] decryptedData = cipher.doFinal(byteMi);

		return new String(decryptedData,bm);
	}
	/**
	 * 將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;
	}

	/**
	 * 將二進制轉換成16進制
	 * 
	 * @param buf
	 * @return
	 */
	public static String parseByte2HexStr(byte buf[]) {
		StringBuilder sb = new StringBuilder();
		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();
	}
}

使用上面的方法android和Java端都可以可以正常加密解密。但是密鑰必須是16,24或者32位。因爲:


AES supports 128, 192 and 256 bit keys, so the number of bytes needs to be 16, 24, or 32. Note that the latter two may not be available in all circumstances (as the comment in the "kgen.init(128)" line mentions).

當密鑰不是16,24,32位的時候就需要我們來做處理了

public class AESUtil {
	static final public byte[] KEY_VI = { 1, 2, 3, 4, 5, 6, 7, 8, 1, 2, 3, 4, 5, 6, 7, 8 };
	public static final String bm = "UTF-8";

	public static String encrypt(String dataPassword, String cleartext) throws Exception {
		// 對密鑰進行處理-S
		KeyGenerator kgen = KeyGenerator.getInstance("AES");
		SecureRandom secureRandom;
		// for Android
		secureRandom = SecureRandom.getInstance("SHA1PRNG", "Crypto");
		// for Java
		// secureRandom = SecureRandom.getInstance("SHA1PRNG");
		secureRandom.setSeed(dataPassword.getBytes("UTF-8"));
		kgen.init(128, secureRandom);
		SecretKey secretKey = kgen.generateKey();
		byte[] enCodeFormat = secretKey.getEncoded();
		// 對密鑰進行處理-E
		IvParameterSpec zeroIv = new IvParameterSpec(KEY_VI);
		SecretKeySpec key = new SecretKeySpec(enCodeFormat, "AES");
		Cipher cipher = Cipher.getInstance("AES/CBC/PKCS5Padding");
		cipher.init(Cipher.ENCRYPT_MODE, key, zeroIv);
		byte[] encryptedData = cipher.doFinal(cleartext.getBytes(bm));
		return new String(parseByte2HexStr(encryptedData));
	}

	public static String decrypt(String dataPassword, String encrypted) throws Exception {
		// 對密鑰進行處理-S
		KeyGenerator kgen = KeyGenerator.getInstance("AES");
		SecureRandom secureRandom;
		// for Android
		secureRandom = SecureRandom.getInstance("SHA1PRNG", "Crypto");
		// for Java
		// secureRandom = SecureRandom.getInstance("SHA1PRNG");
		secureRandom.setSeed(dataPassword.getBytes("UTF-8"));
		kgen.init(128, secureRandom);
		SecretKey secretKey = kgen.generateKey();
		byte[] enCodeFormat = secretKey.getEncoded();
		// 對密鑰進行處理-E
		byte[] byteMi = parseHexStr2Byte(encrypted);
		IvParameterSpec zeroIv = new IvParameterSpec(KEY_VI);
		SecretKeySpec key = new SecretKeySpec(enCodeFormat, "AES");
		Cipher cipher = Cipher.getInstance("AES/CBC/PKCS5Padding");
		cipher.init(Cipher.DECRYPT_MODE, key, zeroIv);
		byte[] decryptedData = cipher.doFinal(byteMi);

		return new String(decryptedData, bm);
	}

	/**
	 * 將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;
	}

	/**
	 * 將二進制轉換成16進制
	 * 
	 * @param buf
	 * @return
	 */
	public static String parseByte2HexStr(byte buf[]) {
		StringBuilder sb = new StringBuilder();
		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();
	}
}


發佈了8 篇原創文章 · 獲贊 9 · 訪問量 11萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章