3

私のPHPintallには問題があるかもしれないと思います。これをやろうとすると

警告:mcrypt_decrypt()[function.mcrypt-decrypt]:モジュールの初期化に失敗しました

モードECBを使用してAES-128で暗号化された次の文字列を復号化するコードの小さなスニペットを書いています。

キー(base64でエンコード):aXJhbmRvbXNlY3VyZWtleQ ==

暗号化された文字列>(base64でエンコード):3l6xiNdgRG + PkBw5M0lawvJ / fmuTZPRhEcbtqAmOpDI =

モジュールエラーが発生し続けます。

これは私が試したことです:

<?PHP
$retval = mcrypt_decrypt( "AES-128",
    base64_decode( "aXJhbmRvbXNlY3VyZWtleQ=="), 
    base64_decode( "3l6xiNdgRG+PkBw5M0lawvJ/fmuTZPRhEcbtqAmOpDI") ,
    "ECB");

echo $retval;
?> 

これが私の関連するphpinfoです。AES-128が表示されません。多分それが問題です。

    mcrypt
    mcrypt support  enabled
    Version     2.5.8
    Api No  20021217
    Supported ciphers   cast-128 gost rijndael-128 twofish arcfour      cast-256           loki97      rijndael-192 saferplus wake blowfish-compat des rijndael-256 serpent xtea blowfish enigma rc2 tripledes
    Supported modes     cbc cfb ctr ecb ncfb nofb ofb stream 
4

1 に答える 1

5

あなたは近くにいます、2つの小さな問題があります。

まず、AES-128mcryptからの有効な暗号定数ではありません。AESは本当にあなたがサポートしているrijndaelです。AES-128のmcrypt暗号定数MCRYPT_RIJNDAEL_128は、文字列rijndael-128です。次に、mcryptモードは小文字でなければなりません。

コードを次のように変更します。

<?php
$retval = mcrypt_decrypt( "rijndael-128",
    base64_decode( "aXJhbmRvbXNlY3VyZWtleQ=="), 
    base64_decode( "3l6xiNdgRG+PkBw5M0lawvJ/fmuTZPRhEcbtqAmOpDI") ,
    "ecb");

echo $retval;

次の正しい出力が得られます。Is 3 random enough?

個人的には、実際の文字列ではなくmcrypt定数を使用するので、rijndael-128MCRYPT_RIJNDAEL_128ecb置き換えMCRYPT_MODE_ECBます。

ちなみに、機密情報を大量に暗号化する場合は、ECBではなくIVでCBCを使用することを検討してください。

Mcryptは、適切な長さのIVを簡単に作成できます。サンプルコード:

$ivsize = mcrypt_get_iv_size(MCRYPT_RIJNDAEL_128, MCRYPT_MODE_CBC);
$iv     = mcrypt_create_iv($ivsize);

暗号化および復号化するときにこのIVを使用します。移植性のために、データと一緒にIVをbase64でエンコードされた文字列として渡すことができます。

于 2012-11-21T18:37:47.610 に答える