読者です 読者をやめる 読者になる 読者になる

qshinoの日記

Powershell関係と徒然なこと

powershell 証明書復号

高梨さんblogから。

 

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

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

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

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

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

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

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

imageimageimageimageimageimage

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

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

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

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

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

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

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

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

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

##ユーザーストアのMyから証明書を取得
$Cert = get-item cert:CurrentUserMY$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を使用してもできることも知っておくと何かと便利です