mysql和php中的AES加密

Cod*_*mer 0 php mysql encryption codeigniter

Mysql AES_encrypt中有一个函数.

SELECT AES_encrypt( "Hello World", "password" ) AS encrypted_value 
Run Code Online (Sandbox Code Playgroud)

这给出了结果: 9438eb79863e7009722fc3f0ad4b7198

但是当我使用php中的代码来执行AES_encrypt时,它给了我不同的值.

我从stackoverflow获得的PHP代码 - PHP AES加密/解密

<?php
base64_encode(
        mcrypt_encrypt(
            MCRYPT_RIJNDAEL_256,
            $sSecretKey, $sValue, 
            MCRYPT_MODE_ECB, 
            mcrypt_create_iv(
                mcrypt_get_iv_size(
                    MCRYPT_RIJNDAEL_256, 
                    MCRYPT_MODE_ECB
                ), 
                MCRYPT_RAND)
            )
        ), "\0"
?>
Run Code Online (Sandbox Code Playgroud)

PHP代码的结果是 ytip2sEkD87gmRk3IVI09qE7T+RoLr20YK4rJp16NkY=

在php或codeigniter中是否有一个方法,以便它返回相同的值. - 谢谢.

egg*_*yal 6

您使用的代码有三个问题:

  1. 正如其他人所提到的,您的PHP代码目前正在使用,MCRYPT_RIJNDAEL_256而如下所述AES_ENCRYPT():

    使用128位密钥长度的编码,但您可以通过修改源将其扩展到256位.我们选择了128位,因为它更快,并且对于大多数用途来说足够安全.

  2. 正如其他人所提到的,您正在申请base64_encode()将PHP的二进制结果转换为文本,而MySQL结果似乎只是其二进制结果的十六进制表示.您可以TO_BASE64()在v5.6.1中使用MySQL,也可以bin2hex()在PHP中使用.

  3. 由于根据记载mcrypt_encrypt():

    如果数据的大小不是n*blocksize,则数据将用' \ 0 ' 填充.

    MySQL使用PKCS7填充.

因此,要在PHP中获得与当前为MySQL显示的相同的结果:

<?php

class MySQL_Function {
  const PKCS7 = 1;

  private static function pad($string, $mode, $blocksize = 16) {
    $len = $blocksize - (strlen($string) % $blocksize);
    switch ($mode) {
      case self::PKCS7:
        $padding = str_repeat(chr($len), $len); break;

      default:
        throw new Exception();
    }
    return $string.$padding;
  }

  public static function AES_ENCRYPT($str, $key_str) {
    return mcrypt_encrypt(
      MCRYPT_RIJNDAEL_128,
      $key_str, self::pad($str, self::PKCS7),
      MCRYPT_MODE_ECB
    );
  }
}

echo bin2hex(MySQL_Function::AES_encrypt( "Hello World", "password" ));

?>
Run Code Online (Sandbox Code Playgroud)