【问题标题】:.net to mono RSACryptoServiceProvider not working.net 到单声道 RSACryptoServiceProvider 不起作用
【发布时间】:2014-05-26 17:40:00
【问题描述】:

我目前正在将我的一个库移植到单声道,以使其可用于 MonoMac。 我在这个库中使用 RSA,但它的工作方式不同:它在 .Net Framework 4 中运行良好,但在 mono 上它不再工作了......

我正在使用 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); 正在用OAEP decoding error 抛出CryptographicException

只有 Mono 会抛出此异常,标准 .Net 不会抛出此异常

有什么想法吗?

【问题讨论】:

  • 第一个问题:你打电话给Stream.Read 并完全忽略了结果。你怎么知道你已经完全阅读了密钥和IV?
  • 我会尝试循环,直到获得合适的尺寸,然后我会更新我的问题。
  • 编辑了我的帖子,我仍然遇到同样的问题
  • 您正在实例化大量对象,它们的类实现了IDisposable 接口。您应该将它们的生命周期包含在 using 语句中。
  • 1) 您的客户假定 e=65537,但我认为 new RSACryptoServiceProvider 的文档不能保证是这种情况。我也看不到生成 1024 位密钥的保证。 2)将字节数组(十六进制编码)转储到程序中的几个点的控制台,这样您就可以通过检查服务器和客户端上的字节是否相同来查看错误的引入位置。

标签: c# encryption mono


【解决方案1】:

这个问题是因为 .Net 和 Mono 之间的指数不一样。 .Net 总是生成一个byte[]{1,0,1}(至少从我所见)。所以,现在我用公钥发送指数,它运行良好。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2021-12-11
    • 1970-01-01
    • 2019-09-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多