>백엔드 개발 >PHP 튜토리얼 >net과 호환되는 PHP AES 암호화

net과 호환되는 PHP AES 암호화

WBOY
WBOY원래의
2016-08-10 08:48:371050검색

지난 며칠 동안 PHP aes 암호화를 수행한 다음 .net에서 암호를 해독했습니다. pkcs7의 보완 작업을 수행했는데 암호 텍스트가 .net으로 전송된 후에도 여전히 암호 해독에 실패했습니다. 패딩이 유효하지 않아 제거할 수 없습니다. 검사 프로그램을 통해 암호화 벡터가 잘못 작성된 것으로 확인되었습니다. .net의 암호화된 벡터 형식은 배열이며, PHP에서는 슬래시가 포함된 문자열로 변환되어야 합니다. 변환 중에 추가로 0을 삭제했습니다. 아래 프로그램을 살펴보겠습니다. 이 프로그램은 자신만의 키와 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;
	}
}

위의 내용을 포함하여 net과 호환되는 PHP AES 암호화에 대해 소개합니다. PHP 튜토리얼에 관심이 있는 친구들에게 도움이 되기를 바랍니다.

성명:
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.