Home >
Windows にまつわる e.t.c.
AES 256 の PowerShell 実装
.NET で AES がサポートされているので、PowerShell での AES 256 関数書いてみました
鍵サイズは 256bit (32byte) です。
AES(CBC Mode) は IV が必要なので、暗号化文字列の先頭に IV 足しています。
##################################################
# AES 暗号化
##################################################
function AESEncrypto($Key, $PlainString){
$KeySize = 256
$BlockSize = 128
$Mode = "CBC"
$Padding = "PKCS7"
if( $Key.Length * 8 -ne $KeySize ){
echo "Key size error"
return $null
}
# 平文をバイト配列にする
$ByteString = [System.Text.Encoding]::UTF8.GetBytes($PlainString)
# 鍵をバイト配列にする
$ByteKey = [System.Text.Encoding]::UTF8.GetBytes($Key)
# アセンブリロード
Add-Type -AssemblyName System.Security
# AES オブジェクトの生成
$AES = New-Object System.Security.Cryptography.AesCryptoServiceProvider
# 各値セット
$AES.KeySize = $KeySize
$AES.BlockSize = $BlockSize
$AES.Mode = $Mode
$AES.Padding = $Padding
# IV 生成
$AES.GenerateIV()
# 生成した IV
$IV = $AES.IV
# 鍵セット
$AES.Key = $ByteKey
# 暗号化オブジェクト生成
$Encryptor = $AES.CreateEncryptor()
# 暗号化
$EncryptoByte = $Encryptor.TransformFinalBlock($ByteString, 0, $ByteString.Length)
# IV と暗号化した文字列を結合
$DataByte = $IV + $EncryptoByte
# 暗号化した文字列
$EncryptoString = [System.Convert]::ToBase64String($DataByte)
# オブジェクト削除
$Encryptor.Dispose()
$AES.Dispose()
return $EncryptoString
}
|
##################################################
# AES 復号化
##################################################
function AESDecrypto($Key, $EncryptoString){
$KeySize = 256
$BlockSize = 128
$IVSize = $BlockSize / 8
$Mode = "CBC"
$Padding = "PKCS7"
if( $Key.Length * 8 -ne $KeySize ){
echo "Key size error"
return $null
}
# 暗号文をバイト配列にする
$ByteString = [System.Convert]::FromBase64String($EncryptoString)
# 鍵をバイト配列にする
$ByteKey = [System.Text.Encoding]::UTF8.GetBytes($Key)
# IV を取り出す
$IV = @()
for( $i = 0; $i -lt $IVSize; $i++){
$IV += $ByteString[$i]
}
# アセンブリロード
Add-Type -AssemblyName System.Security
# オブジェクトの生成
$AES = New-Object System.Security.Cryptography.AesCryptoServiceProvider
# 各値セット
$AES.KeySize = $KeySize
$AES.BlockSize = $BlockSize
$AES.Mode = $Mode
$AES.Padding = $Padding
# IV セット
$AES.IV = $IV
# 鍵セット
$AES.Key = $ByteKey
# 復号化オブジェクト生成
$Decryptor = $AES.CreateDecryptor()
# 復号化
$DecryptoByte = $Decryptor.TransformFinalBlock($ByteString, $IVSize, $ByteString.Length - $IVSize)
# 平文にする
$PlainString = [System.Text.Encoding]::UTF8.GetString($DecryptoByte)
# オブジェクト削除
$Decryptor.Dispose()
$AES.Dispose()
return $PlainString
}
|
PowerShell プロンプトに関数コピペして使うのなら、こんな感じです
PS C:\> #
鍵 PS C:\>
$Key
=
")$E)>Kd_[>j8ESZ7:Jt|:I-Hb}|@.}[9"
PS C:\>
PS C:\> # 暗号化
PS C:\>
$EncryptoString
=
AESEncrypto
$key
"TestData"
PS C:\>
$EncryptoString
M0+q1gdDM0OFLs4LXb17U9SaO082dLo95JvGSIKwGq8=
PS C:\>
PS C:\> # 復号化
PS C:\>
AESDecrypto
$Key
$EncryptoString
TestData
PS C:\> |
鍵は手で書いても良いのですが、ランダム文字列で鍵作るのならこんな関数があると便利です。
PowerShell で指定サイズのランダムな文字列/バイナリ列を生成する
http://www.vwnet.jp/Windows/PowerShell/CreateRandomData.htm
運用実装の場合
運用実装で使う場合は、バイト配列でハンドリングするのがセオリーなので、こんな感じの関数を使うことになります
##################################################
# AES 暗号化
##################################################
function AESEncrypto($ByteKey, $BytePlain){
# AES 定数
$AES_KeySize = 256
$AES_BlockSize = 128
$AES_IVSize = $AES_BlockSize / 8
$AES_Mode = "CBC"
$AES_Padding = "PKCS7"
# 鍵長チェック
if( $ByteKey.Length * 8 -ne $AES_KeySize ){
echo "[FAIL] Key size error"
return $null
}
# アセンブリロード
Add-Type -AssemblyName System.Security
# AES オブジェクトの生成
$AES = New-Object System.Security.Cryptography.AesCryptoServiceProvider
# 各値セット
$AES.KeySize = $AES_KeySize
$AES.BlockSize = $AES_BlockSize
$AES.Mode = $AES_Mode
$AES.Padding = $AES_Padding
# IV 生成
$AES.GenerateIV()
# 生成した IV
$IV = $AES.IV
# 鍵セット
$AES.Key = $ByteKey
# 暗号化オブジェクト生成
$Encryptor = $AES.CreateEncryptor()
# 暗号化
$EncryptoByte = $Encryptor.TransformFinalBlock($BytePlain, 0, $BytePlain.Length)
# IV と暗号化した文字列を結合
$DataByte = $IV + $EncryptoByte
# オブジェクト削除
$Encryptor.Dispose()
$AES.Dispose()
return $DataByte
}
##################################################
# AES 復号化
##################################################
function AESDecrypto($ByteKey, $ByteEncrypto){
# AES 定数
$AES_KeySize = 256
$AES_BlockSize = 128
$AES_IVSize = $AES_BlockSize / 8
$AES_Mode = "CBC"
$AES_Padding = "PKCS7"
# 鍵長チェック
if( $ByteKey.Length * 8 -ne $AES_KeySize ){
echo "[FAIL] Key size error"
return $null
}
# IV を取り出す
$IV = @()
for( $i = 0; $i -lt $AES_IVSize; $i++){
$IV += $ByteEncrypto[$i]
}
# アセンブリロード
Add-Type -AssemblyName System.Security
# オブジェクトの生成
$AES = New-Object System.Security.Cryptography.AesCryptoServiceProvider
# 各値セット
$AES.KeySize = $AES_KeySize
$AES.BlockSize = $AES_BlockSize
$AES.Mode = $AES_Mode
$AES.Padding = $AES_Padding
# IV セット
$AES.IV = $IV
# 鍵セット
$AES.Key = $ByteKey
# 復号化オブジェクト生成
$Decryptor = $AES.CreateDecryptor()
try{
# 復号化
$DecryptoByte = $Decryptor.TransformFinalBlock($ByteEncrypto, $AES_IVSize, $ByteEncrypto.Length - $AES_IVSize)
}
catch{
$DecryptoByte = $null
}
# オブジェクト削除
$Decryptor.Dispose()
$AES.Dispose()
return $DecryptoByte
}
|
関連情報
SHA-2(SHA256) の PowerShell 実装
http://www.vwnet.jp/Windows/PowerShell/SHA256.htm
RSA 公開鍵暗号の PowerShell 実装
http://www.vwnet.jp/Windows/PowerShell/RSACrypto.htm
RSA 電子署名(SHA256)の PowerShell 実装
http://www.vwnet.jp/Windows/PowerShell/RSASignature.htm
HMAC(SHA256) の PowerShell 実装
http://www.vwnet.jp/Windows/PowerShell/HMAC-SHA256.htm
スケジュールジョブ(PowerShell)でパスワードをセキュアに使う(証明書編)
http://www.vwnet.jp/Windows/WS12R2/Password/CertPassword.htm
PowerShell でファイルの AES256 暗号/復号
http://www.vwnet.jp/Windows/PowerShell/2017103101/AES256byPowerShell.htm
Copyright © a href="mailto:mura+web@vwnet.jp">MURA
All rights reserved.