5

暗号化されたデータを処理するクラスを作成しています。基本的には、データを暗号化してDBに格納し、取得時に復号化するために使用されます。

ここに私が書いたものがあります:

    class dataEncrypt {

        private $encryptString;
        private $decryptString;
        private $encryptionMethod;
        private $key;

        public function __construct() {

            /* IMPORTANT - DONT CHANGE OR DATA WILL DAMAGE */
            $this->key = sha1('StringToHash');

            // Set the encryption type
            $this->encryptionMethod = "AES-256-CBC";

        }

        // Generate the IV key
        private function generateIV() {

            $ivSize = mcrypt_get_iv_size(MCRYPT_RIJNDAEL_256, MCRYPT_MODE_CBC);
            return mcrypt_create_iv($ivSize, MCRYPT_RAND);
        }

        // Retrieve the key
        private function retrieveKey() {

            return $key;
        }

        // Encrypt a string
        public function encryptString($string) {

            // Return the encrypted value for storage
            return openssl_encrypt($string, $this->encryptionMethod, $this->retrieveKey(), 0, $this->generateIV());
        }

        // Decrypt a string
        public function decryptString($data) {

            // return the decrypted data
            return openssl_decrypt($data, $this->encryptionMethod, $this->retrieveKey(), 0, $this->generateIV());

            return false;

        }

    }

保存する前に文字列を暗号化しようとすると、次の PHP 警告が表示されます。

警告: openssl_encrypt(): 渡された IV の長さは 32 バイトです。これは、選択された暗号で予想される 16 バイトよりも長く、/var/www/blahblah で切り捨てられています... 行 xxx

私はこれをグーグルで検索し、IV関数をグーグルで検索しましたが、どちらにもsweetheatが見つかりません。ここではどんなアドバイスも歓迎します。

ありがとう

4

1 に答える 1

9

MCRYPT_RIJNDAEL_256 ではなく MCRYPT_CAST_256 を mcrypt_get_iv_size に渡すことで、動作させることができました

暗号化:

$iv_size = mcrypt_get_iv_size(MCRYPT_CAST_256, MCRYPT_MODE_CBC);
$iv = mcrypt_create_iv($iv_size, MCRYPT_RAND);

$encrypted = openssl_encrypt($string, "AES-256-CBC", $key, 0, $iv);
$encrypted = $iv.$encrypted;

復号化

$iv_size = mcrypt_get_iv_size(MCRYPT_CAST_256, MCRYPT_MODE_CBC);
$iv = substr($string, 0, $iv_size);

$decrypted = openssl_decrypt(substr($string, $iv_size), "AES-256-CBC", $key, 0, $iv);
于 2013-08-15T09:42:30.480 に答える