セキュリティの勉強をしていると、秘密鍵と公開鍵、この鍵を利用した証明書の話がよく出てくるが、いまいちイメージがつきにくい。そこでポイントとなる秘密鍵と公開鍵の生成、ファイル出力させるサンプルを作成した。Powershellでは、RSAクラスを使うと簡単に実装が可能となる。
サンプルコード
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 |
# 共通 RSA オブジェクトを作成 $rsa = [System.Security.Cryptography.RSA]::Create() # 秘密鍵の生成 # RSA オブジェクトから、公開鍵を含むRSA パラメータ(RSAParameters 構造体)を生成する。 $parameters = $rsa.ExportParameters($true) # 秘密鍵をバイト配列に変換 #$parameters には、秘密鍵や公開鍵のパラメータが含まれるが、うちDが、秘密鍵のパラメータ #秘密鍵はバイト配列として保存される必要があるため # 1、[Convert]::ToBase64String($parameters.D) によってバイト配列を Base64 文字列に変換し # 2、[System.Text.Encoding]::ASCII.GetBytes() によって、Base64 文字列を ASCII コードでエンコードし # 3、バイト配列に変換し格納している。 $privateKeyBytes = [System.Text.Encoding]::ASCII.GetBytes([Convert]::ToBase64String($parameters.D)) # バイト配列とした秘密鍵をファイルに書き込む Set-Content -Path "privateKey.txt" -Value $privateKeyBytes -Encoding Byte # 秘密鍵をファイルに書き込む(xml形式) Set-Content -Path "privateKey.xml" -Value $rsa.ToXmlString($true) # 秘密鍵の生成 # 公開鍵のみのRSA パラメータ(RSAParameters 構造体)を生成する。 $publicKeyParameters = $rsa.ExportParameters($false) # 公開鍵をバイト配列に変換 #RSA暗号において公開鍵はModulusとExponentの2つのパラメータで構成される。 #Modulusは公開鍵暗号化に使われる数であり、ExponentはModulusに関する指数 #これら2つのパラメータを # 1、[Convert]::ToBase64String($parameters.・・・・) によってバイト配列を Base64 文字列に変換し # 2、[System.Text.Encoding]::ASCII.GetBytes() によって、Base64 文字列を ASCII コードでエンコードし # 3、バイト配列に変換し格納している。 $publicKeyBytes = [System.Text.Encoding]::ASCII.GetBytes([Convert]::ToBase64String($publicKeyParameters.Modulus) + "," + [Convert]::ToBase64String($publicKeyParameters.Exponent)) # 公開鍵をファイルに書き込む(Modulus,Exponent の順) Set-Content -Path "publicKey.txt" -Value $publicKeyBytes -Encoding Byte # 公開鍵をファイルに書き込む(xml形式) Set-Content -Path "publicKey.xml" -Value $rsa.ToXmlString($false) |
参考サイト
RSAParameters構造体について
RSAParameters 構造体 (System.Security.Cryptography) | Microsoft Learn
構造体のフィールドを抜粋
D | RSA アルゴリズムの D パラメーターを表します。 |
DP | RSA アルゴリズムの DP パラメーターを表します。 |
DQ | RSA アルゴリズムの DQ パラメーターを表します。 |
Exponent | RSA アルゴリズムの Exponent パラメーターを表します。 |
InverseQ | RSA アルゴリズムの InverseQ パラメーターを表します。 |
Modulus | RSA アルゴリズムの Modulus パラメーターを表します。 |
P | RSA アルゴリズムの P パラメーターを表します。 |
Q | RSA アルゴリズムの Q パラメーターを表します。 |
xml形式出力での仕様
RSA.ToXmlString(Boolean) メソッド (System.Security.Cryptography) | Microsoft Learn
ToXmlStringにtrue(公開鍵および秘密鍵を含める場合)を指定すると
、結果の XML 文字列は次の形式になる。
1 2 3 4 5 6 7 8 9 10 |
<RSAKeyValue> <Modulus>…</Modulus> <Exponent>…</Exponent> <P>…</P> <Q>…</Q> <DP>…</DP> <DQ>…</DQ> <InverseQ>…</InverseQ> <D>…</D> </RSAKeyValue> |
ToXmlStringにfalse(公開鍵)
を指定すると、結果の XML 文字列は次の形式になる。
1 2 3 4 |
<RSAKeyValue> <Modulus>…</Modulus> <Exponent>…</Exponent> </RSAKeyValue> |
コメント