【发布时间】:2017-06-12 13:33:21
【问题描述】:
RSA 解密在 Windows Server 2012 和 Windows 10 中失败,但在 Windows 7 中就像一个魅力。放置在代码下方,其中还包含使用的相关密钥。
var rsa = new RSACryptoServiceProvider(1024);
const string privatekey = "<RSAKeyValue><Modulus>m38MvfdL8epfiYvgw6ylMB7zPAKSStQLklCQEOworQwJxw39bXdnm4717BUm5700vZCbG9GBgjwHUxmrFrFsSJxMIdYhokT/DuYOC9Nsf2fiX5Uq+WtBfbSneEr6yVk2VB1fgba6XxoK9O3CKzieR1XxPEofxGRjrXzMe8nIMNc=</Modulus><Exponent>AQAB</Exponent><P>33li38h5n1siKeu3LvsLF+JiytDAVLdRO6BkZ7btGcElTs/iir8ZIJFs2VvB5ELovk0iSBKZTNN/In4asEehaw==</P><Q>siDRbd2xQOyZnIOhfkjAt4QUNhskKRV56OkTvEawxloXZOssh0BjzuW8UVbiM3OuqgXUZm64eJyVghJacWXNRQ==</Q><DP>aafRWG5HGlGTCHDabcrhRsyQ2sTxedwl+uPtNJ/m35tS0T02JVUOQzieVvGr7Qi5U2fSgnLQqeMAo8UtRxTGuw==</DP><DQ>LB724Pi9k/BG6D6ufKI2of4kJ3a3kTmRlcBNtB/qX2cnTkb2I5YuYqwC5j7YDpiD1fdVsf2Q0ccvPSWgo1/s5Q==</DQ><InverseQ>YnPBkCyRyRnVWJPaJg507VdJpEPPeacdJ0wUJfiJgOfJPo01JLOWtgPWVqpW+pDTouv77qn7N1sIRo+IiyzsRA==</InverseQ><D>KEOLvxzr82Zm+qzXtJNd6sn43c8kpm+l12s5AsjD95soZPzAZLoIgAVStKD9hABASd3J7DghuuFkXCZHYQbsLLEeRY2TuuS/e6yyYV0+KNMRMrZAZ2DdWOdsfUmbQMiJNVTLmkwBgFLaFmcZ/DmPBMUYuJmFO9Tg6vEDCg45b5E=</D></RSAKeyValue>";
var dataByte = Convert.FromBase64String("YfFFh5cquMP8qMls+7e1WF23addkU9vLuK4W5U8R0zclbw1SJk+8QC8K17dgN5mXFKEifj669H7fAKfUphWDLqDSsodfFcGbElOC5J9ybf30Or1NPH9g2OTjIAaWluBjAYpg/qEtvJkvzwFpeqWoVOfNdwn51igCbPZKKi04tw==");
rsa.FromXmlString(privatekey);
//var dataNotWorkingByte = Convert.FromBase64String("YfFFh5cquMP8qMls+7e1WF23addkU9vLuK4W5U8R0zclbw1SJk+8QC8K17dgN5mXFKEifj669H7fAKfUphWDLqDSsodfFcGbElOC5J9ybf30Or1NPH9g2OTjIAaWluBjAYpg/qEtvJkvzwFpeqWoVOfNdwn51igCbPZKKi04tw==");
var dataWorkingByte = Convert.FromBase64String("I2S7t/BHFZo7JZFVUCHSSckHcWEASiZNjHmR5O1495y5RIej7d8PfnXjQYUrN1U352RAo373XSDuVhhFwS9XijI6lMJH/rlMjFIXOegcOrBJI406ZpF0dmbBc+Wq4rmBngT6fzrqvLLhijfRUq1m+K2dEfOkOuzRCsXKRKCOZBA=");
var descryptedString = Encoding.ASCII.GetString(decryptedByte);
抛出以下异常
在 mscorlib.dll 中出现“System.Security.Cryptography.CryptographicException”类型的未处理异常 附加信息:不良数据。
编辑 仅当尝试使用双填充 (==) 解密文本时才会发生异常。提供了工作和不工作文本的样本
var dataNotWorkingByte = Convert.FromBase64String("YfFFh5cquMP8qMls+7e1WF23addkU9vLuK4W5U8R0zclbw1SJk+8QC8K17dgN5mXFKEifj669H7fAKfUphWDLqDSsodfFcGbElOC5J9ybf30Or1NPH9g2OTjIAaWluBjAYpg/qEtvJkvzwFpeqWoVOfNdwn51igCbPZKKi04tw==");
var dataWorkingByte = Convert.FromBase64String("I2S7t/BHFZo7JZFVUCHSSckHcWEASiZNjHmR5O1495y5RIej7d8PfnXjQYUrN1U352RAo373XSDuVhhFwS9XijI6lMJH/rlMjFIXOegcOrBJI406ZpF0dmbBc+Wq4rmBngT6fzrqvLLhijfRUq1m+K2dEfOkOuzRCsXKRKCOZBA=");
而且数据长度很小,不超过50个字符。
提前感谢您的宝贵时间!!
【问题讨论】:
-
请检查您的dataByte是否使用RSA算法加密
-
如果我将
Decrypt上面的行改为dataByte = rsa.Encrypt(Encoding.ASCII.GetBytes("Hello"), false);它工作正常,因此 1024 是不正确的密钥大小或输入的 base64 数据不正确。 -
使用 Mono 为我工作。
-
@AlexK.,抱歉,未能添加解密并非在所有情况下都失败,这似乎只有当我们在加密字符串的末尾有双填充 (==) 时才会失败。将编辑帖子以反映这一点。
-
本应存在的前导零字节被剥离。
Enumerable.Concat(new byte[] { 0 }, Convert.FromBase64String("YfFFh5cquMP8qMls+7e1WF23addkU9vLuK4W5U8R0zclbw1SJk+8QC8K17dgN5mXFKEifj669H7fAKfUphWDLqDSsodfFcGbElOC5J9ybf30Or1NPH9g2OTjIAaWluBjAYpg/qEtvJkvzwFpeqWoVOfNdwn51igCbPZKKi04tw==")).ToArray()已成功解密。您需要插入一些代码来检测长度不完全为 128 字节的数组并根据需要填充它们。
标签: c# encryption rsa windows-server-2012