web-dev-qa-db-ja.com

AES-256暗号化PHP

_$data_をAES-256に暗号化するためにPHP関数、AES256_encode($dataToEcrypt)が必要で、別のAES256_decode($encryptedData)は反対のことを行います。この関数に必要なコードは誰でも知っていますか?

23
mariannnn

mcryptモジュール を見てください

here から取得したAES-Rijndaelの例

$iv_size = mcrypt_get_iv_size(MCRYPT_RIJNDAEL_128, MCRYPT_MODE_CBC);
$iv = mcrypt_create_iv($iv_size, MCRYPT_DEV_URANDOM);
$key = pack('H*', "bcb04b7e103a0cd8b54763051cef08bc55abe029fdebae5e1d417e2ffb2a00a3");
# show key size use either 16, 24 or 32 byte keys for AES-128, 192
# and 256 respectively
$key_size =  strlen($key);
echo "Key size: " . $key_size . "\n";
$text = "Meet me at 11 o'clock behind the monument.";
echo strlen($text) . "\n";

$crypttext = mcrypt_encrypt(MCRYPT_RIJNDAEL_128, $key, $text, MCRYPT_MODE_CBC, $iv);
echo strlen($crypttext) . "\n";

これは decrypt function です

15
Fabio

_$data_をAES-256に暗号化するためにPHP関数、AES256_encode($dataToEcrypt)が必要で、別のAES256_decode($encryptedData)は反対のことを行います。この関数に必要なコードは誰でも知っていますか?

暗号化とエンコードの違い があります。

あなたは本当にAES-256が必要ですか? AES-256対AES-128のセキュリティはそれほど重要ではありません。 256ビットのブロック暗号の代わりに128ビットのブロック暗号を使用したため、ハッキングされるよりもプロトコル層で失敗する可能性が高くなります。

重要-ライブラリを使用する

A flowchart for PHP users

迅速で汚れたAES-256実装

独自のビルドに興味がある場合は、実稼働環境で展開するためではなく、むしろ独自の教育のために、サンプルAES256

_/**
 * This is a quick and dirty proof of concept for StackOverflow.
 * 
 * @ref http://stackoverflow.com/q/6770370/2224584
 * 
 * Do not use this in production.
 */
abstract class ExperimentalAES256DoNotActuallyUse
{
    /**
     * Encrypt with AES-256-CTR + HMAC-SHA-512
     * 
     * @param string $plaintext Your message
     * @param string $encryptionKey Key for encryption
     * @param string $macKey Key for calculating the MAC
     * @return string
     */
    public static function encrypt($plaintext, $encryptionKey, $macKey)
    {
        $nonce = random_bytes(16);
        $ciphertext = openssl_encrypt(
            $plaintext,
            'aes-256-ctr',
            $encryptionKey,
            OPENSSL_RAW_DATA,
            $nonce
        );
        $mac = hash_hmac('sha512', $nonce.$ciphertext, $macKey, true);
        return base64_encode($mac.$nonce.$ciphertext);
    }

    /**
     * Verify HMAC-SHA-512 then decrypt AES-256-CTR
     * 
     * @param string $message Encrypted message
     * @param string $encryptionKey Key for encryption
     * @param string $macKey Key for calculating the MAC
     */
    public static function decrypt($message, $encryptionKey, $macKey)
    {
        $decoded = base64_decode($message);
        $mac = mb_substr($message, 0, 64, '8bit');
        $nonce = mb_substr($message, 64, 16, '8bit');
        $ciphertext = mb_substr($message, 80, null, '8bit');

        $calc = hash_hmac('sha512', $nonce.$ciphertext, $macKey, true);
        if (!hash_equals($calc, $mac)) {
            throw new Exception('Invalid MAC');
        }
        return openssl_decrypt(
            $ciphertext,
            'aes-256-ctr',
            $encryptionKey,
            OPENSSL_RAW_DATA,
            $nonce
        );
    }
}
_

使用法

最初に、2つのキー(はい、2つ)を生成し、それらを何らかの方法で保存します。

_$eKey = random_bytes(32);
$aKey = random_bytes(32);
_

次に、メッセージを暗号化/復号化するには:

_$plaintext = 'This is just a test message.';
$encrypted = ExperimentalAES256DoNotActuallyUse::encrypt($plaintext, $eKey, $aKey);
$decrypted = ExperimentalAES256DoNotActuallyUse::decrypt($encrypted, $eKey, $aKey);
_

random_bytes()がない場合は、 random_compat を取得します。

14

MCRYPT_RIJNDAEL_256はAES_256と同等ではありません。

RIESをAESから復号化する方法は、MCRYPT_RIJNDAEL_128を使用し、暗号化する前に暗号化するために文字列をパディングすることです。

AES-256のBlockSize = 128bitとKeySize = 256bit Rijndael-256のBlockSize = 256bitとKeySize = 256bit

AES/Rijndael 128ビットだけが同一です。 Rijndael-192およびRijndael-256は、AES-192およびAES-256と同一ではありません(ブロックサイズとラウンド数は異なります)。

13