ユーザ用ツール

サイト用ツール


aes

文書の過去の版を表示しています。


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が使える

暗号化

# 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(".")

復号

# 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などでは設定できない。

aes.1659841323.txt.gz · 最終更新: 2022/08/07 03:02 by nullpon