文書の過去の版を表示しています。
<markdown> # AES
* 共通鍵暗号の1つ * NISTで標準化されているアルゴリズムの1つ * 現在暗号と言ったら、ほぼこれが使用されている
- TLS1.3の暗号アルゴリズムは、AESとchacha20しかない
- wifiの通信暗号化もAES
- 暗号化zipもAES
- gpgではデータそのものはAESで暗号化している。公開鍵はAESの鍵を暗号化している。
## 鍵導出関数
AESに限った話ではないが、現代の共通鍵暗号ではパスワードをそのまま暗号鍵にしているわけではない。人の考えたパスワードは暗号鍵としては脆弱なので、パスワードが漏洩しなくても暗号データの解析から鍵を取得されてしまう恐れがある。よってパスワードを元に推測不可能な鍵に変換して使用している
以下のような鍵導出関数がある
* bcrypt * argon2 * pbkdf2
## AESのアルゴリズム
バリエーションがあります
* aes-128-cbc * aes-128-ecb * aes-128-gcm * aes-256-cbc * aes-256-ecb * aes-256-gcm
2022年時点ではaes-128-gcm、aes-256-gcmがよく利用される。
## コード例
RubyはOpenSSLライブラリが添付されており、これを利用すると簡単にAESが使える
暗号化
```ruby # usage: # ruby enc.rb plain_text password
require “openssl” require “base64”
msg = ARGV[0] pass = ARGV[1] salt = OpenSSL::Random.random_bytes(8)
aes = OpenSSL::Cipher.new(“AES-256-GCM”) aes.encrypt
key_iv = OpenSSL::PKCS5.pbkdf2_hmac_sha1(pass, salt, 2000, aes.key_len + aes.iv_len)
aes.key = key_iv[0, aes.key_len] aes.iv = key_iv[aes.key_len, aes.iv_len] # aes.auth_data = “secret”
encrypted = “” encrypted « aes.update(msg) encrypted « aes.final
puts [salt, encrypted, aes.auth_tag].map { |d| Base64.urlsafe_encode64(d, padding: false) }.join(“.”) ```
復号
```ruby # usage: # ruby dec.rb encrypted_text password
require “openssl” require “base64”
encrypted = ARGV[0] pass = ARGV[1]
salt, data, auth_tag = encrypted.split(“.”).map{ |d| Base64.urlsafe_decode64(d) }
aes = OpenSSL::Cipher.new(“AES-256-GCM”) aes.decrypt
key_iv = OpenSSL::PKCS5.pbkdf2_hmac_sha1(pass, salt, 2000, aes.key_len + aes.iv_len)
aes.key = key_iv[0, aes.key_len] aes.iv = key_iv[aes.key_len, aes.iv_len] # aes.auth_data = “secret” aes.auth_tag = auth_tag
decrypted = “” decrypted « aes.update(data) decrypted « aes.final
puts decrypted ```
auth_tag, auth_dataはAES-256-GCM、AES-128-GCMアルゴリズムで使用するメッセージ認証(データ改竄の検出)を行うためのデータ。auth_dataはオプショナルなので未指定でも可(もし指定するならこれもランダムなデータが望ましい)。
メッセージ認証機能のないAES-256-CBCなどでは設定できない。 </markdow n>