PHP にてOpenSSLのAESで暗号化・復号化
#PHP #SSL

created: 2024/10/13, modified: 2024/10/14

標準のサムネイル 2024-06

PHPにてOpenSSLライブラリのAES暗号化を使用し文字列を暗号化します。実際は、暗号化と復号化は別の箇所で書かれることが多いです。暗号鍵と初期化ベクトルはセキュリティを考慮し環境変数に保存しますが、バイナリデータなのでBase64でテキスト化もあわせて行います。

コード

初めに$keyと$ivを取得し、Base64して環境変数に

暗号化

復号化

OpenSSLライブラリでのAES暗号化

「対称暗号」と「非対称暗号」

暗号技術では「対称暗号」と「非対称暗号」があります。

  • 対称暗号(Symmetric Encryption):同じ鍵を使ってデータを暗号化し、復号化します。このため、送信者と受信者は同じ秘密鍵を共有している必要があります。
  • 非対称暗号(Asymmetric Encryption):異なる鍵(公開鍵と秘密鍵)を使います。片方の鍵で暗号化したデータは、もう一方の鍵でしか復号できません。公開鍵は誰にでも公開できる一方、秘密鍵は所有者だけが持ちます。

対称暗号と非対称暗号の比較

  対称暗号 非対称暗号
鍵の使用方法 同じ鍵で暗号化と復号化を行う 異なる鍵(公開鍵と秘密鍵)を使用
鍵の共有 事前に共有が必要 公開鍵の配布のみで良い
速度 速い 遅い
代表例 AES、DES、3DES RSA、DSA、ECC
用途 大量データの暗号化 鍵交換、デジタル署名など

openssl_random_pseudo_bytes

暗号鍵 ($key)

openssl_encrypt() 関数で使われる $key と $iv について。
$key は、暗号化や復号化に使われる秘密鍵(対称鍵)で、セキュアに生成されたランダムなバイト列でなければなりません。

サイズ

$key の長さは、使用する暗号方式に依存します。たとえば、AES暗号を使う場合、次のようなキーサイズが一般的です。

  • AES-128: 16バイト(128ビット)
  • AES-192: 24バイト(192ビット)
  • AES-256: 32バイト(256ビット)

AES-256を使用したいので、32バイト(256ビット)を指定します。

初期化ベクトル ($iv)

初期化ベクトル(Initialization Vector)
暗号アルゴリズムの特定のモード(例えば、CBC: Cipher Block Chaining)で使用されます。IVは暗号化の一番最初のブロックに追加され、同じデータが暗号化されても毎回異なる結果を得られるようにします。
IVは、暗号化を強化するために重要な役割を果たしており、同じ平文を同じ鍵で暗号化しても、毎回異なる暗号文が生成されるようにします。

サイズ

$iv のサイズは、使用する暗号方式や暗号モードに依存します。例えば、AES-256-CBCを使う場合、$iv のサイズはAESのブロックサイズ(128ビット、16バイト)になります。openssl_cipher_iv_length() 関数を使って、適切なIVのサイズを取得できます。