Ответ 1
Общей ошибкой является попытка дешифрования с использованием открытого ключа.
в продолжении Ошибка при расшифровке дополнения 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>");
Все работает, если я не использую ключи цифрового сертификата. но если есть ключи от цифровых сертификатов, там есть.
Общей ошибкой является попытка дешифрования с использованием открытого ключа.
Я столкнулся с этой точной проблемой. 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
.
Эта ошибка обычно указывает, что вы используете открытый ключ для дешифрования, в то время как вы должны использовать закрытый ключ для дешифрования. Попробуйте.
В моем случае ошибка была вызвана неправильными настройками заполнения.
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.
Поэтому не забудьте также проверить эти параметры.
Шифрование RSA может привести к нечитаемому символу, убедитесь, что он не вырезал строку из-за специального символа, указывающего конец чего-либо во время записи/чтения результата шифрования; например, вы не должны использовать strlen, потому что он остановится, когда встретится "\ 0" в строке.
Еще одна вещь, которую нужно проверить: это дало мне эту ошибку в операции дешифрования в результате забывания передать открытый ключ в RSACryptoServiceProvider
для операции шифрования.
Мы получили эту проблему, когда использовали дефиницию неправильного ключа.