Home > Windows にまつわる e.t.c.

RSA 電子署名(SHA256)の PowerShell 実装


PowerShell で RSA 電子署名実装を書いてみました

##################################################
#  鍵を作成し CSP キーコンテナに保存
##################################################
function RSACreateKeyCSP($ContainerName){
    # アセンブリロード
    Add-Type -AssemblyName System.Security

    # CspParameters オブジェクト作成
    $CSPParam = New-Object System.Security.Cryptography.CspParameters

    # マシンストアを使用する(デフォルトはユーザーストア。これを有効にするとマシンストアが使用される)
    # $CSPParam.Flags = [System.Security.Cryptography.CspProviderFlags]::UseMachineKeyStore

    # CSP キーコンテナ名
    $CSPParam.KeyContainerName = $ContainerName

    # RSACryptoServiceProviderオブジェクト作成し秘密鍵を格納
    $RSA = New-Object System.Security.Cryptography.RSACryptoServiceProvider($CSPParam)

    # 公開鍵
    $PublicKey = $RSA.ToXmlString($False)

    # オブジェクト削除
    $RSA.Dispose()

    return $PublicKey
}

 

#####################################################################
# CSP キーコンテナに保存されている秘密鍵を使って署名を作る
#####################################################################
function RSASignatureCSP($ContainerName, $BaseString){
    # アセンブリロード
    Add-Type -AssemblyName System.Security

    # バイト配列にする
    $BaseByte = [System.Text.Encoding]::UTF8.GetBytes($BaseString)

    # SHA256 オブジェクトの生成
    $SHA256 = New-Object System.Security.Cryptography.SHA256CryptoServiceProvider

    # SHA256 Hash 値を求める
    $HashBytes = $SHA256.ComputeHash($BaseByte)

    # SHA256 オブジェクトの破棄
    $SHA256.Dispose()

    # CspParameters オブジェクト作成
    $CSPParam = New-Object System.Security.Cryptography.CspParameters

    # マシンストアを使用する(デフォルトはユーザーストア。これを有効にするとマシンストアが使用される)
    # $CSPParam.Flags = [System.Security.Cryptography.CspProviderFlags]::UseMachineKeyStore

    # CSP キーコンテナ名
    $CSPParam.KeyContainerName = $ContainerName

    # RSACryptoServiceProviderオブジェクト作成し秘密鍵を取り出す
    $RSA = New-Object System.Security.Cryptography.RSACryptoServiceProvider($CSPParam)

    # RSAPKCS1SignatureFormatterオブジェクト作成
    $Formatter = New-Object System.Security.Cryptography.RSAPKCS1SignatureFormatter($RSA)

    # ハッシュアルゴリズムを指定
    $Formatter.SetHashAlgorithm("SHA256")

    # 署名を作成
    $SignatureByte = $Formatter.CreateSignature($HashBytes)

    # 文字列にする
    $SignatureString = [System.Convert]::ToBase64String($SignatureByte)

    # オブジェクト削除
    $RSA.Dispose()

    return $SignatureString
}

 

#####################################################################
# 公開鍵を使って署名を確認する
#####################################################################
function RSAVerifySignature($PublicKey, $SignatureString, $BaseString){

    # アセンブリロード
    Add-Type -AssemblyName System.Security

    # 署名をバイト配列にする
    $SignatureByte = [System.Convert]::FromBase64String($SignatureString)

    # 確認する文字列をバイト配列にする
    $BaseByte = [System.Text.Encoding]::UTF8.GetBytes($BaseString)

    # SHA256 オブジェクトの生成
    $SHA256 = New-Object System.Security.Cryptography.SHA256CryptoServiceProvider

    # SHA256 Hash 値を求める
    $HashBytes = $SHA256.ComputeHash($BaseByte)

    # SHA256 オブジェクトの破棄
    $SHA256.Dispose()

    # RSACryptoServiceProviderオブジェクト作成
    $RSA = New-Object System.Security.Cryptography.RSACryptoServiceProvider

    # 公開鍵をセット
    $RSA.FromXmlString($PublicKey)

    # RSAPKCS1SignatureDeformatterオブジェクト作成
    $Deformatter = New-Object System.Security.Cryptography.RSAPKCS1SignatureDeformatter($RSA)

    # ハッシュアルゴリズムを指定
    $Deformatter.SetHashAlgorithm("SHA256")

    # 署名を検証する
    $Result = $Deformatter.VerifySignature($HashBytes, $SignatureByte)

    # オブジェクト削除
    $RSA.Dispose()

    return $Result
}

 

こんな感じで使います

# CSP キーコンテナ名
$ContainerName = "MuraTest"

# 署名する文字列
$BaseString = "ABCDefgh"

# 鍵ペアの作成
$PublicKey = RSACreateKeyCSP $ContainerName

# 署名作成
$SignatureString = RSASignatureCSP $ContainerName $BaseString

# 署名検証(OK なら $true、NG なら $false が返る)
$Result = RSAVerifySignature $PublicKey $SignatureString $BaseString

 

CSP キーコンテナの管理は「RSA 公開鍵暗号の PowerShell 実装」を見てください。

http://www.vwnet.jp/Windows/PowerShell/RSACrypto.htm

 

関連情報

AES 256 の PowerShell 実装
http://www.vwnet.jp/Windows/PowerShell/AES.htm

SHA-2(SHA256) の PowerShell 実装
http://www.vwnet.jp/Windows/PowerShell/SHA256.htm

RSA 公開鍵暗号の PowerShell 実装
http://www.vwnet.jp/Windows/PowerShell/RSACrypto.htm

HMAC(SHA256) の PowerShell 実装
http://www.vwnet.jp/Windows/PowerShell/HMAC-SHA256.htm

スケジュールジョブ(PowerShell)でパスワードをセキュアに使う(証明書編)
http://www.vwnet.jp/Windows/WS12R2/Password/CertPassword.htm

PowerShell で公開鍵方式暗号ファイルを交換をする
http://www.vwnet.jp/Windows/PowerShell/PublicKeyCrypto.htm

 

 

back.gif (1980 バイト)

home.gif (1907 バイト)

Copyright © MURA All rights reserved.