<p>セキュリティの勉強をしていると、秘密鍵と公開鍵、この鍵を利用した証明書の話がよく出てくるが、いまいちイメージがつきにくい。そこでポイントとなる秘密鍵と公開鍵の生成、ファイル出力させるサンプルを作成した。Powershellでは、RSAクラスを使うと簡単に実装が可能となる。</p>
<h4 class="wp-block-heading">サンプルコード</h4>
<pre class="wp-block-preformatted"># 共通 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)
</pre>
<h4 class="wp-block-heading">参考サイト</h4>
<p>RSAParameters構造体について</p>
<p><a href="https://learn.microsoft.com/ja-jp/dotnet/api/system.security.cryptography.rsaparameters?view=net-7.0" target="_blank" rel="noopener" title="">RSAParameters 構造体 (System.Security.Cryptography) | Microsoft Learn</a></p>
<h5 class="wp-block-heading" id="fields">構造体のフィールドを抜粋</h5>
<figure class="wp-block-table"><table><tbody><tr><td><a href="https://learn.microsoft.com/ja-jp/dotnet/api/system.security.cryptography.rsaparameters.d?view=net-7.0">D</a></td><td><a href="https://learn.microsoft.com/ja-jp/dotnet/api/system.security.cryptography.rsa?view=net-7.0">RSA</a> アルゴリズムの <code>D</code> パラメーターを表します。</td></tr><tr><td><a href="https://learn.microsoft.com/ja-jp/dotnet/api/system.security.cryptography.rsaparameters.dp?view=net-7.0">DP</a></td><td><a href="https://learn.microsoft.com/ja-jp/dotnet/api/system.security.cryptography.rsa?view=net-7.0">RSA</a> アルゴリズムの <code>DP</code> パラメーターを表します。</td></tr><tr><td><a href="https://learn.microsoft.com/ja-jp/dotnet/api/system.security.cryptography.rsaparameters.dq?view=net-7.0">DQ</a></td><td><a href="https://learn.microsoft.com/ja-jp/dotnet/api/system.security.cryptography.rsa?view=net-7.0">RSA</a> アルゴリズムの <code>DQ</code> パラメーターを表します。</td></tr><tr><td><a href="https://learn.microsoft.com/ja-jp/dotnet/api/system.security.cryptography.rsaparameters.exponent?view=net-7.0">Exponent</a></td><td><a href="https://learn.microsoft.com/ja-jp/dotnet/api/system.security.cryptography.rsa?view=net-7.0">RSA</a> アルゴリズムの <code>Exponent</code> パラメーターを表します。</td></tr><tr><td><a href="https://learn.microsoft.com/ja-jp/dotnet/api/system.security.cryptography.rsaparameters.inverseq?view=net-7.0">InverseQ</a></td><td><a href="https://learn.microsoft.com/ja-jp/dotnet/api/system.security.cryptography.rsa?view=net-7.0">RSA</a> アルゴリズムの <code>InverseQ</code> パラメーターを表します。</td></tr><tr><td><a href="https://learn.microsoft.com/ja-jp/dotnet/api/system.security.cryptography.rsaparameters.modulus?view=net-7.0">Modulus</a></td><td><a href="https://learn.microsoft.com/ja-jp/dotnet/api/system.security.cryptography.rsa?view=net-7.0">RSA</a> アルゴリズムの <code>Modulus</code> パラメーターを表します。</td></tr><tr><td><a href="https://learn.microsoft.com/ja-jp/dotnet/api/system.security.cryptography.rsaparameters.p?view=net-7.0">P</a></td><td><a href="https://learn.microsoft.com/ja-jp/dotnet/api/system.security.cryptography.rsa?view=net-7.0">RSA</a> アルゴリズムの <code>P</code> パラメーターを表します。</td></tr><tr><td><a href="https://learn.microsoft.com/ja-jp/dotnet/api/system.security.cryptography.rsaparameters.q?view=net-7.0">Q</a></td><td><a href="https://learn.microsoft.com/ja-jp/dotnet/api/system.security.cryptography.rsa?view=net-7.0">RSA</a> アルゴリズムの <code>Q</code> パラメーターを表します。</td></tr></tbody></table></figure>
<h5 class="wp-block-heading">xml形式出力での仕様</h5>
<p><a href="https://learn.microsoft.com/ja-jp/dotnet/api/system.security.cryptography.rsa.toxmlstring?view=net-7.0" target="_blank" rel="noopener" title="">RSA.ToXmlString(Boolean) メソッド (System.Security.Cryptography) | Microsoft Learn</a></p>
<p>ToXmlStringに<code>true(公開鍵および秘密鍵を含める場合)を指定すると</code>、結果の XML 文字列は次の形式になる。</p>
<pre class="EnlighterJSRAW" data-enlighter-language="xml" data-enlighter-theme="" data-enlighter-highlight="" data-enlighter-linenumbers="" data-enlighter-lineoffset="" data-enlighter-title="" data-enlighter-group=""><RSAKeyValue>
<Modulus>…</Modulus>
<Exponent>…</Exponent>
<P>…</P>
<Q>…</Q>
<DP>…</DP>
<DQ>…</DQ>
<InverseQ>…</InverseQ>
<D>…</D>
</RSAKeyValue>
</pre>
<p>ToXmlStringにfalse<code>(公開鍵)</code>を指定すると、結果の XML 文字列は次の形式になる。</p>
<pre class="EnlighterJSRAW" data-enlighter-language="xml" data-enlighter-theme="" data-enlighter-highlight="" data-enlighter-linenumbers="" data-enlighter-lineoffset="" data-enlighter-title="" data-enlighter-group=""><RSAKeyValue>
<Modulus>…</Modulus>
<Exponent>…</Exponent>
</RSAKeyValue> </pre>
セキュリティの勉強をしていると、秘密鍵と公開鍵、この鍵を利用した証明書の話がよく出てくるが、いまいちイメージがつきにくい。そこでポイントとなる秘密鍵と公開鍵の生成、ファイル出力させるサンプルを作成した。Powershellでは、RSAクラスを使うと簡単に実装が可能となる。
サンプルコード
# 共通 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
構造体のフィールドを抜粋
xml形式出力での仕様
RSA.ToXmlString(Boolean) メソッド (System.Security.Cryptography) | Microsoft Learn
ToXmlStringにtrue(公開鍵および秘密鍵を含める場合)を指定すると
、結果の XML 文字列は次の形式になる。
<RSAKeyValue>
<Modulus>…</Modulus>
<Exponent>…</Exponent>
<P>…</P>
<Q>…</Q>
<DP>…</DP>
<DQ>…</DQ>
<InverseQ>…</InverseQ>
<D>…</D>
</RSAKeyValue>
ToXmlStringにfalse(公開鍵)
を指定すると、結果の XML 文字列は次の形式になる。
<RSAKeyValue>
<Modulus>…</Modulus>
<Exponent>…</Exponent>
</RSAKeyValue>
ライセンス:本記事のテキスト/コードは特記なき限り
CC BY 4.0 です。引用の際は出典URL(本ページ)を明記してください。
利用ポリシー もご参照ください。
コメント