2

(セキュリティ上の問題のために)ECB以外のモードでAESを使用して、50〜150文字の長さの文字列を暗号化しようとしています。暗号化クラスを作成し、ECBモードで完全に暗号化/復号化できますが、CBC、CTR、またはOFBモードに切り替えると、元の平文を元に戻すことができません。

ソース:

define('DEFAULT_ENCRYPTION_KEY', 'asdHRMfjkahguglw84tlrogl9y8kamaFDaufasds');

class Encryption
    {
    private $mode   = 'ctr';
    private $algo   = 'rijndael-128';
    private $td     = null;

    function __construct($key = DEFAULT_ENCRYPTION_KEY)
        {
        $this->td = mcrypt_module_open($this->algo, '', $this->mode, '');
        $iv = mcrypt_create_iv(mcrypt_enc_get_iv_size($this->td), MCRYPT_DEV_URANDOM);
        $key = substr($key, 0, mcrypt_enc_get_key_size($this->td));
        mcrypt_generic_init($this->td, $key, $iv);
        }

    public function encrypt($data)
        {
        $encrypted_data = mcrypt_generic($this->td, $data);
        return $encrypted_data;
        }   

    public function decrypt($data)
        {
        $decrypted_data = mdecrypt_generic($this->td, $data);
        $decrypted_data = rtrim($decrypted_data, "\0");
        return $decrypted_data;
        }

    function __destruct()
        {
        mcrypt_generic_deinit($this->td);
        mcrypt_module_close($this->td);
        }

    }

$crypt1 = new Encryption();
$enc = $crypt1->encrypt('hello world');

$crypt2 = new Encryption();
$dec = $crypt2->decrypt($enc);

echo $dec;

戻り値$decは、「helloworld」と等しくありません。

何か案は?

4

1 に答える 1

2

初期化ベクトルを破棄しているようです$iv。メッセージを正常に復号化するには、IV を知る必要があります。IV は秘密ではありません。通常、暗号文とともに何らかのエンベロープ形式で渡されます。

ブロックからブロックへのフィードバックがないため、ECB は初期化ベクトルを必要としません。ただし、ブロック チェーン モードでは、暗号モードを「ブートストラップ」するためのデータが必要です。

于 2009-06-11T14:01:38.380 に答える