[英]Can RSACryptoServiceProvider.Decrypt() return incorrect data?
[英]Decrypting using RSACryptoServiceProvider.Decrypt
我正在嘗試解密消息,作為密鑰交換的一部分。 我有一個2048位RSA私鑰,用於生成證書。 我收到一條消息,這是HTTP請求的一部分,需要使用私鑰進行解密。 但是,執行最后一行時,我收到以下錯誤消息:
“要解密的數據超出了此模數256字節的最大值。”
我嘗試減少數據的字節數組以解密以及將其反轉。 如果我執行這兩個操作中的任何一個,則會收到“錯誤數據”錯誤。
任何幫助將不勝感激。
解碼消息示例:
ajJDR09EQkUzT0prRHJlM2I1bzZGYjlaUWFpQTB6U2pQb0JGeDBvQ0tseEpYMGhmUkdSU0VJRnFnOEdQTDV5SlRJZmxoQUYzeFAxS3NGM1hFSnBobGl3Z3Y2UStydkY3ZkgvVmRLSit6bE5MZ3RTN0twUWZUaUZqMjlkLzBGVWVhL25qdnFXYTVrdlBrYUN2T2grZ1Rnc3FEd3U4ZVZiOUxhWVUzQWpRODk3MFY4VjM5c1VWYXRLcXdZbitQQkV4cFFSYXRJUlcyS2taSXpuRGZTVCt3dGZRcHMwU1lra3ZENSt6VHZnSGFRSmZNQXMvUlRiSERPVTZrNWo5dVR3SXNTOCtlalBWYjdMc1phOXU1c1plVTZpTlhvOUp1emxDalZpaVk3YnY0SkJCcHhqclRPaVA4NVhUYWg1TVhRYUZsMTZOVzE4dDMzYndnQmVkQmRwNEN3PT0 =
C#代碼:
//http request containing the HMAC key which is encrypted against the public key
hmacKey = oCtx.RequestContext.RequestMessage.ToString();
hmacKey = hmacKey.Remove(0, 8);
hmacKey = hmacKey.Remove(hmacKey.Length - 9);
//decode into binary using Base64
byte[] data = Convert.FromBase64String(hmacKey);
string publicCert = "-----BEGIN CERTIFICATE-----......-----END CERTIFICATE-----";
string privateKey = "-----BEGIN RSA PRIVATE KEY-----......-----END RSA PRIVATE KEY-----";
byte[] certBuffer = Helpers.GetBytesFromPEM(publicCert, PemStringType.Certificate);
byte[] keyBuffer = Helpers.GetBytesFromPEM(privateKey, PemStringType.RsaPrivateKey);
X509Certificate2 x509cert = new X509Certificate2(certBuffer);
RSACryptoServiceProvider prov = Crypto.DecodeRsaPrivateKey(keyBuffer);
x509cert.PrivateKey = prov;
//tried to reduce the size of the data to decrypt as well as reversing it
//Array.Resize(ref data, 32);
//Array.Reverse(data);
byte[] result = prov.Decrypt(data, false);
此示例提供了有關GetBytesFromPEM方法的更多信息: http : //www.codeproject.com/Articles/162194/Certificates-to-DB-and-Back
更新:
嘗試解碼兩次,得到以下結果:
碼:
.....
byte[] data2 = Convert.FromBase64String(hmacKey);
string abc = Encoding.Default.GetString(data2);
byte[] data = Convert.FromBase64String(abc);
.....
byte[] result = prov.Decrypt(data, false);
string result2 = Encoding.Default.GetString(result);
結果:
Óh@-šÚz;CÏ7。«™”ã®ÿRè±àyéK。
該錯誤基本上是由編碼錯誤引起的,包括二進制編碼(base 64)問題和字符編碼問題(UTF-8 / UTF-16)。
通常,您希望對二進制 HMAC進行加密。 相反,HMAC是十六進制編碼的,而十六進制編碼又使用ASCII編碼(與UTF-8兼容)編碼。 .NET的默認值為UTF-16LE(.NET錯誤地調用Unicode編碼)。
生成的密文采用base 64編碼, 如果結果需要以文本形式傳輸,這就是您所期望的。 相反,似乎已經使用了雙基64。 由於base 64解碼產生了另一個base 64編碼的字符串,因此結果太大,RSA解密無法處理。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.