21

使用 解密文本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 填充错误。

注意:这个问题是在解码 OAEP 填充问题时发生的错误的延续

4

8 回答 8

23

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

于 2009-10-24T17:23:18.723 回答
16

我遇到了这个确切的问题。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.FromBase64StringandConvert.ToBase64String代替。

于 2010-01-29T18:25:10.190 回答
4

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

于 2010-09-23T22:55:40.790 回答
2

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

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

我在PHPopenssl_public_encrypt()使用了默认值,在node-rsa中使用了默认值。OPENSSL_PKCS1_PADDINGkeypair.decrypt()RSA_PKCS1_OAEP_PADDING

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

于 2012-08-13T14:09:42.397 回答
1

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

于 2018-10-10T21:35:11.093 回答
0

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

于 2015-04-24T20:28:44.100 回答
0

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

于 2014-05-26T02:52:56.520 回答
0

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

于 2017-01-27T17:20:45.303 回答