2017-05-03 40 views
0

私はサーバ(python)とクライアント(c#)を持っていますが、私はそれらを一時的にassymetric 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)も参照してください。 * "The parameter is incorrect" *の例とその修正を示します。 – jww

答えて

0

BigInteger.ToByteArray()は、リトルエンディアンの順序でデータをエクスポートします。 RSAParametersはビッグエンディアンの順序ですべてのデータを必要とします。

モジュラス値に最上位ビットが設定されている必要があります。したがって、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が受け入れるよりも1バイト長くなります。 128バイトではなく129バイトです。リトルエンディアンの順序でバイト0が最後に追加されるのでしょうか? もしそうなら、そのバイトはビッグエンディアンで消えて、それは大丈夫でしょうか? –

+0

ああ、そう、サインパディングバイト。スニペットを更新しました。 – bartonjs

関連する問題