PowerShellを使ってAES-256でデータを暗号化し、Base64文字列として出力するスクリプトをご紹介します。
併せて、暗号化された文字列を復号化するスクリプトについても記載しています。
はじめに
PowerShellを使ってAES-256でデータを暗号化する方法を解説します。
そのままではバイナリデータとなってしまうため、テキストとして扱いやすいBase64形式への変換も行っています。
また、初期化ベクトル(IV [Initialization Vector])を毎回ランダムに生成し、暗号文の先頭に付与してBase64変換しているため、同じ平文でも暗号化ごとに異なる結果が得られるようにしています。
復号化では、Base64文字列をバイナリに戻し、先頭の16バイトをIVとして抽出、残りを暗号文として扱います。
鍵(Key)とIVが一致することで、元の平文を正確に復元できます。
暗号化スクリプト
# 暗号化に使用する共通鍵(32バイト)をバイト配列に変換
$key = [System.Text.Encoding]::UTF8.GetBytes("MySecretKey123456789012345678901")
# AES暗号化機能のインスタンス(初期化)を作成
$aes = [System.Security.Cryptography.Aes]::Create()
# 作成したインスタンスに共通鍵を設定
$aes.Key = $key
# IV(初期化ベクトル:暗号文のランダム性を高める値)を生成
$aes.GenerateIV()
# 「鍵」と「IV」を元に、暗号化を実行するオブジェクトを生成
$encryptor = $aes.CreateEncryptor()
# 暗号化したい文字列をUTF-8のバイト配列に変換
$plain = [System.Text.Encoding]::UTF8.GetBytes("暗号化したい文字列")
# データの暗号化を実行(バイト配列の暗号文が生成される)
$cipher = $encryptor.TransformFinalBlock($plain, 0, $plain.Length)
# 「IV(16バイト)」と「暗号文」を結合し、Base64文字列に変換して出力
[Convert]::ToBase64String($aes.IV + $cipher)復号化スクリプト
# 暗号化時と同じ共通鍵(32バイト)をバイト配列に変換
$key = [System.Text.Encoding]::UTF8.GetBytes("MySecretKey123456789012345678901")
# 暗号化された文字列(復号化したい文字列)
$encryptedBase64 = "8ugIiTBs2o0FTgHnHPqIp6MDabxvhBiont93UwDR+5G/yXhyHOV/gUbSr/e6P3LE"
# Base64からバイト配列に戻す
$combinedBytes = [Convert]::FromBase64String($encryptedBase64)
# IV(先頭16バイト)と残りを分割
$iv = $combinedBytes[0..15]
$cipher = $combinedBytes[16..($combinedBytes.Length - 1)]
# インスタンスの生成とIVのセット、復号化を実行
$aes = [System.Security.Cryptography.Aes]::Create()
$aes.Key = $key
$aes.IV = $iv
$decryptedBytes = $aes.CreateDecryptor().TransformFinalBlock($cipher, 0, $cipher.Length)
# 復号化した文字列を出力
$decryptedText = [System.Text.Encoding]::UTF8.GetString($decryptedBytes)
[Console]::Out.WriteLine($decryptedText)実装時の注意点
スクリプトを運用する際は、以下の点に注意が必要です。
- 鍵の管理:今回の例ではハードコードされていますが、本番環境では望ましくありません。
- 鍵の長さ:AES-256を使用する場合、鍵は32バイト(256ビット)である必要があります。
- IVの扱い:IVは秘密にする必要はありませんが、復号化時には必須です。今回のように暗号文の先頭に付与するのが一般的なようです。
リンク



コメント