如何使用 BouncyCastle c# 将 RSA public 密钥转换为字符串
How to convert RSA public key to string using BouncyCastle c#
我正在尝试将 RsaKeyParameter Public 密钥保存到 SQL 数据库中。我收到 Bouncy Castle 无法将 RsaKeyParameters 转换为字节的错误消息。
使用 BouncyCastle c#。
我生成了一个 RSA 密钥对,将私钥和 public 密钥提取到变量中。然后,我需要存储 public 密钥,以便稍后在应用程序中进行验证。
我发现 post 转换为字节然后字符串如下;
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;
public key 应该是byte,然后是string,才能存入数据库。
可以使用 BouncyCastle 将 public 密钥转换为 X.509/SubjectPublicKeyInfo-ASN.1/DER 格式。这是一种二进制格式,可以使用 Base64 编码从中生成字符串:
byte[] publicKeyDer = SubjectPublicKeyInfoFactory.CreateSubjectPublicKeyInfo(publicKey).GetDerEncoded();
String publicKeyDerBase64 = Convert.ToBase64String(publicKeyDer);
这里,publicKey
是存储在RsaKeyParameters
实例中的public键。逆过程为:
byte[] publicKeyDerRestored = Convert.FromBase64String(publicKeyDerBase64);
RsaKeyParameters publicKeyRestored = (RsaKeyParameters)PublicKeyFactory.CreateKey(publicKeyDerRestored);
X.509/SubjectPublicKeyInfo 和 ASN.1/DER 格式的详细说明可以分别在 here and here 中找到。
publicKeyDer
(作为十六进制字符串)和 publicKeyDerBase64
都可以在 ASN.1 编辑器中显示,例如https://lapo.it/asn1js/
另一种方法是使用 Org.BouncyCastle.OpenSsl.PEMWriter
- 和 Org.BouncyCastle.OpenSsl.PEMReader
-class 创建 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 格式本质上是 DER 格式的文本表示,使用隐式 Base64 编码(例如解释 here)和页眉 (-----BEGIN PUBLIC KEY-----
) 和页脚 (-----END PUBLIC KEY-----
).因此,publicKeyDerBase64
和 publicKeyPEM
.
的 Base64 编码部分相同(如果忽略换行符)
我正在尝试将 RsaKeyParameter Public 密钥保存到 SQL 数据库中。我收到 Bouncy Castle 无法将 RsaKeyParameters 转换为字节的错误消息。
使用 BouncyCastle c#。
我生成了一个 RSA 密钥对,将私钥和 public 密钥提取到变量中。然后,我需要存储 public 密钥,以便稍后在应用程序中进行验证。
我发现 post 转换为字节然后字符串如下;
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;
public key 应该是byte,然后是string,才能存入数据库。
可以使用 BouncyCastle 将 public 密钥转换为 X.509/SubjectPublicKeyInfo-ASN.1/DER 格式。这是一种二进制格式,可以使用 Base64 编码从中生成字符串:
byte[] publicKeyDer = SubjectPublicKeyInfoFactory.CreateSubjectPublicKeyInfo(publicKey).GetDerEncoded();
String publicKeyDerBase64 = Convert.ToBase64String(publicKeyDer);
这里,publicKey
是存储在RsaKeyParameters
实例中的public键。逆过程为:
byte[] publicKeyDerRestored = Convert.FromBase64String(publicKeyDerBase64);
RsaKeyParameters publicKeyRestored = (RsaKeyParameters)PublicKeyFactory.CreateKey(publicKeyDerRestored);
X.509/SubjectPublicKeyInfo 和 ASN.1/DER 格式的详细说明可以分别在 here and here 中找到。
publicKeyDer
(作为十六进制字符串)和 publicKeyDerBase64
都可以在 ASN.1 编辑器中显示,例如https://lapo.it/asn1js/
另一种方法是使用 Org.BouncyCastle.OpenSsl.PEMWriter
- 和 Org.BouncyCastle.OpenSsl.PEMReader
-class 创建 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 格式本质上是 DER 格式的文本表示,使用隐式 Base64 编码(例如解释 here)和页眉 (-----BEGIN PUBLIC KEY-----
) 和页脚 (-----END PUBLIC KEY-----
).因此,publicKeyDerBase64
和 publicKeyPEM
.