.net To Mono - > System.Security.Cryptography.CryptographicException:私钥/公钥不匹配

时间:2013-09-23 08:53:33

标签: c# mono

Unhandled Exception: System.Security.Cryptography.CryptographicException: Private/public key mismatch
  at Mono.Security.Cryptography.RSAManaged.ImportParameters (RSAParameters parameters) [0x00000] in <filename unknown>:0 
  at System.Security.Cryptography.RSACryptoServiceProvider.ImportParameters (RSAParameters parameters) [0x00000] in <filename unknown>:0 
  at BlaBlaFunc() [0x00000] in <filename unknown>:0 
[ERROR] FATAL UNHANDLED EXCEPTION: System.Security.Cryptography.CryptographicException: Private/public key mismatch
  at Mono.Security.Cryptography.RSAManaged.ImportParameters (RSAParameters parameters) [0x00000] in <filename unknown>:0 
  at System.Security.Cryptography.RSACryptoServiceProvider.ImportParameters (RSAParameters parameters) [0x00000] in <filename unknown>:0 
  at BlaBlaFunc() [0x00000] in <filename unknown>:0 

这是源代码:

    string foo = "blabla";

    System.Security.Cryptography.RSAParameters rsa_params = new System.Security.Cryptography.RSAParameters();

    rsa_params.Modulus = Enumerable.Range(0, pubkey.Length)
                         .Where(x => x % 2 == 0)
                         .Select(x => System.Convert.ToByte(pubkey.Substring(x, 2), 16))
                         .ToArray();
    rsa_params.Exponent = new byte[] { 1, 0, 1 };
    System.Security.Cryptography.RSACryptoServiceProvider rsa = new System.Security.Cryptography.RSACryptoServiceProvider();
    System.Security.Cryptography.RSAParameters d = rsa.ExportParameters(false);
    rsa.ImportParameters(rsa_params);

    byte[] sp = rsa.Encrypt(Encoding.UTF8.GetBytes(foo), false);

使用vs2010编译在Windows中正常工作的.exe文件。它在Ubuntu下以单声道运行。

使用此命令运行:

  mono --runtime=v4.0.30319 xxx.exe

我该如何解决这个问题?

1 个答案:

答案 0 :(得分:2)

显然ExportParameters调用会生成密钥对,包括私钥,即使您为false参数指定了includePrivateParameters。 (见source code)。 ImportParameters然后只覆盖公钥(因为你没有提供私钥)因此不匹配。如果它与记录的行为不匹配,则可能是单声道错误。检查并提交错误(如果适用)。

作为一种变通方法,您可以删除ExportParameters或创建导入的新实例。