Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/267.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/unity3d/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# C RSA模块:以数字形式获取公钥_C#_Unity3d_Base64_Converter_Rsa - Fatal编程技术网

C# C RSA模块:以数字形式获取公钥

C# C RSA模块:以数字形式获取公钥,c#,unity3d,base64,converter,rsa,C#,Unity3d,Base64,Converter,Rsa,我正在尝试使用C中的System.Security.Cryptography.RSA类。我希望我的C脚本在创建RSA公钥后将其发送到服务器。我用python编写了服务器,所以我需要公钥作为一个数字,但老实说,我不知道怎么做。我的代码: RSA rsaObj = RSA.Create(); RSAParameters rsaParas = rsaObj.ExportParameters(false); byte[] eByte = rsaParas.Exponent; byte[] nByte =

我正在尝试使用C中的System.Security.Cryptography.RSA类。我希望我的C脚本在创建RSA公钥后将其发送到服务器。我用python编写了服务器,所以我需要公钥作为一个数字,但老实说,我不知道怎么做。我的代码:

RSA rsaObj = RSA.Create();
RSAParameters rsaParas = rsaObj.ExportParameters(false);
byte[] eByte = rsaParas.Exponent;
byte[] nByte = rsaParas.Modulus;
现在我有e公钥指数和N模作为字节。我可以使用以下命令将它们转换为Base64字符串:

String eB64 = Convert.ToBase64String(eByte);
String nB64 = Convert.ToBase64String(nByte);
现在我有这样的字符串:

wGFd7jRNC09H/TVGCYU5DUQKTAKRQHOHW6NAKFCGAU8Y/qKg+S6JMLQ8N9UWQGSKKK87RRFW8PF9NE9WQVPSO8LHW0WS9/V2IxX0FZVJPE+L1HHT5CXGRFHMWOYKZB+NaIJUIlZUY5JWyX6SdPwt8QBcHpuY/jXSMg8rqU=


如果那样的话,我不知道怎样才能得到真实的数字。看起来我是唯一一个有这个问题的人,因为我找不到任何关于这个问题的信息。

我不确定我是否完全理解你想要什么,但你可能会发现这个有用

        var eByteString = eByte.Aggregate(string.Empty, (current, n) => current + n.ToString("000"));
        var nByteString = nByte.Aggregate(string.Empty, (current, n) => current + n.ToString("000"));
或者,您也可以不使用以下扩展:

        //convert to decimal string
        var eByteString = string.Empty;
        foreach (byte b in eByte)
            eByteString = eByteString + b.ToString("000");

        var nByteString = string.Empty;
        foreach (byte b in nByte)
            nByteString = nByteString + b.ToString("000");
结果是:

eByteString:001000001

nByteString:21111020312809722524515619005705800521907425411012613700816201718511709809300719719920818813406810217116913205721815525419315408218207621415803216415925514211423225001915805813407718402606509320705916208214909821712801516705103011720409514406307416621907200615622807516615419400302916504807821308913801015114522024024916304819101415416009020705021512717002811307021207412310801111037

这两行将eByte和nByte转换为字节数组的十进制表示形式,每3个字符表示一个字节,以便将字符串转换为原始字节数组

要将其转换回c中的字节数组,可以使用提供的扩展方法:

static class Extensions
{
    public static IEnumerable<String> SplitParts(this string text, int length)
    {
        for (var i = 0; i < text.Length; i += length)
            yield return text.Substring(i, Math.Min(length, text.Length - i));
    }
}
以下是转换为十进制字符串和返回字节数组的完整示例:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Security.Cryptography;

namespace Test
{

    static class Extensions
    {
        public static IEnumerable<String> SplitParts(this string text, int length)
        {
            for (var i = 0; i < text.Length; i += length)
                yield return text.Substring(i, Math.Min(length, text.Length - i));
        }
    }

    static class Program
    {
        static void Main()
        {
            RSA rsaObj = RSA.Create();
            RSAParameters rsaParas = rsaObj.ExportParameters(false);
            byte[] eByte = rsaParas.Exponent;
            byte[] nByte = rsaParas.Modulus;

            //convert to decimal string
            var eByteString = eByte.Aggregate(string.Empty, (current, n) => current + n.ToString("000"));
            var nByteString = nByte.Aggregate(string.Empty, (current, n) => current + n.ToString("000"));

            //convert back to array
            var arrEByteString = eByteString.SplitParts(3).Select(s => Convert.ToByte(s)).ToArray();
            var arrNByteString = nByteString.SplitParts(3).Select(s => Convert.ToByte(s)).ToArray();
        }
    }
}

什么是实数?你有真实的数字吗?你把它们转换成base64编码的字符串…@AdrianoRepetti很抱歉不清楚。对于实数,我指的是一个由数字组成的字符串或一个int,如果键不是太大的话。就是这个:string.Join,eByte@AdrianoRepetti不,那不行。无效参数。为什么您认为需要实数?我的编译器找不到聚合方法。我必须导入一些东西吗?聚合是一种扩展方法,使用System.Linq添加;你还需要.NET3.5或更高版本。我不知道这是否是我问题的正确答案。我需要变量N私钥和公钥模和e公钥指数。字节是我能从.NET RSA实现中得到的唯一东西。你的这些字符串代表我可以用加密数据计算的值吗?这里我们遇到了一个问题:我使用的是Unity引擎,它使用NET2.0。。。还有其他选择吗?这比他开始使用的base64编码糟糕得多。
using System;
using System.Collections.Generic;
using System.Linq;
using System.Security.Cryptography;

namespace Test
{

    static class Extensions
    {
        public static IEnumerable<String> SplitParts(this string text, int length)
        {
            for (var i = 0; i < text.Length; i += length)
                yield return text.Substring(i, Math.Min(length, text.Length - i));
        }
    }

    static class Program
    {
        static void Main()
        {
            RSA rsaObj = RSA.Create();
            RSAParameters rsaParas = rsaObj.ExportParameters(false);
            byte[] eByte = rsaParas.Exponent;
            byte[] nByte = rsaParas.Modulus;

            //convert to decimal string
            var eByteString = eByte.Aggregate(string.Empty, (current, n) => current + n.ToString("000"));
            var nByteString = nByte.Aggregate(string.Empty, (current, n) => current + n.ToString("000"));

            //convert back to array
            var arrEByteString = eByteString.SplitParts(3).Select(s => Convert.ToByte(s)).ToArray();
            var arrNByteString = nByteString.SplitParts(3).Select(s => Convert.ToByte(s)).ToArray();
        }
    }
}