14

в продолжении Error occurred while decoding OAEP padding вопросаОшибка при расшифровке 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>"); 

Все работает, если я не использую ключи Цифровой сертификат. но если есть ключи от цифровых сертификатов, есть ошибки.

+0

У вас может быть больше шансов получить ответ, это вы сказали нам сообщение об ошибке, а не только ошибку. Кто-то, возможно, столкнулся с той же ошибкой и вспомнил, что решило проблему. – Accipitridae

+3

Пожалуйста, не отправляйте повторяющиеся вопросы. Это относится к вашему первоначальному сообщению (http://stackoverflow.com/questions/949907/error-occurred-while-decoding-oaep-padding). –

+0

Я также пробовал Array.Reverse (EncryptedStrAsByt); до Байт [] DecryptedStrAsByt = RSA3.Decrypt (EncryptedStrAsByt, true); , но все еще нет результатов, ошибка такая же. –

ответ

20

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

+0

Я хочу зашифровать данные своим личным ключом, а затем расшифровать его с помощью моего открытый ключ на клиентской машине. Почему это ошибка? Я думал, что это обычный способ использования RSA. :( – NoOne

+7

Нет, «обычным» способом является шифрование с помощью открытого ключа и дешифрование с помощью закрытого ключа. Если вы шифруете данные с помощью закрытого ключа, любой, у кого есть ваш открытый ключ, может расшифровать эти данные. Хотя это не полезно для хранения данные закрыты, он * полезен для проверки того, что данные поступают из ожидаемого источника. – OldTinfoil

+0

(Это в общем случае. Я уверен, что в OpenSSL-библиотеке функции RSA_encrypt/decrypt не могут выполнять это действие). – OldTinfoil

13

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

+0

Спасибо, это решило мою проблему, которая была начиная с меня гайки! – Ben

2

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

2

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

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

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

0

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

0

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

Смежные вопросы