C# 解码 OAEP 填充时出错

声明:本页面是StackOverFlow热门问题的中英对照翻译,遵循CC BY-SA 4.0协议,如果您需要使用它,必须同样遵循CC BY-SA许可,注明原文地址和作者信息,同时你必须将它归于原作者(不是我):StackOverFlow 原文地址: http://stackoverflow.com/questions/954416/
Warning: these are provided under cc-by-sa 4.0 license. You are free to use/share it, But you must attribute it to the original authors (not me): StackOverFlow

提示:将鼠标放在中文语句上可以显示对应的英文。显示中英文
时间:2020-08-06 04:09:25  来源:igfitidea点击:

Error occurred while decoding OAEP padding

c#encryptionrsadigital-signaturersacryptoserviceprovider

提问by Meetu Choudhary

While decrypting text using RSACryptoServiceProvider.Decrypt, I am getting the error:

使用 解密文本RSACryptoServiceProvider.Decrypt时,出现错误:

Error occurred while decoding OAEP padding.

解码 OAEP 填充时出错。

Here's my code:

这是我的代码:

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>");

The above is works if I am not using the keys of my digital certificate. but if the keys are from the digital certificate, I get the OAEP padding error.

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

Note: This question is in continuation of the Error occurred while decoding OAEP paddingquestion

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

回答by rohancragg

A common mistake is to try to decrypt using the public key.

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

回答by anvilis

I ran into this exact problem. UnicodeEncoding.GetBytesis not always the inverse of UnicodeEncoding.GetString.

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

This is why RSACryptoServiceProvider.Decryptfails. A lot of encrypt/decrypt examples on the web use Unicode encoding. Do not use Unicode encoding. Use Convert.FromBase64Stringand Convert.ToBase64Stringinstead.

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

回答by user456732

This error normally indicates you are using a public key to decrypt, while you should be using a private key for decryption. Give it a try.

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

回答by o_nix

In my case the error has been caused by wrong padding settings.

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

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

I had openssl_public_encrypt()with OPENSSL_PKCS1_PADDINGas a default value in PHPand keypair.decrypt()with the default value RSA_PKCS1_OAEP_PADDINGin node-rsa.

我曾openssl_public_encrypt()OPENSSL_PKCS1_PADDING在默认值PHPkeypair.decrypt()使用默认值RSA_PKCS1_OAEP_PADDING节点-RSA

So don't forget to check these options too.

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

回答by user3121260

RSA encryption may result non readable character, make sure not to cut the string due to special character indicating end of something during write/read the encryption result; e.g you must not use strlen for it will stop when encounter a '\0' in the string.

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

回答by user1454265

Another thing to check: it was giving me this error, on the decrypt operation, as a result of forgetting to pass the public key into the RSACryptoServiceProviderfor the encrypt operation.

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

回答by Zach Wymer

We were getting this issue when we were using the wrong key for decryption.

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

回答by user1172173

FYI, you can still be (en/de)crypting in the right key sequence (encr:pub key, decr:priv key), just that you mixed up the keys/decrypting using the private key from another cert/key pair, and not the one paired w/ the pub key with which u encrypted initially. If u turn off OAEP padding and get a "bad data" exception, that's another indication.

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