0

AES 文字列の暗号化と復号化を実行するために、いくつかの PHP コードに取り組んでいます。暗号化は正常に機能していますが、復号化できないようです。

以下は、暗号化を行い、必要なパディングを追加するコードです。

function encrypt($data) 
    { 
        $iv = "PRIVATE";
        $key = CIPHERKEY;

        return base64_encode(mcrypt_encrypt(MCRYPT_RIJNDAEL_128, $key, addpadding($data), MCRYPT_MODE_CBC, $iv));
    }

    function addpadding($string, $blocksize = 16)
    {
        $len = strlen($string);
        $pad = $blocksize - ($len % $blocksize);
        $string .= str_repeat(chr($pad), $pad);

        return $string;
    }

上記のコードは問題なく動作していますが、以下のコードでは復号化が失敗し続けます。復号化を試みてからパディングを取り除きますが、パディング関数から常に false が返されます。

以下は、復号化とストリッピングを行うコードです。

function strippadding($string)
{
    $slast = ord(substr($string, -1));
    $slastc = chr($slast);
    $pcheck = substr($string, -$slast);
    if(preg_match("/$slastc{".$slast."}/", $string)){
        $string = substr($string, 0, strlen($string)-$slast);
        return $string;
    } else {
        return "false";
    }
}

    function decrypt($data)
    {
        $iv = "PRIVATE";
        $key = CIPHERKEY;

        //$decoded = mcrypt_decrypt(MCRYPT_RIJNDAEL_128, $key, $data, MCRYPT_MODE_CBC, $iv);
        $decrytped = mcrypt_decrypt(MCRYPT_RIJNDAEL_128, $key, $data, MCRYPT_MODE_CBC, $iv);
        $base64Decoded = base64_decode($decrytped);
        return strippadding($base64Decoded);
    }

ご協力いただきありがとうございます。

4

2 に答える 2

3

復号化方法では、復号化とbase64の手順が逆になります。暗号化の操作をどのような順序で実行する場合でも、逆に復号化を実行することが重要です。

暗号化方式では、暗号文をbase64でエンコードしています。

base64_encode(mcrypt_encrypt(MCRYPT_RIJNDAEL_128, $key, addpadding($data), MCRYPT_MODE_CBC, $iv));

復号化するときは、base64エンコーディングを元に戻し、その結果を復号化する必要があります。

$base64Decoded = base64_decode($data);
$decrytped = mcrypt_decrypt(MCRYPT_RIJNDAEL_128, $key, $base64Decoded, MCRYPT_MODE_CBC, $iv);

また、mcryptは不均一なブロックのパディングを処理するように見えるため、addpadding()メソッドは不要な場合があります。

于 2013-01-27T23:27:06.530 に答える
0

ブロックサイズよりも小さい短すぎるIVを使用しています。これにより、復号化に別のIVが使用されると思います。ブロックサイズは16バイトであるため、IVは16バイトである必要がありますが、固定文字列IVはわずか7バイトです(基になるCコードがおそらく追加する終了ゼロバイトを数えると8バイト)。

固定文字列を使用する代わりに、によって生成されたランダムIVを使用する必要がありますmcrypt_create_iv()。PHPマニュアルmcrypt_get_iv_size()の例1に示すように、を使用して1ブロックの長さを確認できます。mcrypt_create_iv()次に、暗号文の前にランダムなIVを送信/保存して、復号化時にIVが何であったかを把握します。

また、mcryptは独自のパディングを行うため、その必要はありません。そして、mfantoが指摘したように、復号化後ではなく、復号化の前にBase64をデコードする必要があります。

于 2013-01-27T23:26:41.927 に答える