当前位置: 首页 > 知识库问答 >
问题:

如何利用BouncyCastle C#将RSA公钥转换为字符串

袁羽
2023-03-14

我正在尝试将RsaKeyParameter公钥保存到SQL数据库中。我得到一个错误,Bouncy Castle不能将RsaKeyParameters转换为字节。

使用BouncyCastle C#。

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;

公钥应该是字节,然后是字符串,保存到数据库中。

共有1个答案

韦思淼
2023-03-14

可以使用BouncyCastle将公钥转换为X.509/SubjectPublicKeyInfo-asn.1/der-格式。这是一种二进制格式,可以使用Base64-Encoding从该格式生成字符串:

byte[] publicKeyDer = SubjectPublicKeyInfoFactory.CreateSubjectPublicKeyInfo(publicKey).GetDerEncoded();
String publicKeyDerBase64 = Convert.ToBase64String(publicKeyDer);

这里,publickey是存储在RSAKEYParameters-实例中的公钥。相反的过程是:

byte[] publicKeyDerRestored = Convert.FromBase64String(publicKeyDerBase64);
RsaKeyParameters publicKeyRestored = (RsaKeyParameters)PublicKeyFactory.CreateKey(publicKeyDerRestored);

关于X.509/SubjectPublicKeyInfo-和ASN.1/der-格式的详细描述可以分别在这里和这里找到。

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编码(如这里所解释的)和页眉(-----begin PUBLIC key---)和页脚(-----end PUBLIC key-----)。因此,publicKeyderBase64publicKeypem的base64编码部分是相同的(如果忽略换行符)。

 类似资料:
  • 问题内容: 我有以下格式的公钥 我需要将其转换为以下格式 基本上,问题是我正在使用用Java编写的第三方库。 第三方库使用Java类“ RSAPublicKeySpec”从字符串生成RSAPublicKey类型的实例。 我提供给该第三方库的字符串取自以下格式的文件: 仔细研究一下代码之后,我可以看到,如果我使用java类“ X509EncodedKeySpec”来加载此公共密钥,则代码的签名验证部

  • 我有以下公钥(作为示例): 我需要能够将其转换为可以插入ssh known_hosts文件的格式。例如: 谢了!

  • 让我先解释一下我的问题。我从CA购买了一个证书,并使用以下格式生成csr和私钥: 有趣的是,在aws文档页面上,他们显示的示例私钥以“------开始RSA私钥-------”开头 有没有办法使用OpenSSL将我的私钥转换为RSA私钥?

  • 我想得到一个文件内容的公钥,这是一个文件内容看起来像什么的例子(用生成): 如果我是对的,这不是公钥,但是可以从这个字符串中获取公钥。 这个答案回答了我的问题https://stackoverflow.com/a/19387517/2735398 但答案似乎不起作用。我有个例外: 当看到答案的评论时,我不是唯一有问题的人... 如何修复异常?或者有没有其他方法可以从字符串中获取公钥?

  • 在Android中,我使用下面的代码将String转换为RSA私钥 https://www.devglan.com/online-tools/rsa-encryption-decryption 但是,当我使用这个网站时,我的代码不起作用。 https://8gwifi.org/RSAFunctionality?keysize=1024 我在Android studio中的代码是: 与第二个链接错误

  • 我的公共在ssh-rsa是: ssh rsa aaaab3nzac1yc2aaaaaadaqabaababaqclaxt5s/wux04oxbt9r59wcl45omau3m0063lfyja7ovqavr7/2kHtLF/LoCQCXSZMny8RTCGDjoXD7G/tGsyHFDHCI//Y1VDLE06AlDzrlu69DQY91 6gkhghgjh3sf6us5hxlihrbsflf8g