created: 2024/10/13,
modified: 2024/10/14
PHPにてOpenSSLライブラリのAES暗号化を使用し文字列を暗号化します。実際は、暗号化と復号化は別の箇所で書かれることが多いです。暗号鍵と初期化ベクトルはセキュリティを考慮し環境変数に保存しますが、バイナリデータなのでBase64でテキスト化もあわせて行います。
暗号技術では「対称暗号」と「非対称暗号」があります。
対称暗号と非対称暗号の比較
対称暗号 | 非対称暗号 | |
鍵の使用方法 | 同じ鍵で暗号化と復号化を行う | 異なる鍵(公開鍵と秘密鍵)を使用 |
鍵の共有 | 事前に共有が必要 | 公開鍵の配布のみで良い |
速度 | 速い | 遅い |
代表例 | AES、DES、3DES | RSA、DSA、ECC |
用途 | 大量データの暗号化 | 鍵交換、デジタル署名など |
openssl_encrypt() 関数で使われる $key と $iv について。
$key は、暗号化や復号化に使われる秘密鍵(対称鍵)で、セキュアに生成されたランダムなバイト列でなければなりません。
$key の長さは、使用する暗号方式に依存します。たとえば、AES暗号を使う場合、次のようなキーサイズが一般的です。
AES-256を使用したいので、32バイト(256ビット)を指定します。
初期化ベクトル(Initialization Vector)
暗号アルゴリズムの特定のモード(例えば、CBC: Cipher Block Chaining)で使用されます。IVは暗号化の一番最初のブロックに追加され、同じデータが暗号化されても毎回異なる結果を得られるようにします。
IVは、暗号化を強化するために重要な役割を果たしており、同じ平文を同じ鍵で暗号化しても、毎回異なる暗号文が生成されるようにします。
$iv のサイズは、使用する暗号方式や暗号モードに依存します。例えば、AES-256-CBCを使う場合、$iv のサイズはAESのブロックサイズ(128ビット、16バイト)になります。openssl_cipher_iv_length() 関数を使って、適切なIVのサイズを取得できます。