PHP opensslによるAES復号クラスの整理


_cipher = $cipher;
        $this->_options = $options;
        $this->_tag = $tag;
        $this->_aad = $add;
        $this->_tagLength = $tagLength;
        $ivlen = openssl_cipher_iv_length($cipher);//         iv  
        $this->_iv = openssl_random_pseudo_bytes($ivlen);//                     
        $this->_key = $key . 'nassir';
    }

    public function encrypt($plaintext)
    {
        $ciphertext = openssl_encrypt($plaintext, $this->_cipher, $this->_key, $this->_options, $this->_iv, $this->_tag);
        return $ciphertext;
    }

    public function decrypt($ciphertext)
    {
        $original_plaintext = openssl_decrypt($ciphertext, $this->_cipher, $this->_key, $this->_options, $this->_iv, $this->_tag);
        return $original_plaintext;
    }
}

$tmp = new AES("aes-128-gcm", "123456789WANGchao");
$plaintext = "message to be encrypted";
$ciphertext = $tmp->encrypt($plaintext);
echo $ciphertext . "
"; $original_plaintext = $tmp->decrypt($ciphertext); echo $original_plaintext . "
";

コードは以上のように、AESという対称暗号化の原理もはっきり覚えておらず、そのセキュリティはバイト置換、行ソート、列混同、循環暗号化に基づいていることを覚えているだけで、よく使われる対称暗号化方式の一つ(対称暗号化は主にAES、DES、3 DES)であり、興味のある自分でAESの原理を探してみると、私はここでこの関数の中で分からないかもしれないところだけを話します.
一般的なAES暗号化方法はECB,CTR,GMAC,GCMであり,共通点は,明文パケット->暗号化->暗号文パケットである.異なる点は、ECBの暗号化は単純な明文分岐と鍵による暗号化演算であり、つまり同じ明文を持つ異なるパケットが暗号化された後に同じ暗号文パケットが存在することであり、鍵CTR暗号化プロセスを解読するためにカウンタ概念を導入しやすく、暗号化後にカウンタを1回実行して鍵を変更することなく、ECBの欠陥から抜け出すことができる.この方式では、メッセージの完全性を保証するために$iv GMAC暗号化プロセスがMAC(メッセージ検証コード)を導入する初期カウンタの値が必要であり、追加のメッセージが暗号文とともにMAC値GCM Gを生成する必要がある.GMAC CはCTRの両者が統合されている
個人的にはphpによるaes-gcm暗号化の実現方法は以下の通りである.
string openssl_encrypt ( string $data , string $method , string $key [, int $options = 0 [, string $iv = "" [, string &$tag = NULL [, string $aad = "" [, int $tag_length = 16 ]]]]] )

$data暗号化対象明文
$methodで使用される暗号化方法(AESのいくつかを含むが限定されない)
$keyキー
$vi初期ベクトル、gcmで初期カウンタをして暗号化の安全性を保証する
tag,aad,tag_lengthはいずれも暗号化におけるデータの完全性を保証するために存在し,具体的な役割はまだ検討されている.
更新
突然tagがメッセージの整合性を検証するために使用されるのは可変であり、復号を行う際に暗号文と暗号化で修正されたtagが正常に復号される必要があることが分かった.