2017-05-03 283 views
0

我有一个服务器(python)和一个客户端(c#),我需要在它们之间使用不对称rsa加密临时进行通信。 当我连接到服务器作为客户端时,我向他发送了我的公钥,然后他发给我他的公钥。我在服务器上使用rsa库,然后在那里获得服务器的公钥参数{n,e}我发送这些参数并在它们之间留出空间。我它们分开,并使用此功能的模数转换成一个BigInteger:RSA C#ImportParameters“参数不正确”异常

public static BigInteger GetBigInteger(string number) 
{ 
    BigInteger bigNum = new BigInteger(); 
    for (int i = number.Length; i > 0; i--) 
    { 
     bigNum *= 10; 
     bigNum += (int) number[number.Length-i]; 
    } 
    return bigNum; 
} 

public static void Connect(IPAddress ipAddress, int port) 
{ 
    try 
    {     
     string[] message; 
     byte[] data = new byte[1024]; 
     srvr.Receive(data); //Recieve the server's public key. 
     int length = int.Parse(Encoding.ASCII.GetString(data.Take(4).ToArray())); 
     message = Encoding.ASCII.GetString(data.Skip(4).Take(length).ToArray()).Split(' ') ; 
     RSACryptoServiceProvider RSAserver = new RSACryptoServiceProvider(1024); 
     RSAParameters par = new RSAParameters(); 
     par.Modulus = GetBigInteger(message[0]).ToByteArray(); // Saves the server's public key. 
     par.Exponent = new byte[] { 1, 0, 1 }; // Saves the server's public key.   
     RSAserver.ImportParameters(par); 
     addresseeKey = RSAserver.ToXmlString(false); 
     ... 
    } 
    ... 
} 

抛出异常的ImportParameters行表示:“参数不正确”。 有什么问题?

+0

你应该把你的代码减少到一个最小的例子。你不需要套接字。另请参阅[如何创建最小,完整和可验证示例](https://stackoverflow.com/help/mcve)。 – jww

+0

另请参阅代码项目上的[Cryptographic Interoperability:Keys](https://www.codeproject.com/Articles/25487/Cryptographic-Interoperability-Keys)。它给出了一些*“参数不正确”的例子*,并对其进行了修正。 – jww

回答

0

BigInteger.ToByteArray()以little-endian顺序导出数据。 RSAParameters希望以big-endian顺序排列所有数据。

还有的模值应该有它最显著位设置,因此BigInteger.ToByteArray()需要在填充字节添加,以防止数被重新解释为阴性,所以你需要的问题修剪那个。

假设您的python导出将模数表示为以10为底的正整数,那么一旦正确对齐数据,您的代码就可以工作(尽管BigInteger.Parse(string)会更有效)。

byte[] tmp = GetBigInteger(message[0]).ToByteArray(); 

// Array.Resize (to a smaller number) trims off the high index values, 
// so it's slightly more compact code to do this before the resize. 
if (tmp.Length > 0 && tmp[tmp.Length-1] == 0) 
    Array.Resize(ref tmp, tmp.Length - 1); 

Array.Reverse(tmp); 
par.Modulus = tmp; 
+0

我怀疑这是问题所在,但是,字节数组原来的长度比RSAParameters接受的长一个字节。 129字节而不是128.可能是小端顺序在它的末尾添加了一个字节0? 如果是这样,该字节消失在大端,这将是好吗? –

+0

啊,是的,符号填充字节。更新了片段。 – bartonjs