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
Copyright © MURA
All rights reserved.