Это дубликат вопроса без ответа здесь: Использование открытого ключа RSA для расшифровки строки, зашифрованной с помощью закрытого ключа RSA
Вы можете видеть, что автор нашел решение, используя код отсюда: http://www.codeproject.com/KB/security/PrivateEncryption.aspx
Использование кода из этой ссылки выглядит очень многообещающе. Единственное, чего не хватает, так это набивки. Обычно я использую заполнение PKCS1.5, которое используется по умолчанию для OpenSSL RSA.
Я знаю, что ответ на этот вопрос очень близок. Я знаю, что единственное, что сдерживает расшифровку, — это заполнение pkcs1.5 в зашифрованном зашифрованном тексте openssl.
Я был удивлен, увидев, как мало информации по этому вопросу, потому что во многих ситуациях вам понадобится сервер, чтобы что-то зашифровать, что-то подписать и т. д., а клиентское приложение должно проверять, расшифровывать и т. д. с помощью открытого ключа.
Я также активно пытался использовать RSACryptoServiceProvider для проверки хэша, полученного в результате шифрования с использованием OpenSSL. Например, я бы выполнил шифрование с закрытым ключом, используя хэш открытого текста SHA256, а затем попытался выполнить проверку этой подписи с помощью RSACryptoServiceProvider, и это не сработало. Я думаю, что то, как MS делает это, нестандартно, и, возможно, для этого есть специальные настройки.
Итак, альтернативой является этот вопрос, который просто берет зашифрованный текст с закрытым ключом и использует С# для его расшифровки, таким образом, проверяя его подлинность. Хэши могут быть включены для создания простой системы проверки подписи для объектов данных, подписанных сервером и проверенных на клиенте.
Я просмотрел RFC PKCS1, исходный код OpenSSL rsa и другие проекты, я не могу получить четкого ответа о том, как учитывать заполнение PKCS1 при выполнении RSA Decrypt. Я не могу найти, где в исходном коде OpenSSL они обрабатывают заполнение PKCS1, иначе у меня уже может быть ответ.
Кроме того, это мой первый вопрос, я знаю, что это дубликат вопроса без ответа, так что же делать? Я тоже гуглил, ничего не нашел.
Еще я не понимаю, почему мой метод расшифровки не работает. Поскольку заполнение удаляется после расшифровки, мои расшифрованные данные должны напоминать открытый текст, и это даже не близко. Итак, я почти уверен, что заполнение pkcs1 означает, что происходят другие вещи, в частности, с зашифрованным текстом, что означает, что перед дешифрованием зашифрованный текст должен быть предварительно обработан для удаления элементов заполнения.
Возможно, самым простым решением здесь является простая фильтрация зашифрованного текста для удаления элементов заполнения...
Вот мой метод расшифровки:
public static byte[] PublicDecryption(this RSACryptoServiceProvider rsa, byte[] cipherData)
{
if (cipherData == null)
throw new ArgumentNullException("cipherData");
BigInteger numEncData = new BigInteger(cipherData);
RSAParameters rsaParams = rsa.ExportParameters(false);
BigInteger Exponent = GetBig(rsaParams.Exponent);
BigInteger Modulus = GetBig(rsaParams.Modulus);
BigInteger decData = BigInteger.ModPow(numEncData, Exponent, Modulus);
byte[] data = decData.ToByteArray();
byte[] result = new byte[data.Length - 1];
Array.Copy(data, result, result.Length);
result = RemovePadding(result);
Array.Reverse(result);
return result;
}
private static byte[] RemovePadding(byte[] data)
{
byte[] results = new byte[data.Length - 4];
Array.Copy(data, results, results.Length);
return results;
}