aes
差分
このページの2つのバージョン間の差分を表示します。
| 両方とも前のリビジョン前のリビジョン次のリビジョン | 前のリビジョン | ||
| aes [2022/08/08 02:00] – nullpon | aes [2022/08/31 09:46] (現在) – nullpon | ||
|---|---|---|---|
| 行 25: | 行 25: | ||
| - [暗号利用モード - Wikipedia](https:// | - [暗号利用モード - Wikipedia](https:// | ||
| - | * cbc | + | 鍵よりも長いメッセージを暗号化する方式のこと。代表的なものを挙げる |
| - | * ecb | + | |
| - | * gcm | + | * ECB (非推奨) |
| + | * CBC | ||
| + | * CTR | ||
| + | * GCM | ||
| + | |||
| + | ECBはブロック長ごとに同じ鍵でxorを取るというシンプルだが非常に脆弱な方式なので使用を避けるべき(ただし他の方式も初期化ベクトルを使い回すなどすると脆弱になるので注意) | ||
| + | |||
| + | CBC、CTRは今日よく使われている方式 | ||
| + | |||
| + | GCMは暗号化に加えてメッセージ認証(改ざん検知)機能も併せ持っている。TLS v1.3で利用できるAES暗号は全てGCMである | ||
| ## コード例 | ## コード例 | ||
| 行 36: | 行 45: | ||
| ```ruby | ```ruby | ||
| + | # | ||
| # usage: | # usage: | ||
| # ruby enc.rb plain_text password | # ruby enc.rb plain_text password | ||
| + | # | ||
| require " | require " | ||
| 行 49: | 行 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 = " | ||
| 行 59: | 行 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, | ||
| ``` | ``` | ||
| 行 65: | 行 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 | ||
| 行 94: | 行 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などでは設定できない。 | + | |
| </ | </ | ||
| - | n> | ||
aes.1659924037.txt.gz · 最終更新: by nullpon