我正在尝试将RsaKeyParameter公钥保存到SQL数据库中。我收到一个错误消息,说Bouncy Castle无法将RsaKeyParameters转换为字节。
使用BouncyCastle c#。
我已经生成了一个RSA密钥对,将私钥和公钥提取到变量中。然后,我需要在以后的应用程序中存储公钥以进行验证。
我发现了如下有关转换为字节然后为字符串的文章;
byte[] serializedPublicBytes =
publicKeyInfo.ToAsn1Object().GetDerEncoded();
string serializedPublic = Convert.ToBase64String(serializedPublicBytes);
,但它不喜欢ToAsn1Object。仅以举例来说,我知道我的变量名是不同的。
RsaKeyPairGenerator rsaKeyPairGen = new RsaKeyPairGenerator();
rsaKeyPairGen.Init(new KeyGenerationParameters(new SecureRandom(), 2048));
AsymmetricCipherKeyPair keyPair = rsaKeyPairGen.GenerateKeyPair();
RsaKeyParameters PrivateKey = (RsaKeyParameters)keyPair.Private;
RsaKeyParameters PublicKey = (RsaKeyParameters)keyPair.Public;
公钥应先字节然后字符串,以保存到数据库中。
答案 0 :(得分:0)
可以使用BouncyCastle将公钥转换为X.509 / SubjectPublicKeyInfo-ASN.1 / DER格式。这是一种二进制格式,可以使用Base64编码从中生成字符串:
byte[] publicKeyDer = SubjectPublicKeyInfoFactory.CreateSubjectPublicKeyInfo(publicKey).GetDerEncoded();
String publicKeyDerBase64 = Convert.ToBase64String(publicKeyDer);
在这里,publicKey
是存储在RsaKeyParameters
实例中的公钥。反向过程是:
byte[] publicKeyDerRestored = Convert.FromBase64String(publicKeyDerBase64);
RsaKeyParameters publicKeyRestored = (RsaKeyParameters)PublicKeyFactory.CreateKey(publicKeyDerRestored);
分别可以在here和here中找到X.509 / SubjectPublicKeyInfo-和ASN.1 / DER格式的详细说明。
publicKeyDer
(作为十六进制字符串)和publicKeyDerBase64
都可以在ASN.1-Editor中显示,例如https://lapo.it/asn1js/
另一种方法是使用Org.BouncyCastle.OpenSsl.PEMWriter
-和Org.BouncyCastle.OpenSsl.PEMReader
-类创建PEM格式
(不要与Org.BouncyCastle.Utilities.IO.Pem.PEMWriter
/ PEMReader
混淆):
TextWriter textWriter = new StringWriter();
PemWriter pemWriter = new PemWriter(textWriter);
pemWriter.WriteObject(publicKey);
pemWriter.Writer.Flush();
String publicKeyPEM = textWriter.ToString();
相反是:
TextReader textReader = new StringReader(publicKeyPEM);
PemReader pemReader = new PemReader(textReader);
RsaKeyParameters publicKeyRestored = (RsaKeyParameters)pemReader.ReadObject();
PEM格式本质上是使用隐式Base64编码(例如解释的here),标头(-----BEGIN PUBLIC KEY-----
)和页脚(-----END PUBLIC KEY-----
的DER格式的文本表示。 )。因此,publicKeyDerBase64
和publicKeyPEM
的Base64编码部分都是相同的(如果忽略了换行符)。