[英]RSACryptoServiceProvider error occurred while decoding OAEP padding
我已經閱讀了很多關於這個問題的文章,但似乎找不到解決我的錯誤的答案。
我有一個 WCF 服務; 我的應用程序發送生成的公共 RSA 密鑰,服務返回一組使用公共密鑰加密的 AES 密鑰 + IV,但是當我的應用程序嘗試解密密鑰時,我要么得到“解碼 OAEP 填充時出錯”(如果我將 true 傳遞給 useOAEP)或“參數不正確”(如果我將 false 傳遞給 useOAEP)。 為簡單起見,這是將使用的全部代碼放在一起,將異常處理放在一邊:
public static string EncryptAES(byte[] aesKey, byte[] aesIV, string publicRSAKey)
{
using (RSACryptoServiceProvider rsa = new RSACryptoServiceProvider())
{
rsa.FromXmlString(publicRSAKey);
byte[] encryptedKey = rsa.Encrypt(aesKey, true);
byte[] encryptedIV = rsa.Encrypt(aesIV, true);
return string.Format("{0}{1}{2}", Convert.ToBase64String(encryptedKey), "\n", Convert.ToBase64String(encryptedIV));
}
}
public static byte[] Decrypt(string aesKeyorIV)
{
using (RSACryptoServiceProvider rsa = new RSACryptoServiceProvider())
{
byte[] buffer = Convert.FromBase64String(aesKeyorIV);
rsa.FromXmlString(RSA_Private_Key);
return rsa.Decrypt(buffer, true); //Exception thrown here
}
}
( RSA_Private_Key
是在靜態構造函數中使用rsa.ToXmlString(true)
)
( publicRSAKey
通過在靜態構造rsa.ToXmlString(false)
發送rsa.ToXmlString(false)
傳遞給服務)
我嘗試使用Encrypt/Decrypt(byte[], false)
但它沒有任何區別。 我也試過Array.Reverse(encryptedKey)
然后是Array.Reverse(buffer)
。
私鑰在設置后永遠不會發送/修改,因此不可能。
我沒有想法,調試 WCF 服務非常糟糕。
您所描述的問題很可能是由於使用不同的私鑰到公鑰引起的。
如果您使用 RSA 提供程序的同一實例生成公鑰和公鑰+私鑰,則密鑰將匹配。 例如
string publicRSAKey = null;
string publicPlusPrivateRSAKey = null;
using (RSACryptoServiceProvider rsa = new RSACryptoServiceProvider())
{
publicRSAKey = rsa.ToXmlString(false);
publicPlusPrivateRSAKey = rsa.ToXmlString(true);
}
如果您從 RSA 提供程序的兩個不同實例創建密鑰,則公鑰和公鑰+私鑰將不匹配。 例如
string publicRSAKey = null;
string publicPlusPrivateRSAKey = null;
using (RSACryptoServiceProvider rsa = new RSACryptoServiceProvider())
{
publicRSAKey = rsa.ToXmlString(false);
}
using (RSACryptoServiceProvider rsa = new RSACryptoServiceProvider())
{
publicPlusPrivateRSAKey = rsa.ToXmlString(true);
}
當密鑰匹配時,我可以毫無問題地往返。 當密鑰不匹配時,我收到“解碼 OAEP 填充時發生錯誤。”。
您能在運行時驗證密鑰是否匹配嗎?
由於私鑰也將包含公鑰,因此您可以以 xml 字符串形式查看每個密鑰變量的內容,特別是 /RSAKeyValue/Modulus 和 /RSAKeyValue/Exponent 的 XML 路徑,因為它們應該在兩者之間匹配。
我終於發現了錯誤所在。 我的實現如下,簡化了:
我改變了我的實現,例如:
由於我使用一個 Visual Studio 實例來調試 2 個進程(服務的和 Visual Studio 調試器的),我沒有意識到私鑰/公鑰是不同的。
感謝@zespri 的測試想法。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.