簡體   English   中英

解碼 OAEP 填充時出現 RSACryptoServiceProvider 錯誤

[英]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 路徑,因為它們應該在兩者之間匹配。

我終於發現了錯誤所在。 我的實現如下,簡化了:

  1. 應用創建公鑰+私鑰並將公鑰發送給服務
  2. 該服務使用 AES 生成的用公鑰加密的密鑰進行響應。
  3. 然后,該服務嘗試在引發事件以提醒應用程序之前解密密鑰

我改變了我的實現,例如:

  1. 該服務使用加密消息引發事件
  2. 應用程序使用私鑰解密消息。

由於我使用一個 Visual Studio 實例來調試 2 個進程(服務的和 Visual Studio 調試器的),我沒有意識到私鑰/公鑰是不同的。

感謝@zespri 的測試想法。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM