【问题标题】:Error occurred while decoding OAEP padding解码 OAEP 填充时出错
【发布时间】:2010-10-31 13:32:09
【问题描述】:

在使用 RSACryptoServiceProvider.Decrypt 解密文本时,我收到了错误:

解码 OAEP 填充时出错。

这是我的代码:

CspParameters cspParam = new CspParameters();

cspParam = new CspParameters();

cspParam.Flags = CspProviderFlags.UseMachineKeyStore;

clsCertificates cc = new clsCertificates();

string a = "";

cc.OpenStoreIE(ref a);

cc.SetProperties();

X509Certificate2 cert = new X509Certificate2();

cert = cc.x509_2Cert;

RSACryptoServiceProvider rsa = new RSACryptoServiceProvider(cspParam);

//to gentrate private and public keys from the certificate

rsa.FromXmlString(cert.PublicKey.Key.ToXmlString(false));


String publicKey = rsa.ToXmlString(false); // gets the public key 
String privateKey = rsa.ToXmlString(true); // gets the private key working if paramter is false if true give error key is not valid for use in specified state

Response.Write("<Textarea rows=10 cols=100>PUBLIC: " + publicKey + "</TextArea>");

Response.Write("<Textarea rows=10 cols=100>PRIVATE: " + privateKey + "</Textarea>");

Response.Write("<BR>Encrypting the string \"HelloThere\" with the public Key:<BR>");

String str = "HelloThere";

RSACryptoServiceProvider RSA2 = new RSACryptoServiceProvider(cspParam);



//---Load the Public key---

RSA2.FromXmlString(publicKey);

//working with the folowing line instead of above but i need the keys of he certificte

//RSA2.ToXmlString(true);

Byte[] EncryptedStrAsByt = RSA2.Encrypt(System.Text.Encoding.Unicode.GetBytes(str), true);

String EncryptedStr = System.Text.Encoding.Unicode.GetString(EncryptedStrAsByt);

Response.Write("<Textarea rows=10 cols=100>Encrypted String: " + EncryptedStr + "</Textarea>");

Response.Write("<BR>Decrypting the Encrypted String with the Private key:<BR>");



RSACryptoServiceProvider RSA3 = new RSACryptoServiceProvider(cspParam);



//---Load the Private key---

RSA3.FromXmlString(privateKey);

//working with the folowing line instead of above but i need the keys of he certificte

//RSA3.ToXmlString(true);

Byte[] DecryptedStrAsByt = RSA3.Decrypt(EncryptedStrAsByt, true );//Error if true then error is error occured while decoding the OAE$P padding and if false then error is bad key i am using windows xp so it should be true.

String DecryptedStr = System.Text.Encoding.Unicode.GetString(DecryptedStrAsByt);

Response.Write("<Textarea rows=10 cols=100>Decrypted String: " + DecryptedStr + "</Textarea>");

如果我不使用我的数字证书的密钥,以上是有效的。但如果密钥来自数字证书,则会出现 OAEP 填充错误。

注意:这个问题是Error occurred while decoding OAEP padding问题的延续

【问题讨论】:

  • 如果您告诉我们错误消息,而不仅仅是发生错误,您可能更有可能获得答案。有人可能遇到过同样的错误,并记住解决问题的方法。
  • 请不要发布重复的问题。这属于您的原始帖子 (stackoverflow.com/questions/949907/…)。
  • 我也试过 Array.Reverse(EncryptedStrAsByt);之前 Byte[] DecryptedStrAsByt = RSA3.Decrypt(EncryptedStrAsByt, true);但仍然没有结果错误是一样的。
  • 我尝试在该问题中发表评论,但字数限制,所以我发布了新问题抱歉
  • 解码 OAEP 填充时发生错误。描述:在执行当前 Web 请求期间发生未处理的异常。请查看堆栈跟踪以获取有关错误及其源自代码的位置的更多信息。异常详细信息:System.Security.Cryptography.CryptographicException:解码 OAEP 填充时发生错误。源错误:第 83 行:Byte[] DecryptedStrAsByt = RSA3.Decrypt(EncryptedStrAsByt, true);

标签: c# encryption rsa digital-signature rsacryptoserviceprovider


【解决方案1】:

一个常见的错误是尝试使用公钥解密。

【讨论】:

  • 我想用我的私钥加密数据,然后在客户端机器上用我的公钥解密。为什么这是一个错误?我认为这是使用 RSA 的正常方式。 :(
  • 不,“正常”的方式是用公钥加密,用私钥解密。如果您使用私钥加密数据,那么任何拥有您公钥的人都可以解密该数据。虽然这对于保持数据的私密性没有用处,但它对于验证数据确实来自预期的来源很有用。
  • (这是一般情况。我很确定 OpenSSL 库 RSA_encrypt/decrypt 函数无法执行此操作)。
  • @NoOne: “我想用我的私钥加密数据,然后用我的公钥解密” - 是的,它不正确。也许您想要一个带有恢复功能的签名方案
  • 另一个原因是您只是使用了错误的密钥集进行解密。例如,我在将错误的密钥文件加载到应用程序中以解密数据时遇到过这种情况。
【解决方案2】:

我遇到了这个确切的问题。 UnicodeEncoding.GetBytes 并不总是 UnicodeEncoding.GetString 的倒数。

byte[] a = new byte[32];

RandomNumberGenerator gen = new RNGCryptoServiceProvider();
gen.GetBytes(a);

UnicodeEncoding byteConverter = new UnicodeEncoding();

byte[] b = byteConverter.GetBytes(byteConverter.GetString(a));

//byte array 'a' and byte array 'b' will not always contain the same elements.

这就是RSACryptoServiceProvider.Decrypt 失败的原因。网络上的很多加密/解密示例都使用 Unicode 编码。不要使用 Unicode 编码。请改用Convert.FromBase64StringConvert.ToBase64String

【讨论】:

  • 谢谢这解决了我的问题,这让我开始发疯了!
【解决方案3】:

此错误通常表明您正在使用公钥进行解密,而您应该使用私钥进行解密。试试看吧。

【讨论】:

    【解决方案4】:

    在我的情况下,错误是由错误的填充设置引起的。

    Error: RSA decrypt: error:0407A079:rsa routines:RSA_padding_check_PKCS1_OAEP:oaep decoding error
    

    我在PHPkeypair.decrypt() 中使用openssl_public_encrypt()OPENSSL_PKCS1_PADDING 作为默认值,在node-rsa 中使用默认值RSA_PKCS1_OAEP_PADDING

    所以不要忘记检查这些选项。

    【讨论】:

      【解决方案5】:

      仅供参考,您仍然可以(en/de)以正确的密钥序列(encr:pub key, decr:priv key)加密 - 即仍然可以使用私钥解密这个错误 - 它可能只是 错误 私钥(即来自另一个证书/密钥对),而不是与您最初加密的 pub 密钥配对的那个。如果您关闭 OAEP 填充并获得“错误数据”异常,这是另一个迹象。

      【讨论】:

      • 目前正面临这个障碍。
      【解决方案6】:

      RSA加密可能会产生不可读的字符,在写入/读取加密结果的过程中,请确保不要因为特殊字符指示某事结束而剪断字符串;例如,您不能使用 strlen,因为它会在字符串中遇到 '\0' 时停止。

      【讨论】:

        【解决方案7】:

        要检查的另一件事:在解密操作中,它给了我这个错误,因为忘记将公钥传递到 RSACryptoServiceProvider 以进行加密操作。

        【讨论】:

          【解决方案8】:

          当我们使用错误的密钥进行解密时,我们遇到了这个问题。

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 2018-04-05
            • 2013-06-11
            • 2017-12-10
            • 2020-09-22
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            相关资源
            最近更新 更多