.net到单声道RSACryptoServiceProvider不工作

时间:2014-05-19 17:49:46

标签: c# encryption mono

我目前正在将我的一个库移植到mono以使其可用于MonoMac。 我在这个库中使用了RSA,并且它的工作方式不同:它与.Net Framework 4配合得很好但是单声道它不再工作了......

我正在使用RSA交换密钥,这是服务器端代码:

private void SecureConnection()
{
    RSACryptoServiceProvider RSA = new RSACryptoServiceProvider();
    RSAParameters RSAKeyInfo = RSA.ExportParameters(false);
    NetStream.Write(RSAKeyInfo.Modulus, 0, RSAKeyInfo.Modulus.Length);
    NetStream.Flush ();
    byte[] keyReceived = new byte[128];
    byte[] IvReceived = new byte[128];
    int position = 0;
    while (position < 127) {
        position += NetStream.Read (keyReceived, position, 128 - position);
    }
    position = 0;
    while (position < 127) {
        position += NetStream.Read (IvReceived, position, 128 - position);
    }
    byte[] realKey = RSA.Decrypt(keyReceived, true);
    byte[] realIv = RSA.Decrypt(IvReceived, true);
    Rijndael = new RijndaelManaged { Key = realKey, IV = realIv };
    Encrypt = Rijndael.CreateEncryptor();
    Decrypt = Rijndael.CreateDecryptor();
    FullName = WaitAndGetString();
    Debug.WriteLine("[TCP] TcpHandler -> Connection to {0} ({1}) secured successfully", TcpClient.RemoteEndPoint, FullName);
}

这是客户端实现:

private ConnectedClient SecureConnection(TcpClient toSecure)
{
     NetworkStream netStr = toSecure.GetStream();
     ConnectedClient cc = new ConnectedClient
     {
        TcpClient = toSecure,
        NetStream = netStr
     };
     byte[] buffer = new byte[128];
     int position = 0;
     while (position < 127) 
     {
         position += netStr.Read (buffer, position, 128 - position);
     }
     RSACryptoServiceProvider RSA = new RSACryptoServiceProvider();
     RSAParameters RSAKeyInfo = new RSAParameters
     {
        Exponent = new byte[] {1, 0, 1}, 
        Modulus = buffer
     };
     RSA.ImportParameters(RSAKeyInfo);
     Rijndael rjindael = new RijndaelManaged();
     rjindael.GenerateKey();
     rjindael.GenerateIV();
     byte[] keyToSend = RSA.Encrypt(rjindael.Key, true);
     byte[] IvToSend = RSA.Encrypt(rjindael.IV, true);
     netStr.Write(keyToSend, 0, 128);
     netStr.Flush();
     netStr.Write(IvToSend, 0, 128);
     netStr.Flush();
     cc.Encrypt = rjindael.CreateEncryptor();
     cc.Decrypt = rjindael.CreateDecryptor();
     cc.Rijndael = rjindael;
     Debug.WriteLine("[TCP] ConnectedClient -> Connection to " + toSecure.Client.RemoteEndPoint + " secured successfully");
     cc.WriteOnStream(SharedGlobals.FullUsername);
     return cc;
}

问题出在客户端: byte[] realKey = RSA.Decrypt(keyReceived, true); 使用CryptographicException

投掷OAEP decoding error

此异常仅在Mono中引发,而不是标准.Net

任何想法为什么?

1 个答案:

答案 0 :(得分:1)

问题的原因是.Net和Mono之间的指数不一样。 .Net始终生成byte[]{1,0,1}(至少从我看到的内容)。所以,现在我用公钥发送指数,它运作良好。