2017-05-03 282 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