[Snippet] AES 加密 with CBC & PKCS7 on PHP

AES (Advanced Encryption Standard) 進階加密標準,目前已成為流行的對稱式加密法之一,也是美國國家安全局 NSA 批准可用在最高機密資訊上的加密方式(聽起來敲厲害的啊~~),當然隨著密鑰的長度越長(128, 192, 256 bits),安全性就越高。更多詳細介紹可參考 wiki

這裡分享的 Snippets 是固定的 128 bits密鑰,並且針對要加密的資料做 base64 encode。

public function aesDecrypt() {
		$encryptedData = "6lbH0qa6J1Sl5/I5C2YeGg==";
		$cipher = MCRYPT_RIJNDAEL_128;
		$mode = MCRYPT_MODE_CBC;
		$key = "A123456789012345";  // 回合金鑰
		$iv = "B123456789012345";  // 密鑰
		$initializationVectorSize = mcrypt_get_iv_size($cipher, $mode);

		$data =  mcrypt_decrypt(
			$cipher,
			$key,
			base64_decode($encryptedData),
			$mode,
			$iv
		);
    $pad = ord($data[strlen($data) - 1]);
		return substr($data, 0, -$pad);
	}

public function getAesEncrypt() {
		$xml_data = "AllPayTest";
		$cipher = MCRYPT_RIJNDAEL_128;
		$mode = MCRYPT_MODE_CBC;
		$key = "A123456789012345";   // 回合金鑰
		$iv = "B123456789012345";   // 密鑰
		$blockSize = mcrypt_get_block_size($cipher, $mode);
		$pad = $blockSize - (strlen($xml_data) % $blockSize);

		return base64_encode(mcrypt_encrypt(
			$cipher,
			$key,
			$xml_data . str_repeat(chr($pad), $pad),
			$mode,
			$iv
		));
	}

如果密鑰希望每次加密時都可以不一樣,可以參考此 gist