У меня есть простой сценарий Ruby, который я использую, чтобы выполнить private_encrypt для некоторых заголовков HTTP, чтобы подписать веб-запрос, который должен быть отправлен в ruby REST API, API проверяет строку в кодировке Base64 на строку в кодировке Base64. генерирует, а не декодирует Base64 и дешифрует данные, а затем проверяет исходную строку.
Используемый мной скрипт:
require "openssl"
require "base64"
path_to_cert = ARGV[0].dup
plain_text = Base64.decode64(ARGV[1].dup)
private_key = OpenSSL::PKey::RSA.new(File.read(path_to_cert))
puts Base64.encode64(private_key.private_encrypt(plain_text))
Тот факт, что ввод кодируется в Base64, обусловлен исключительно переносом строк и пробелами во входном аргументе.
Чтобы использовать это, мне приходится раскошелиться на ruby с помощью System.Diagnostics.Process и захватить StdOut, хотя это не является серьезной проблемой и работает, я хотел бы удалить зависимость от ruby, но я не могу воспроизведите вывод, используя C # RsaCryptoServiceProvider.
Если я Base64 кодирую результат private_encrypt "SimpleString", используя ruby, я последовательно получаю
auReJzoPSW3AhzsfT3EH4rD7lc4y2CJ026xIOiV6kjl2OKIj8GnzrPosoJDg \ nSHrvLVKrSxYlegYgJRMx + vaAHSAm7RXrZh5An2SnVuO3qITa2TJ78hTc3bAw \ nCDm4i9 / 4qictjxEFfnPRe6
EYCa4b3dnM5moa1eo9zbQPBa1eS6ItRCX4C0G0 \ n1tJpQsEvuums363eAhTUAYa6yEWuINLPmE0USW6jfFNnsxw8Nv9SnC + ziomb \ п / mwlt9dS5 / mzKM8yFMH6hdQYLoqc0QpjT + xaZ1ZyJ6dG5MVG
h3JtjIVRTOSd \ п + Püü / Ьо + obEHbrftG8u2uJImLSA + / 1e8aapHaa3WNg ==
При использовании .Net
RsaCryptoServiceProvider.Encrypt("SimpleString", false)
Результат всегда отличается от результата из-за того, что он шифруется с помощью открытого ключа.
я тоже пробовал
RsaCryptoServiceProvider.SignData
и, хотя это всегда дает один и тот же результат, он отличается от результата ruby.
Могу ли я использовать некоторые CryptoAPI непосредственно из .Net, что позволит мне достичь того же результата, что и Ruby?