1

MCRYPT を使用して作成したランダムな文字列をエンコードおよびデコードしようとしていますが、正しくデコードされません。

文字列をエンコードするために使用している関数は次のとおりです。

function m_encrypt($key, $text, $iv) {
    return mcrypt_encrypt(MCRYPT_RIJNDAEL_128, $key, $text, MCRYPT_MODE_CBC, $iv);
}

ご覧のとおり、私が書いた定義済みの「キー」、エンコードするテキスト、および別のファイルに作成された iv が必要です。次に、データを暗号化して返します。

文字列をデータベースに挿入する関数は次のとおりです。

$sth = $dbh->prepare('INSERT INTO randomStrings(random_string, iv) VALUES (:random_string, :iv)');
$iv_size = mcrypt_get_iv_size(MCRYPT_RIJNDAEL_128, MCRYPT_MODE_CBC);

$rows = 50;

for($i = 0; $i < $rows; $i++) {
    $iv = mcrypt_create_iv($iv_size, MCRYPT_RAND);
    $randString = get_random_string($chars, 20);
    $randString = m_encrypt($key, $randString, $iv);
    $sth->bindParam(':random_string', $randString);
    $sth->bindParam(':iv', $iv);
    $sth->execute();    
}

文字列と iv をデータベースに挿入するだけです。

次に、これを使用してエンコードされた文字列を読み取ろうとします。

function m_decrypt($key, $text, $iv) {
    return mcrypt_decrypt(MCRYPT_RIJNDAEL_128, $key, $text, MCRYPT_MODE_CBC, $iv);
}

エンコード機能に似ていますが、逆です。

最後に、文字列を復号化しようとするファイルは次のようになります。

$sth = $dbh->prepare('SELECT * FROM randomStrings');
$sth->execute();    

while($result = $sth->fetch(PDO::FETCH_ASSOC)) {
    echo m_decrypt($key, $result['random_string'], $result['iv']);
    echo '<br/>';
}

結果は常に、次のような任意の文字セットになります。

í,eHGxC•z»@”“§``

ランダム文字列の生成に使用する文字を単純な az と 0-9 に制限しているため、これが正しくないことはわかっているため、これが正しいデコードになる可能性はありません。

4

1 に答える 1

0

暗号化された文字列やIVがデータベースによって破壊されている可能性があります。これが当てはまるかどうかをテストするには、データベースに保存し、すぐにフェッチして、結果を元の結果と比較します。

使用しているデータベースソフトウェアを指定していませんが、MySQLの場合、暗号化されたデータを格納するための適切な列タイプはまたはVARBINARYですBLOB。(一定の長さである必要があるIVの場合BINARYも機能します。ただし、実際には、 IVを格納する通常の方法は、暗号化された文字列の前に単純に追加することです。)

于 2013-01-27T18:40:24.677 に答える