У меня есть следующий код C#:C# - Шифрование и использование дешифрование данных RSA
главный класс
X509Certificate2 cert = new X509Certificate2("C:/test.pfx", "hello", X509KeyStorageFlags.Exportable | X509KeyStorageFlags.PersistKeySet);
Encryption enc = new Encryption();
string encrypted = enc.Encrypt("hello there", cert);
string decrypted = enc.Decrypt(encrypted, cert);
Console.WriteLine("Encrypted Text: " + encrypted);
Console.WriteLine("Decrypted Text: " + decrypted);
Encryption Class
public string Encrypt(string plainText, X509Certificate2 cert)
{
RSACryptoServiceProvider publicKey = (RSACryptoServiceProvider)cert.PublicKey.Key;
byte[] plainBytes = Encoding.UTF8.GetBytes(plainText);
byte[] encryptedBytes = publicKey.Encrypt(plainBytes, false);
string encryptedText = encryptedBytes.ToString();
return encryptedText;
}
public string Decrypt(string encryptedText, X509Certificate2 cert)
{
RSACryptoServiceProvider privateKey = (RSACryptoServiceProvider)cert.PrivateKey;
byte[] encryptedBytes = Encoding.UTF8.GetBytes(encryptedText);
byte[] decryptedBytes = privateKey.Decrypt(encryptedBytes, false);
string decryptedText = decryptedBytes.ToString();
return decryptedText;
}
Как вы можете видеть, в основном классе я импортирую сертификат. Затем я создаю экземпляр класса Encryption. Затем я передаю открытый текст методу шифрования вместе с сертификатом, чтобы получить зашифрованный текст. Впоследствии я передаю зашифрованный текст в метод Decrypt, чтобы вернуть текст обратно.
Моя проблема заключается в том, что результатом печати зашифрованного текста является System. [] Byte (если я прокомментирую вызов дешифрования). Если я не закомментирую вызов дешифрования, я получаю криптографическое исключение: плохие данные в методе дешифрования.
Я предполагаю, что массив encryptedBytes неверно преобразован в строку. Кроме того, я не уверен, правильно ли я формирую RSAEncryptionProvider. Как я могу решить это, пожалуйста?
Update
Я решил одну проблему. При преобразовании из массива байтов в строку мне пришлось использовать Encoding.UTF8.GetString (EncryptedBytes). Теперь проблема заключается в том, что метод дешифрования дает мне другое криптографическое исключение (его данные, подлежащие расшифровке, превышают максимальный для этого модуля 128 байт).
Кто-нибудь знает, почему это происходит и как его решить?
Шифрование всегда делается на двоичных данных (хотя это может выглядеть как строка для вас) и всегда производит двоичные данные в качестве выходных данных. Почему вы ожидаете каких-либо строк? –
Не повторяйте теги в заголовках. –
@Eugene Я хочу отобразить текст на экране, чтобы увидеть, действительно ли он работает – Matthew