解码OAEP填充时发生错误

Mee*_*ary 15 c# encryption rsa rsacryptoserviceprovider digital-signature

在使用解密文本时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>");
Run Code Online (Sandbox Code Playgroud)

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

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

roh*_*agg 20

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

  • 不,"正常"方式是使用公钥加密并使用私钥解密.如果使用私钥加密数据,则使用您的公钥的任何人都可以解密该数据.虽然这对于保持数据私有没有用,但*对于验证数据是否来自预期的来源是有用的. (9认同)
  • 我想用我的私钥加密数据,然后在客户端机器上用我的公钥解密。为什么这是一个错误?我认为这是使用 RSA 的正常方式。:( (2认同)

小智 14

我遇到了这个问题.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.
Run Code Online (Sandbox Code Playgroud)

这就是RSACryptoServiceProvider.Decrypt失败的原因.Web上的许多加密/解密示例都使用Unicode编码.不要使用Unicode编码.使用Convert.FromBase64StringConvert.ToBase64String替代.


小智 5

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