0

Mysql AES_encrypt には関数があります。

SELECT AES_encrypt( "Hello World", "password" ) AS encrypted_value 

これにより、次の結果が得られます。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"
?>

PHPコードの結果はytip2sEkD87gmRk3IVI09qE7T+RoLr20YK4rJp16NkY=

同じ値を返すようにphpまたはcodeigniterにメソッドがありますか? - ありがとうございました。

4

4 に答える 4

6

使用しているコードには 3 つの問題があります。

  1. 他の人が言及したように、あなたのPHPコードは現在使用してMCRYPT_RIJNDAEL_256いますが、下に文書化されているようにAES_ENCRYPT():

    鍵長128bitのエンコードを採用していますが、ソースを改変することで256bitまで拡張可能です。128 ビットを選択したのは、128 ビットの方がはるかに高速であり、ほとんどの目的で十分に安全だからです。

  2. 他の人が述べたように、PHP のバイナリ結果をテキストに変換することを申請base64_encode()していますが、MySQL の結果はバイナリ結果の 16 進数表現にすぎないように見えます。TO_BASE64()v5.6.1 以降の MySQL またはbin2hex()PHP で使用できます。

  3. 以下に記載されているmcrypt_encrypt()とおり:

    データのサイズが n * ブロックサイズでない場合、データは ' \0 ' で埋められます。

    一方、MySQL はPKCS7 paddingを使用します。

したがって、現在 MySQL で示しているのと同じ結果を PHP で取得するには、次のようにします。

<?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" ));

?>
于 2013-06-11T10:05:20.227 に答える
-1

受け入れられた答えは機能しますが、多くのコードです。これがワンライナーです

function aes_encrypt_str($val,$key){
    return mcrypt_encrypt(MCRYPT_RIJNDAEL_128,$key, $val,MCRYPT_MODE_ECB,mcrypt_create_iv(mcrypt_get_iv_size(MCRYPT_RIJNDAEL_256,MCRYPT_MODE_ECB),MCRYPT_RAND));
}
于 2014-02-21T01:53:51.853 に答える