您的位置:首页 > 编程语言 > PHP开发

php AES加密兼容.net

2015-08-07 12:12 886 查看
这几天做一个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;
}
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: