aes
差分
このページの2つのバージョン間の差分を表示します。
両方とも前のリビジョン前のリビジョン次のリビジョン | 前のリビジョン | ||
aes [2022/08/07 03:02] – nullpon | aes [2022/08/31 09:46] (現在) – nullpon | ||
---|---|---|---|
行 13: | 行 13: | ||
## 鍵導出関数 | ## 鍵導出関数 | ||
- | AESに限った話ではないが、現代の共通鍵暗号ではパスワードをそのまま暗号鍵にしているわけではない。人の考えたパスワードは暗号鍵としては脆弱なので、パスワードが漏洩しなくても暗号データの解析から鍵を取得されてしまう恐れがある。よってパスワードを元に推測不可能な鍵に変換して使用している | + | AESに限った話ではないが、現代の共通鍵暗号ではパスワードをそのまま暗号鍵にしているわけではない。人の考えたパスワードは暗号鍵としては脆弱なので、パスワードが漏洩しなくても暗号データの解析から鍵を取得されてしまう恐れがある。よってパスワードから推測の難しいデータを導出して暗号鍵として使用する |
以下のような鍵導出関数がある | 以下のような鍵導出関数がある | ||
行 21: | 行 21: | ||
* pbkdf2 | * pbkdf2 | ||
- | ## AESのアルゴリズム | + | ## 暗号利用モード |
- | バリエーションがあります | + | - [暗号利用モード - Wikipedia](https:// |
- | * 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がよく利用される。 | + | * ECB (非推奨) |
+ | * CBC | ||
+ | * CTR | ||
+ | * GCM | ||
+ | |||
+ | ECBはブロック長ごとに同じ鍵でxorを取るというシンプルだが非常に脆弱な方式なので使用を避けるべき(ただし他の方式も初期化ベクトルを使い回すなどすると脆弱になるので注意) | ||
+ | |||
+ | CBC、CTRは今日よく使われている方式 | ||
+ | |||
+ | GCMは暗号化に加えてメッセージ認証(改ざん検知)機能も併せ持っている。TLS v1.3で利用できるAES暗号は全てGCMである | ||
## コード例 | ## コード例 | ||
- | RubyはOpenSSLライブラリが添付されており、これを利用すると簡単にAESが使える | + | Rubyでのコード例を示す。RubyはOpenSSLライブラリが添付されており、これを利用すると簡単にAES暗号が使える |
暗号化 | 暗号化 | ||
```ruby | ```ruby | ||
+ | # | ||
# usage: | # usage: | ||
# ruby enc.rb plain_text password | # ruby enc.rb plain_text password | ||
+ | # | ||
require " | require " | ||
行 54: | 行 60: | ||
aes.encrypt | aes.encrypt | ||
- | key_iv | + | iv = OpenSSL::Random.random_bytes(aes.iv_len) |
- | aes.key = key_iv[0, aes.key_len] | + | aes.key = OpenSSL:: |
- | aes.iv = key_iv[aes.key_len, | + | aes.iv = iv |
# aes.auth_data = " | # aes.auth_data = " | ||
行 64: | 行 70: | ||
encrypted << aes.final | encrypted << aes.final | ||
- | puts [salt, encrypted, aes.auth_tag].map { |d| Base64.urlsafe_encode64(d, | + | |
+ | puts [salt, iv, encrypted, aes.auth_tag].map { |d| Base64.urlsafe_encode64(d, | ||
``` | ``` | ||
行 70: | 行 77: | ||
```ruby | ```ruby | ||
+ | # | ||
# usage: | # usage: | ||
# ruby dec.rb encrypted_text password | # ruby dec.rb encrypted_text password | ||
+ | # | ||
require " | require " | ||
require " | require " | ||
- | encrypted | + | data = ARGV[0] |
pass = ARGV[1] | pass = ARGV[1] | ||
- | salt, data, auth_tag = encrypted.split(" | + | salt, iv, encrypted, auth_tag = data.split(" |
aes = OpenSSL:: | aes = OpenSSL:: | ||
aes.decrypt | aes.decrypt | ||
- | + | aes.key | |
- | key_iv | + | aes.iv = iv |
- | + | aes.auth_tag | |
- | aes.key = key_iv[0, aes.key_len] | + | |
- | aes.iv = key_iv[aes.key_len, | + | |
# aes.auth_data = " | # aes.auth_data = " | ||
- | aes.auth_tag = auth_tag | ||
decrypted = "" | decrypted = "" | ||
- | decrypted << aes.update(data) | + | decrypted << aes.update(encrypted) |
decrypted << aes.final | decrypted << aes.final | ||
行 99: | 行 105: | ||
``` | ``` | ||
- | auth_tag, auth_dataはAES-256-GCM、AES-128-GCMアルゴリズムで使用するメッセージ認証(データ改竄の検出)を行うためのデータ。auth_dataはオプショナルなので未指定でも可(もし指定するならこれもランダムなデータが望ましい)。 | + | auth_tag, auth_dataはAES-256-GCM、AES-128-GCMアルゴリズムで使用するメッセージ認証(データ改竄の検出)を行うためのデータ。auth_dataはオプショナルなので未指定でも可。これらはメッセージ認証機能のないAES-256-CBCなどを選択した場合は設定できない。 |
- | + | ||
- | メッセージ認証機能のないAES-256-CBCなどでは設定できない。 | + | |
</ | </ |
aes.1659841323.txt.gz · 最終更新: 2022/08/07 03:02 by nullpon