【PowerShell】証明書を使用して暗号化したパスワードを復号する

※ この投稿は PowerShell Advent Calendar 2011 に参加しています。

前回以下の投稿をしました。

【PowerShell】証明書を使用してパスワードを暗号化する

前回の投稿では、自己署名証明書を作成し、その証明書を使ってパスワードを暗号化しました。

今回は、前回暗号化したパスワードを証明書を使用して復号してみます。

前回は、makecert コマンドで作成した証明書の公開キーによってパスワードを暗号化しました。

今回は復号化する必要があるので、相手側には秘密キーを保持しておいてもらう必要があります。

※なんか順番が逆ですが、今回はひとまず気にせず...

秘密キーを含んだ証明書をエクスポートする方法はおなじみですね。画面遷移を以下に示します。

imageimageimageimageimageimage

せっかくなので、PowerShell を使用して秘密キー付証明書(.pfx)をエクスポートする方法も紹介しておきましょう。赤字の部分にはパスワードを入力してください。

$thumbprint = "13B97E99532151A1FC2617636CB04FE07C43C6C2" $Cert = get-item cert:\CurrentUser\MY\$thumbprint $bytes = $Cert.Export("Pfx","P@ssw0rd") [System.IO.File]::WriteAllBytes("c:\tmp\EncPassword.pfx", $bytes)

上記では Thumbprint を使用して証明書を取得していますが、以下のように証明書のファイル名を指定することも可能です。

$Cert = New-Object System.Security.Cryptography.X509Certificates.X509Certificate2("c:\tmp\EncPassword.cer") $bytes = $Cert.Export("Pfx","P@ssw0rd") [System.IO.File]::WriteAllBytes("c:\tmp\EncPassword.pfx", $bytes)

作成された証明書( .pfx)は、相手方(復号する側)の PC にインストールされていなければなりません。

証明書で暗号化した文字列を復号するには、以下のようなスクリプトを使用します。

## 暗号化や復号化に必要な System.Security アセンブリを読み込む Add-type –AssemblyName System.Security

##暗号化したパスワードのBase64文字列 $Password = "MIIBlQYJKoZIhvcNAQcDoIIBhjCCAYICAQAxggFGMIIBQgIBADAqMBYxFD.....(略)

##証明書の拇印(Thumbprint) $thumbprint = "13B97E99532151A1FC2617636CB04FE07C43C6C2"

##ユーザーストアのMyから証明書を取得 $Cert = get-item cert:\CurrentUser\MY\$thumbprint

##Base64でエンコードされたパスワードをデコードし、証明書を使って復号化(Decrypt) $env = new-object Security.Cryptography.Pkcs.EnvelopedCms $env.Decode([Convert]::FromBase64String( $Password )) $env.Decrypt( $Cert )

##バイト型からストリング型に変換 [Text.Encoding]::UTF8.GetString($env.ContentInfo.Content)

どうでしょう?うまくデコードできましたか?

お互いに公開キーと秘密キーを持ち合うことで、公開キーで暗号化された文字列を秘密キーで復号することができます。昔から使われている手法ではありますが、あらためてPowerShellを使用してもできることも知っておくと何かと便利です。