6

OAuth を操作し、次の関数で「foo」と呼ぶ文字列 (実際には OAuth トークン) を使用してキーを暗号化します。

public function encrypt( $text )
{
    // add end of text delimiter
    $data = mcrypt_encrypt( MCRYPT_RIJNDAEL_128, $this->key, $text, MCRYPT_MODE_ECB, $this->iv );
    return base64_encode( $data );
}

逆関数を使用して復号化すると、次のようになります。

関数:

    public function decrypt( $text )
    {
        $text = base64_decode( $text );
        return mcrypt_decrypt( MCRYPT_RIJNDAEL_128, $this->key, $text, MCRYPT_MODE_ECB, $this->iv );
    }

結果:

foo%00%00%00%00%00%00%00%00%00%00%00%00%00%00

編集:

もう少し調べてみると、実際には %00 への URL エンコードであることがわかりました。これは、文字列が何らかの形で null 文字で埋め込まれていることを意味しますか? だから私は現在トリム()を使ってそれらを取り除きますが、なぜこれが起こっているのか理解したいと思います.

4

3 に答える 3

6

Rijndaelはブロック暗号です。つまり、特定の長さ(この場合は128ビット)のデータのチャンクを操作します。これは、入力テキストの長さがブロックサイズの倍数でない場合は、収まるようにパディングする必要があることを意味します。この場合、パディングはゼロです。使用できるパディングスキームは他にもたくさんありますが、PHPのmcryptでそれらを使用したい場合は、手動で適用する必要があります。

于 2011-04-15T03:48:25.510 に答える
1

この方法で修正して、パディング文字を取り除くことができます: この場合、Zend を使用しています。

$filter = new Zend_Filter_Decrypt(array('adapter' => 'mcrypt'));
$filter->setVector($lpt->_seed);
str_replace("\x0", '', trim($filter->filter(base64_decode($textToDecrypt))));
于 2011-05-18T13:34:53.560 に答える