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

 

 

back.gif (1980 バイト)

home.gif (1907 バイト)

Copyright © a href="mailto:mura+web@vwnet.jp">MURA All rights reserved.