這幾天做一個php aes加密然後到.net解密的程序,做了pkcs7的補碼,密文到.net後仍然解密失敗,提示填充無效,無法被移除,通過檢查程序,原來是加密向量寫錯了。在.net中加密向量的格式為數組,在php中應轉為帶斜杠的字串,我在轉換是多刪掉了一個0。下面看程序,設定自己的key和iv後就可以使用這些程序。
class AESMcrypt{ /** * 设置默认的加密key 32位 * @var str * 为了保密省略后半部分 */ private static $defaultKey = "1A426B316FB648..........."; /** * 设置默认加密向量 * @var str * 为了保密省略后半部分 */ //在.net中的格式为 //$iv='{ 0x12, 0x34, 0x56, 0x78, 0x90, 0xAB, 0xCD, 0xEF............}'; private $iv = "\x12\x34\x56\x78\x90\xAB\xCD\xEF\..........."; /** * 设置加密算法 * @var str */ private $cipher; /** * 设置加密模式 * @var str */ private $mode; public function __construct($cipher = MCRYPT_RIJNDAEL_128, $mode = MCRYPT_MODE_CBC){ $this->cipher = $cipher; $this->mode = $mode; } /** * 对内容加密,注意此加密方法中先对内容使用padding pkcs7,然后再加密。 * @param str $content 需要加密的内容 * @return str 加密后的密文 */ public function encrypt($content){ if(empty($content)){ return null; } $srcdata = $this->addPkcs7Padding($content); return mcrypt_encrypt($this->cipher, $this->getSecretKey(), $srcdata, $this->mode, $this->iv); } /** * pkcs7补码 * * @param string $string 明文 * * @return String */ function addPkcs7Padding($string) { $blocksize = mcrypt_get_block_size($this->cipher, $this->mode); $len = strlen($string); //取得字符串长度 $pad = $blocksize - ($len % $blocksize); //取得补码的长度 $string .= str_repeat(chr($pad), $pad); //用ASCII码为补码长度的字符, 补足最后一段 return $string; } /** * 对内容解密,注意此加密方法中先对内容解密。再对解密的内容使用padding pkcs7去除特殊字符。 * @param String $content 需要解密的内容 * @return String 解密后的内容 */ public function decrypt($content){ if(empty($content)){ return null; } $content = mcrypt_decrypt($this->cipher, $this->getSecretKey(), $content, $this->mode, $this->iv); //$block = mcrypt_get_block_size($this->cipher, $this->mode); $pad = ord($content[($len = strlen($content)) - 1]); return substr($content, 0, strlen($content) - $pad); } public function getSecretKey() { return self::$defaultKey; } }
以上就介紹了php AES加密相容net,包含了方面的內容,希望對PHP教學有興趣的朋友有幫助。