Я использую BouncyCastle и С# для шифрования строки с помощью механизма RSA и открытого ключа.
Я хочу расшифровать строку с помощью OpenSSL (Linux) и закрытый ключ с помощью терминала; на самом деле с помощью библиотеки OpenSSL, но у меня тоже есть проблемы с терминалом команд.
Я создал ключи командами OpenSSL
openssl genpkey -algorithm RSA -out private_key.pem -pkeyopt rsa_keygen_bits:2048
У меня есть проблемы с расшифровкой строки с помощью OpenSSL, я написал заглушку для шифрования файла.
Это заглушка шифрования
public static void CryptStringByPublicKey(string stringToCrypt)
{
var key = GetPublicKey();
var e = new Pkcs1Encoding(new RsaEngine());
e.Init(true, key);
var bytes = Encoding.ASCII.GetBytes(stringToCrypt);
var encryptedBytes = e.ProcessBlock(bytes, 0, bytes.Length);
// Which Encoding?
var stringToSave = Encoding.UTF8.GetString(encryptedBytes);
File.WriteAllText(@"C:\temp\encrypted_file", stringToSave);
}
public static RsaKeyParameters GetPublicKey()
{
const string privateKeyString = @"C:\temp/public_key.pem";
RsaKeyParameters publicKey;
using (var reader = File.OpenText(privateKeyString))
publicKey = (RsaKeyParameters)new PemReader(reader).ReadObject();
return publicKey;
}
Это командная строка в Linux для расшифровки
openssl rsautl -decrypt -in encrypted_file -out message.decrypted -inkey lora_private.pem
Я ожидал расшифрованную строку в message.decrypted, но ответил openssl
140251030225344:error:0406506C:rsa routines:rsa_ossl_private_decrypt:data greater than mod len:../crypto/rsa/rsa_ossl.c:399:
Я пытался выяснить проблемы с кодировкой массива символов, я пробовал все виды кодировок (UTF8, ASCII).
Кто-то может помочь мне с любыми предложениями?
@Дирк, верно! File.WriteAllBytes работает! Я знаю, что пропустил маленький шаг. По вашему ответу я заметил, что в своем бизнес-приложении я конвертирую массивы в строку и после в base64. Я должен конвертировать напрямую по байтам! Большое спасибо!





Не могу комментировать, так как слишком новый.
Попробуйте зашифровать как base64 перед отправкой, если вы должны отправить как текст. Я сделал это в обратном порядке (php openssl -> С#)
Затем уберите пробелы.
byte[] encryptedBytes = Convert.FromBase64String(encrypted.Replace(" ", "+"));
У меня было забыли, что мои зашифрованные байты были закодированы в base64. OpenSSL с радостью расшифрует вашу строку base64, и вы сможете сделать хороший однострочный код. НЕ забывайте параметр -A:
openssl.exe base64 -A -d -in enc64.txt | openssl.exe pkeyutl -decrypt -inkey .\keys\privatekey.pem
Не рассматривайте выходные данные процесса шифрования как строку. Если вы хотите сохранить его как двоичные данные, используйте вместо этого
File.WriteAllBytes. Или используйте кодировку base-64, если вы хотите передавать данные по каналу, где произвольные двоичные данные не разрешены.