1

PHP の暗号化/復号化で奇妙な問題に遭遇しました。以下のコードを見てください。

<?php

function encrypt($encrypt, $mc_key, $iv) 
{
    $passcrypt = trim(mcrypt_encrypt(MCRYPT_RIJNDAEL_256, $mc_key, trim($encrypt), MCRYPT_MODE_ECB, $iv));
    $encode = base64_encode($passcrypt);
    return $encode;
}

function decrypt($decrypt, $mc_key, $iv)
{
    $decoded = base64_decode($decrypt);
    $decrypted = trim(mcrypt_decrypt(MCRYPT_RIJNDAEL_256, $mc_key, trim($decoded), MCRYPT_MODE_ECB, $iv));
    return $decrypted;
}

$key = 'SAtFIAI2g_r=supL43QkO#dTQYjS0JCt';
$iv = '#CvmQT1TlpINQgnc4q%9$k8mt170MXll';
$message = 'AAABzefYdjTYBAFLNMHfLHJZCtAkTKm';

$encrypted = encrypt($message, $key, $iv);
echo $encrypted."\n";

$decrypted = decrypt($encrypted, $key, $iv);
echo $decrypted."\n";

?>

$key、$iv を持っており、これを使用して $message をエンコードします。したがって、2行目は復号化されたメッセージになるはずです。しかし、そうではありません。出力を参照してください。

MXk9zteonXhz2zPVK7o4oUJJuXXQRlwOzTO7JbqbsA==
tq֞u�4�&amp;�
        1P&���_pŬ�.��
_

ただし、$message を少し変更すると、問題なく動作します。元。$message が次の場合: AAABzefYdjTYBAFLNMHfLHJZCtAkTKn 出力は次のとおりです。

fAEeJAkluHht8l6ain99YMAMHJtiUAg47XsJBECdrLA=
AAABzefYdjTYBAFLNMHfLHJZCtAkTKn

解決策を見つけるための助けをいただければ幸いです。

4

1 に答える 1

2

これがここで起こっていることであるかどうかはわかりませんが、可能性が高いようです。

変数は、それを編集した$decodedバイナリ文字列を保持するため、それを編集する前に関数によって生成された正確なバイナリ文字列である必要があります。呼び出している base64 でデコードされた値ではありません。切り取られた文字がある場合は、最初に暗号化したものとは異なるバイト文字列を復号化しています。base64_decode()encrypt()base64_encode()trim()mcrypt_decrypt()

function decrypt($decrypt, $mc_key, $iv)
{
    $decoded = base64_decode($decrypt);
    $decrypted = trim(mcrypt_decrypt(MCRYPT_RIJNDAEL_256, $mc_key, $decoded, MCRYPT_MODE_ECB, $iv));
    // Don't wrap $decoded as trim($decoded) here-----------------^^^^^^^^^^
    return $decrypted;
}

編集

コメントの後の完全性のためtrim()に、暗号化するときは次のいずれかを行うべきではありません。

function encrypt($encrypt, $mc_key, $iv) 
{
    $passcrypt = trim(mcrypt_encrypt(MCRYPT_RIJNDAEL_256, $mc_key, $encrypt, MCRYPT_MODE_ECB, $iv));
    // -------------------------------------------Don't trim()----^^^^^^^^^^
    $encode = base64_encode($passcrypt);
    return $encode;
}
于 2012-07-19T20:36:06.973 に答える