Произошла ошибка при декодировании заполнения OAEP - PullRequest
14 голосов
/ 05 июня 2009

При расшифровке текста с помощью 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 Вопрос

Ответы [ 8 ]

20 голосов
/ 24 октября 2009

Распространенной ошибкой является попытка расшифровки с использованием открытого ключа.

14 голосов
/ 29 января 2010

Я столкнулся с этой проблемой. 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.FromBase64String и Convert.ToBase64String.

3 голосов
/ 24 сентября 2010

Эта ошибка обычно указывает, что вы используете открытый ключ для расшифровки, в то время как вы должны использовать закрытый ключ для расшифровки. Попробуйте.

2 голосов
/ 13 августа 2012

В моем случае ошибка была вызвана неправильными настройками заполнения.

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

У меня было openssl_public_encrypt() со значением OPENSSL_PKCS1_PADDING по умолчанию в PHP и keypair.decrypt() со значением по умолчанию RSA_PKCS1_OAEP_PADDING в node-rsa .

Так что не забудьте также проверить эти опции.

0 голосов
/ 11 октября 2018

К вашему сведению, вы все еще можете (en / de) шифровать в правильной последовательности ключей (encr: ключ pub, decr: priv key), просто если вы перепутали ключи / расшифровку с использованием закрытого ключа из другого сертификата / ключа пару, а не ту пару с ключом pub, с которой вы зашифровали изначально. Если вы выключите заполнение OAEP и получите исключение «неверные данные», это еще одно указание.

0 голосов
/ 27 января 2017

Мы получили эту проблему, когда использовали неправильный ключ для расшифровки.

0 голосов
/ 24 апреля 2015

Еще одна вещь, которую нужно проверить: она выдавала мне эту ошибку при операции дешифрования в результате забвения передачи открытого ключа в RSACryptoServiceProvider для операции шифрования.

0 голосов
/ 26 мая 2014

RSA-шифрование может приводить к нечитаемому символу, убедитесь, что строка не обрезается из-за специального символа, указывающего конец чего-либо во время записи / чтения результата шифрования; Например, вы не должны использовать strlen, потому что он остановится, когда в строке встретится '\ 0'.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...