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

C#RSA公钥输出不正确

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

C#RSA公钥输出不正确

不幸的是,您所引用的答案中的代码并不是真正正确的-它导出 私钥 PEM格式,但是仅正确设置了公钥字段,这与以标准格式导出RSA公钥不同。

我实际上是在该问题的另一个答案中编写代码的,当时我编写了一种以标准格式导出公钥的模式,但未在此答案中包含它,因为它不是必需的。这里是:

private static void ExportPublicKey(RSACryptoServiceProvider csp, TextWriter outputStream){    var parameters = csp.ExportParameters(false);    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); innerWriter.Write((byte)0x30); // SEQUENCE EnpreLength(innerWriter, 13); innerWriter.Write((byte)0x06); // OBJECT IDENTIFIER var rsaEncryptionOid = new byte[] { 0x2a, 0x86, 0x48, 0x86, 0xf7, 0x0d, 0x01, 0x01, 0x01 }; EnpreLength(innerWriter, rsaEncryptionOid.Length); innerWriter.Write(rsaEncryptionOid); innerWriter.Write((byte)0x05); // NULL EnpreLength(innerWriter, 0); innerWriter.Write((byte)0x03); // BIT STRING using (var bitStringStream = new MemoryStream()) {     var bitStringWriter = new BinaryWriter(bitStringStream);     bitStringWriter.Write((byte)0x00); // # of unused bits     bitStringWriter.Write((byte)0x30); // SEQUENCE     using (var paramsStream = new MemoryStream())     {         var paramsWriter = new BinaryWriter(paramsStream);         EnpreIntegerBigEndian(paramsWriter, parameters.Modulus); // Modulus         EnpreIntegerBigEndian(paramsWriter, parameters.Exponent); // Exponent         var paramsLength = (int)paramsStream.Length;         EnpreLength(bitStringWriter, paramsLength);         bitStringWriter.Write(paramsStream.GetBuffer(), 0, paramsLength);     }     var bitStringLength = (int)bitStringStream.Length;     EnpreLength(innerWriter, bitStringLength);     innerWriter.Write(bitStringStream.GetBuffer(), 0, bitStringLength); } 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 PUBLIC KEY-----");        for (var i = 0; i < base64.Length; i += 64)        { outputStream.WriteLine(base64, i, Math.Min(64, base64.Length - i));        }        outputStream.WriteLine("-----END PUBLIC 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/452020.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

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

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