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

PowerShell で公開鍵方式暗号ファイルを交換をする


暗号化したファイルをメールに添付して、「パスワードは別メールで送ります」といったやりとを見たことはありませんか?

もし、間違った相手に暗号化した機密情報ファイルとパスワードを送ってしまうと重大インシデントになってしまいます。

あるいは、悪意ある第三者が受信者の通信を傍受していれば、暗号化したファイルとパスワードのセットを手に入れることができます。

パスワードを別メールで送るのは、セキュリティ的にあまり意味の無い社会慣習だと言ってもいいでしょう。

この問題を解決するのが「公開鍵方式暗号」なのです。

 

スクリプトの特徴

・ 復号用のパスワードを送る必要がありません(公開鍵を一度だけ交換)

・ 指定した受信者以外が復号できないので誤送信リスクが大幅低減できます

・ 復号時に電子署名確認するので、なりすましと改ざんが検出ができます

・ Windows 標準機能だけを使っているので、.exe のインストールや実行する必要がありません

・ スクリプトなので、どんな処理をしているか全て確認できます

・ PowerShell なので、オプションやファイル名は TAB 補完で簡単に指定できます

 

ダウンロードとインストール

以下スクリプトを PowerShell プロンプトにコピペして下さい。

C:\PSCrypto に PSCrypto.zip がダウンロードされます。

if( -not (Test-Path C:\PSCrypto)){ md C:\PSCrypto }
Invoke-WebRequest "https://github.com/MuraAtVwnet/PSCrypto/archive/master.zip" -Outfile "C:\PSCrypto\PSCrypto.zip"
cd C:\PSCrypto
ii C:\PSCrypto

 

ダウンロードしたファイルを展開し、適当なフォルダー(C:\PSCrypto がおすすめ)にファイルをコピーします。
(説明は C:\PSCrypto にコピーしている前提で書いています)

 

使い方

PowerShell プロンプトを開く

PowerShell プロンプトを開くには、スタートメニューを開いた状態で power と入力すると、「Windows PowerShell」が表示されるので、これを選択します。

 

PowerShell プロンプトを開いたら、タスクバーに表示されてた PowerShell のアイコン を右クリックしてタスクバーにピン止めしておくと良いでしょう。

 

スクリプト実行を許可する

Windows Client のデフォルトは .ps1 スクリプトの実行が許可されていません。

スクリプト実行を許可するには、以下スクリプトを PowerShell プロンプトにコピペしてくだい。
(管理権限で Set-ExecutionPolicy RemoteSigned -Force を実行します)

if((Get-ExecutionPolicy) -eq "Restricted"){Start-Process powershell -Verb runas -ArgumentList "-NonInteractive -Command `"Set-ExecutionPolicy RemoteSigned -Force`""}

 

鍵ペア作成

公開鍵方式暗号を使用する場合は、公開鍵と秘密鍵のペアを作成し、メール添付等で公開鍵を相手に渡します。
秘密鍵はコンピューター内に保管されるのでファイルとして出力はされません。

.\PSCrypto.ps1 -Mode CreateKey と入力すると、エクスプローラーが開き公開鍵が表示されます。

PS C:\PSCrypto> .\PSCrypto.ps1 -Mode CreateKey
Public Key: C:\PSCrypto\PublicKeys\mura_PublicKey.xml

 

相手にも鍵ペアを作ってもらい、公開鍵を送ってもらいます。

 

暗号化

暗号化は、受信者の公開鍵を指定してファイルを暗号化します。

.\PSCrypto.ps1 -Mode Encrypto -PublicKeys [相手の公開鍵] -Path [暗号化するファイル]

PS C:\PSCrypto> .\PSCrypto.ps1 -Mode Encrypto -PublicKeys .\PublicKeys\his_PublicKey.xml -Path C:\Temp\Secret.zip
Encrypto C:\Temp\Secret.enc

 

暗号化ファイル( .enc )は元のファイルと同じフォルダーに出力されるので、メール添付等で相手に送ります。

 

復号化

復号化はコンピューター内に保管されている自分の秘密鍵で復号します。

復号時に送信者の公開鍵を指定すると、電子署名確認をし改ざんやなりすましを検出することができます。

.\PSCrypto.ps1 -Mode Decrypto -PublicKeys [送信者の公開鍵] -Path [暗号化ファイル]

PS C:\PSCrypto> .\PSCrypto.ps1 -Mode Decrypto -PublicKeys .\PublicKeys\mura_PublicKey.xml -Path C:\Temp\Secret.enc
Decrypto C:\Temp\Secret.zip

 

復号したファイルは、暗号化ファイル( .enc )と元のファイルと同じフォルダーに出力されます。

 

省略形

暗号/復号の時は -Mode 指定と、-Path、 -PublicKeys のオプション名指定を省略できます(Mode はファイルの拡張子で判断)

暗号省略形

PS C:\PSCrypto> .\PSCrypto.ps1 暗号化するファイル 受信者の公開鍵

 

復号省略形

PS C:\PSCrypto> .\PSCrypto.ps1 復号化するファイル [送信者の公開鍵]

(送信者の公開鍵を省略すると、署名チェックをしません)

 

TAB 補完以外のファイル名指定方法

ファイル名を TAB 補完を使わずに指定する場合は、エクスプローラーを開きシフトキーを押しながら目的のファイルをマウス右クリックします。

右クリックメニューに表示される「パスのコピー(A)」でファイルのフルパスがクリップポートに取り込まれます。

この状態で PowerShell プロンプトでマウス右クリックするとファイル名をペーストできます。

 

必要環境

Windows 8 以降または PowerShell 3.0 以降をインストールした Windows 7 SP1

(Windows Vista も PowerShell 3.0 以降をインストールすれば動くはずですが、動作確認していません)

 

Windows 7 の場合は、以下のスクリプトを PowerShell プロンプトにコピペすると動作可否が確認できます。

##########################################################
# 動作可能可否の確認
##########################################################
# レジストリ読み取り
function RegGet( $RegPath, $RegKey ){
    # レジストリそのものの有無確認
    if( -not (Test-Path $RegPath )){
        return $null
    }

    # Key有無確認
    $Result = Get-ItemProperty $RegPath -name $RegKey -ErrorAction SilentlyContinue
    # キーがあった時
    if( $Result -ne $null ){
        return $Result.$RegKey
    }
    # キーが無かった時
    else{
        return $null
    }
}

# main
# PowerShell バージョン確認
$Vertion = $PSVersionTable
if( $Vertion.PSVersion.Major -ge 3 ){
    echo ""
    echo ""
    echo "This environment is good."
    echo ""
    echo ""
}
else{
    # .NET Framework バージョン確認
    $RootReg = "HKLM:\SOFTWARE\Microsoft\NET Framework Setup\NDP"
    $Datas = dir $RootReg

    $IsNet4Installed = $false
    foreach( $Data in $Datas ){
        $Terget = $Data.Name
        $Terget = $Terget -replace "HKEY_LOCAL_MACHINE", "HKLM:"
        if( (Split-Path $terget -Leaf) -eq "v4" ){
            # .NET Framework 4 以降が入っている
            echo ""
            echo ""
            echo ".NET Framework vertion is ok. Please install PowerShell 3.0 or above."
            echo ""
            echo "Download Windows Management Framework 5.0(PowerShell 5.0)"
            echo "https://www.microsoft.com/en-us/download/details.aspx?id=50395"
            echo ""
            echo ""
            $IsNet4Installed = $true
        }
    }
    if( $IsNet4Installed -eq $false ){
        # .NET Framework 4 以降が入っていない
        echo ""
        echo ""
        echo ".NET Framework and PowerShell vertion was NG. Please install .NET Framework 4.5.2 and PowerShell 3.0 or above."
        echo ""
        echo "Microsoft .NET Framework 4.6.1 (Online Installer)"
        echo "https://www.microsoft.com/ja-jp/download/details.aspx?id=49982"
        echo ""
        echo "Download Windows Management Framework 5.0(PowerShell 5.0)"
        echo "https://www.microsoft.com/en-us/download/details.aspx?id=50395"
        echo ""
        echo ""
    }
}

 

FAQ

公開鍵方式ってなに?

公開鍵と秘密鍵の鍵ペアを使用した暗号/復号の仕組みです。

公開鍵で暗号化したデーターは、秘密鍵でしか復号できません。

データーを受け取る人の公開鍵で暗号化すると、秘密鍵を持っている受取人以外が復号することができなくなります。

復号のためのパスワードを送る必要もありませんし、目的の相手以外が復号できないので安全なデーター授受がてきます。

 

コードが見えちゃっているけど安全なの?

暗号/復号/ハッシュなどのコアとなる処理は、.NET Framework(Windows のライブラリー)が担っており、コード(PowerShell)では処理していないので問題ありません。

 

暗号アルゴリズムを公開しているけど安全なの?

使用しているアルゴリズムは、強力な暗号として FIPS で認定されているアルゴリズムです。
この認定は、多くの暗号学者による暗号アルゴリズム攻撃に耐えて、鍵を探り当てる以外の方法で復号出来なかった事実が前提条件になっています。

使用している暗号鍵の長さは 256 ビット(1.15x10の77乗)なので、毎秒1億の鍵を試すことができる性能を持ったコンピューターで総当たり解析をした場合に 5x10の67乗秒(1.6x10の60乗年)かかる計算になるので、現実的に復号は不可能なので安全です。

 

公開鍵が漏えいしても大丈夫なの?

公開鍵はその名の通り公開されるものなので、漏えいしても問題ありません。

公開鍵から秘密鍵を推測することは数学的にできないようになっています。

 

使用しているアルゴリズム

暗号/復号/ハッシュ

RSA 公開鍵暗号
AES 256
SHA 256

電子署名

RSA 電子証明(SHA256)

 

更新履歴

0.10 2016/06/01 プロトタイプ完成
0.20 2016/06/05 Beta 1
0.30 2016/06/09 RC 1
0.31 2016/06/12 RC 2
2.00 2017/12/27 処理効率化と暗号データフォーマット変更
2.01 2017/12/29 細々と改良/エクスポートフォルダ場所変更
2.02 2107/12/31 Export/Import/Test フォルダを任意指定できるようにした

 

リポジトリ

以下リポジトリで開発していますので、必要に応じて Clone してください

git@github.com:MuraAtVwnet/PSCrypto.git
https://github.com/MuraAtVwnet/PSCrypto.git

 

フィードバック

フィードバックは、こちらにメールでお願いします。

mura+PSCrypto@vwnet.jp

 

関連情報

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

PowerShell で指定サイズのランダムな文字列/バイナリ列を生成する
http://www.vwnet.jp/Windows/PowerShell/CreateRandomData.htm

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

PowerShell スクリプト引数(Param)の Tips
http://www.vwnet.jp/Windows/PowerShell/Param.htm

 

 

back.gif (1980 バイト)

home.gif (1907 バイト)

Copyright © MURA All rights reserved.