Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/323.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-1280十六进制密钥加密字符串_C#_Encryption_Key_Rsa_Public - Fatal编程技术网

C# C使用公共RSA-1280十六进制密钥加密字符串

C# C使用公共RSA-1280十六进制密钥加密字符串,c#,encryption,key,rsa,public,C#,Encryption,Key,Rsa,Public,我一直在尝试使用服务器发送给我的公钥RSA加密密码 var csp = new CspParameters(1, "Microsoft Strong Cryptographic Provider"); RSACryptoServiceProvider RSA = new RSACryptoServiceProvider(1280, csp); byte[] key = ByteUtils.HexToBytes(client.RSAKey); RSA.ImportCspBlob(key); byt

我一直在尝试使用服务器发送给我的公钥RSA加密密码

var csp = new CspParameters(1, "Microsoft Strong Cryptographic Provider");
RSACryptoServiceProvider RSA = new RSACryptoServiceProvider(1280, csp);
byte[] key = ByteUtils.HexToBytes(client.RSAKey);
RSA.ImportCspBlob(key);
byte[] encrypted = RSA.Encrypt(Encoding.ASCII.GetBytes(password), true);
十六进制键的格式如下:

string key = "30819D300D06092A864886F70D010101050003818B0030818702818100C7BD672D8C634D443840AD809790852770D3A2E99F456D6516329E0205D0645C23FD001D4D070CEE368A20526FEB2402358C915D7E86102B1659AA8651C449C344599F72BE904B8E338E7002E9978453C5BBCCA51AC165AA265069E0EAB1411D11A2FFDD35E5A8296A6A2AF238945874E8206979B0A16E2E4260A161CAB5C905020111";
由于字符串是320字节长的十六进制格式,我假设密钥是160字节RSA 1280 使用此方法,提供程序会一直说提供程序的版本不正确。\r\n。 我尝试了几种方法,将其转换为Base64,只需将其作为ASCII/Unicode导入即可。到目前为止,一切都没起作用

编辑:我的HexToBytes函数可以正常工作,它会返回正确的160-b数组:

public static byte[] HexToBytes(string pValue)
        {
            // FIRST. Use StringBuilder.
            StringBuilder builder = new StringBuilder();

            // SECOND... USE STRINGBUILDER!... and LINQ.
            foreach (char c in pValue.Where(IsHexDigit).Select(Char.ToUpper))
            {
                builder.Append(c);
            }

            // THIRD. If you have an odd number of characters, something is very wrong.
            string hexString = builder.ToString();
            if (hexString.Length % 2 == 1)
            {
                //throw new InvalidOperationException("There is an odd number of hexadecimal digits in this string.");
                // I will just add a zero to the end, who cares (0 padding)
                Log.WriteLine(LogLevel.Debug, "Hexstring had an odd number of hexadecimal digits.");
                hexString += '0';
            }

            byte[] bytes = new byte[hexString.Length / 2];
            // FOURTH. Use the for-loop like a pro :D
            for (int i = 0, j = 0; i < bytes.Length; i++, j += 2)
            {
                string byteString = String.Concat(hexString[j], hexString[j + 1]);
                bytes[i] = HexToByte(byteString);
            }
            return bytes;
        }

您的公钥格式不正确。它不是一个CSP blob。它是一个DER编码的SubjectPublicKeyInfo结构。您可以找到源代码来解析它,也可以自己编写。是此类代码的一个示例。

您的HexToBytes方法是什么样子的?这段代码中可能有错误吗?我很确定它会从十六进制返回一个字节数组,但出于某种奇怪的原因,它不希望将其作为一个键。我认为十六进制字节是错误的。看起来您正在颠倒字节的顺序。StringBuilder的整个使用看起来毫无意义且容易出错。他的HexToBytes可以工作,只要长度有效。我不认为这是问题所在。@Cedric我会验证您是否正确接收了密钥,是否指定了正确的密钥大小,以及是否没有以某种方式更改CSPDameters参数的注册表值。