栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 面试经验 > 面试问答

C#将私有/公共RSA密钥从RSACryptoServiceProvider导出到PEM字符串

面试问答 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

C#将私有/公共RSA密钥从RSACryptoServiceProvider导出到PEM字符串

请注意:以下代码用于导出 私钥 。如果您要导出 公共
密钥,请参考我在此处给出的答案。

PEM格式只是转换为base64
的密钥(按PKCS#1)的ASN.1
DER编码。鉴于表示密钥所需的字段数量有限,创建快捷的DER编码器以输出适当的格式然后进行base64编码非常简单。因此,下面的代码并不是特别优雅,但是可以做到:

private static void ExportPrivateKey(RSACryptoServiceProvider csp, TextWriter outputStream){    if (csp.PublicOnly) throw new ArgumentException("CSP does not contain a private key", "csp");    var parameters = csp.ExportParameters(true);    using (var stream = new MemoryStream())    {        var writer = new BinaryWriter(stream);        writer.Write((byte)0x30); // SEQUENCE        using (var innerStream = new MemoryStream())        { var innerWriter = new BinaryWriter(innerStream); EnpreIntegerBigEndian(innerWriter, new byte[] { 0x00 }); // Version EnpreIntegerBigEndian(innerWriter, parameters.Modulus); EnpreIntegerBigEndian(innerWriter, parameters.Exponent); EnpreIntegerBigEndian(innerWriter, parameters.D); EnpreIntegerBigEndian(innerWriter, parameters.P); EnpreIntegerBigEndian(innerWriter, parameters.Q); EnpreIntegerBigEndian(innerWriter, parameters.DP); EnpreIntegerBigEndian(innerWriter, parameters.DQ); EnpreIntegerBigEndian(innerWriter, parameters.InverseQ); var length = (int)innerStream.Length; EnpreLength(writer, length); writer.Write(innerStream.GetBuffer(), 0, length);        }        var base64 = Convert.Tobase64String(stream.GetBuffer(), 0, (int)stream.Length).ToCharArray();        outputStream.WriteLine("-----BEGIN RSA PRIVATE KEY-----");        // Output as base64 with lines chopped at 64 characters        for (var i = 0; i < base64.Length; i += 64)        { outputStream.WriteLine(base64, i, Math.Min(64, base64.Length - i));        }        outputStream.WriteLine("-----END RSA PRIVATE KEY-----");    }}private static void EnpreLength(BinaryWriter stream, int length){    if (length < 0) throw new ArgumentOutOfRangeException("length", "Length must be non-negative");    if (length < 0x80)    {        // Short form        stream.Write((byte)length);    }    else    {        // Long form        var temp = length;        var bytesRequired = 0;        while (temp > 0)        { temp >>= 8; bytesRequired++;        }        stream.Write((byte)(bytesRequired | 0x80));        for (var i = bytesRequired - 1; i >= 0; i--)        { stream.Write((byte)(length >> (8 * i) & 0xff));        }    }}private static void EnpreIntegerBigEndian(BinaryWriter stream, byte[] value, bool forceUnsigned = true){    stream.Write((byte)0x02); // INTEGER    var prefixZeros = 0;    for (var i = 0; i < value.Length; i++)    {        if (value[i] != 0) break;        prefixZeros++;    }    if (value.Length - prefixZeros == 0)    {        EnpreLength(stream, 1);        stream.Write((byte)0);    }    else    {        if (forceUnsigned && value[prefixZeros] > 0x7f)        { // Add a prefix zero to force unsigned if the MSB is 1 EnpreLength(stream, value.Length - prefixZeros + 1); stream.Write((byte)0);        }        else        { EnpreLength(stream, value.Length - prefixZeros);        }        for (var i = prefixZeros; i < value.Length; i++)        { stream.Write(value[i]);        }    }}


转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/465578.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号