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パディングのデコード中にエラーが発生しました 質問の続きです
よくある間違いは、公開鍵を使用して復号化しようとすることです。
私はこの正確な問題に遭遇しました。 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
が失敗する理由です。 Web上の暗号化/復号化の例の多くは、Unicodeエンコーディングを使用しています。 Unicodeエンコーディングを使用しないでください。代わりにConvert.FromBase64String
とConvert.ToBase64String
を使用してください。
このエラーは通常、復号化に公開鍵を使用していることを示していますが、復号化には秘密鍵を使用する必要があります。試してみる。
私の場合、エラーは間違ったパディング設定が原因で発生しました。
_Error: RSA decrypt: error:0407A079:rsa routines:RSA_padding_check_PKCS1_OAEP:oaep decoding error
_
[〜#〜] php [〜#〜] のデフォルト値として_OPENSSL_PKCS1_PADDING
_を使用したopenssl_public_encrypt()
とデフォルト値を使用したkeypair.decrypt()
がありました_RSA_PKCS1_OAEP_PADDING
_ in node-rsa 。
したがって、これらのオプションも確認することを忘れないでください。
RSA暗号化により、読み取り不可能な文字が生成される場合があります。暗号化結果の書き込み/読み取り中に何かの終わりを示す特殊文字が原因で、文字列を切り取らないようにしてください。たとえば、文字列で「\ 0」が検出されると停止するため、strlenを使用しないでください。
参考までに、別の証明書/キーペアの秘密キーを使用してキー/復号化を混同しただけで、正しいキーシーケンス(encr:pubキー、decr:privキー)で(暗号化/復号化)することができます。 uが最初に暗号化した公開鍵とペアになっているものではありません。 OAEPパディングをオフにして「不良データ」例外が発生した場合は、別の兆候です。
復号化に間違ったキーを使用していたときに、この問題が発生していました。
もう1つ確認する必要があるのは、暗号化操作のために公開鍵をRSACryptoServiceProvider
に渡すのを忘れた結果として、復号化操作でこのエラーが発生したことです。