两种PEM编码公钥的格式名称及.NET平台下互转方法咨询
两种椭圆曲线公钥格式解析及.NET平台互转方案
首先明确一下,你给出的这两个公钥都是基于**secp256r1(NIST P-256)**椭圆曲线的公钥,只是编码格式不同:
- 第一个短的公钥是SubjectPublicKeyInfo(SPKI)格式的PEM公钥:这是最常见的公钥编码格式,直接包含公钥的算法标识和核心公钥数据,结构紧凑,是大多数场景下默认使用的公钥格式。
- 第二个长的公钥是PKCS#8格式的PEM公钥:PKCS#8原本主要用于私钥编码,但也支持公钥封装,它的结构会附带更多元数据,因此编码后的内容更长。
接下来聊聊.NET平台下的互转方法,我们可以直接用System.Security.Cryptography命名空间下的原生类实现,不需要额外第三方库:
从SPKI格式转PKCS#8格式
using System.Security.Cryptography; using System.Text; public static string ConvertSpkiToPkcs8(string spkiPem) { // 清理PEM格式的头尾和换行符 var spkiBytes = Convert.FromBase64String(spkiPem .Replace("-----BEGIN PUBLIC KEY-----", "") .Replace("-----END PUBLIC KEY-----", "") .Replace("\r", "") .Replace("\n", "")); // 加载SPKI公钥并转换为PKCS#8格式 using var ecdsa = ECDsa.Create(); ecdsa.ImportSubjectPublicKeyInfo(spkiBytes, out _); // 导出为带格式的PEM字符串 var pkcs8Bytes = ecdsa.ExportPkcs8PublicKey(); var pkcs8Pem = new StringBuilder(); pkcs8Pem.AppendLine("-----BEGIN PUBLIC KEY-----"); pkcs8Pem.AppendLine(Convert.ToBase64String(pkcs8Bytes, Base64FormattingOptions.InsertLineBreaks)); pkcs8Pem.AppendLine("-----END PUBLIC KEY-----"); return pkcs8Pem.ToString(); }
从PKCS#8格式转SPKI格式
using System.Security.Cryptography; using System.Text; public static string ConvertPkcs8ToSpki(string pkcs8Pem) { // 清理PEM格式的头尾和换行符 var pkcs8Bytes = Convert.FromBase64String(pkcs8Pem .Replace("-----BEGIN PUBLIC KEY-----", "") .Replace("-----END PUBLIC KEY-----", "") .Replace("\r", "") .Replace("\n", "")); // 加载PKCS#8公钥并转换为SPKI格式 using var ecdsa = ECDsa.Create(); ecdsa.ImportPkcs8PublicKey(pkcs8Bytes); // 导出为带格式的PEM字符串 var spkiBytes = ecdsa.ExportSubjectPublicKeyInfo(); var spkiPem = new StringBuilder(); spkiPem.AppendLine("-----BEGIN PUBLIC KEY-----"); spkiPem.AppendLine(Convert.ToBase64String(spkiBytes, Base64FormattingOptions.InsertLineBreaks)); spkiPem.AppendLine("-----END PUBLIC KEY-----"); return spkiPem.ToString(); }
注意:上述代码需要.NET Core 3.0及以上版本,或者.NET 5+,因为ImportPkcs8PublicKey和ExportPkcs8PublicKey这类方法是在较新的.NET版本中引入的。如果是.NET Framework环境,原生支持有限,可能需要借助BouncyCastle等第三方库来实现互转。
内容的提问来源于stack exchange,提问作者VelDev
相关产品推荐
相关产品推荐

