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.