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
我该如何解决这个问题?
答案 0 :(得分:2)
显然ExportParameters
调用会生成密钥对,包括私钥,即使您为false
参数指定了includePrivateParameters
。 (见source code)。 ImportParameters
然后只覆盖公钥(因为你没有提供私钥)因此不匹配。如果它与记录的行为不匹配,则可能是单声道错误。检查并提交错误(如果适用)。
作为一种变通方法,您可以删除ExportParameters
或创建导入的新实例。