概要
cscの作法、調べてみた。
練習問題やってみた。
練習問題
pem秘密鍵ファイルからJsonWebKeyを生成せよ。
方針
pem読み込みにBouncyCastleを使う
RSACryptoServiceProviderに変換
xml読み込んで、ExponentとModulusを使う
base64url使う
サンプルコード
using System;
using System.IO;
using System.Security.Cryptography;
using Org.BouncyCastle.X509;
using Org.BouncyCastle.Math;
using Org.BouncyCastle.Asn1.X509;
using Org.BouncyCastle.Asn1.Pkcs;
using Org.BouncyCastle.Crypto.Operators;
using Org.BouncyCastle.Security;
using System.Collections.Generic;
using System.Text;
using Org.BouncyCastle.Asn1;
using Org.BouncyCastle.Crypto;
using Org.BouncyCastle.Crypto.Generators;
using Org.BouncyCastle.Crypto.Parameters;
using Org.BouncyCastle.Crypto.Prng;
using Org.BouncyCastle.OpenSsl;
using Org.BouncyCastle.Pkcs;
class test0 {
static void Main() {
AsymmetricCipherKeyPair privateKey;
using (var reader = new StreamReader(@"privatekey.pem", Encoding.ASCII))
{
var pemReader = new PemReader(reader);
privateKey = (AsymmetricCipherKeyPair) pemReader.ReadObject();
}
var rsaParams = DotNetUtilities.ToRSAParameters((RsaPrivateCrtKeyParameters) privateKey.Private);
RSACryptoServiceProvider csp = new RSACryptoServiceProvider();
csp.ImportParameters(rsaParams);
File.WriteAllText("privatekey.xml", csp.ToXmlString(true));
var privateKey2 = File.ReadAllText("privateKey.xml");
var rsa = RSA.Create();
rsa.FromXmlString(privateKey2);
var publicParameters = rsa.ExportParameters(false);
var e = Convert.ToBase64String(publicParameters.Exponent).TrimEnd('=').Replace('+', '-').Replace('/', '_');
var n = Convert.ToBase64String(publicParameters.Modulus).TrimEnd('=').Replace('+', '-').Replace('/', '_');
var dict = new Dictionary<string, string>() {
{"e", e},
{"kty", "RSA"},
{"n", n}
};
foreach (var item in dict)
{
Console.WriteLine(item.Key + ": " + item.Value);
}
}
}
実行結果
>bc18
e: AQAB
kty: RSA
n: lrpUlgxTaOLAUNOus45cl_VBOtqoAv1Y3w3ka5VLzxHVgw9Z4gW1t5a1KsbboJQn_u_gG5SJ_FaV4RzlJe_nGxYYep5fcfSHiZPCV__5xl7QJLvh4PzA6vXJ3BJQF7mEx5xvvW2Ga-gTYpfAQppo_OGcjGJ1VLw06x4oNUliz9zH_vUROlNR2Tbhl8xpSUY6LCPJiQvhVbIBC6GJKosfrXXe-rtrGbUrNtsOjGYJk7496_hzHtsrDy-HdBAWKDjdot7GW2ESxybIrVUIDvyNXV9CUyyQmC_jA6_yiAN9xrWK75Un7Eav_bbhOKVGN9DC2JaSoTcjavomP9QMEWjWOxNcCX0f6iONBGDw4FpaYaCRyiqkD_lY1xfAFLEhD_5QY6GWvHgvRSDyjQwV8Mc4ZUORsEX7eN1DUdIZUfJ5lsRFwXuxCnjgzkdi_-RZocPOuaFkjpX_Es0ZcWc8Rb_-dyaJQlVzrQHC7y8LduPa-qotb7vLUjoxp-1g0yGeK6Sy4sXO0UflrrfsIn8vfmW3VNFxhUUJB4ruXw99yAkyGwCWEonYH3GbK09sx-3_cNDZdx9V04q3vp3nMr0jQ2VfF6I5pRGRl6niWUDNH5OFcGOQ6DRBGaaJ-LXXn6dnsvpimPmf38pshYV8OiHVl1o4fP0NxdeQl25XIpGAWJEJJAE
ok
>
以上。