Воспроизведение вывода Ruby OpenSSL private_encrypt в C # - PullRequest
6 голосов
/ 07 апреля 2011

У меня есть простой сценарий 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?

Ответы [ 3 ]

1 голос
/ 17 марта 2013

Вам нужен метод генерации «необработанных подписей».Необработанные подписи обычно состоят из модульного возведения в степень совместимых форматов подписи PKCS # 1 v1.5, хотя могут использоваться и другие методы заполнения.Отличие от обычной операции подписи заключается в том, что она не не выполняет хэширование и - в случае совместимых форматов подписи PKCS # 1 v1.5 - не создает структуру ASN.1 вокруг значения хеш-функции, который используется для идентификации используемого метода хеширования.

Этот необработанный формат подписи не является стандартизированным методом генерации подписи, и его следует избегать .private_encrypt в основном используется для поддержки устаревших версий SSL, в которых используется метод создания подписи для аутентификации с использованием конкатенации необработанного вывода хеш-значений MD5 и SHA1.

Наконец, как предложил Siva, выможет использовать библиотеки Bouncy Castle C # для создания необработанных форматов подписи.Необработанный формат подписи не поддерживается "из коробки" большинством API более высокого уровня по причинам, указанным во втором абзаце.

[EDIT2] Для этого вам необходимо использовать необработанную функциональность "RSA".

if (mechanism.Equals("RSA"))
{
    return (new RsaDigestSigner(new NullDigest()));
}

После этого класс RsaDigestSigner будет использовать метод EncodeBlock в DigestInfo для генерации заполнения PKCS # 1.NullDigest ничего не делает, он просто возвращает данные, данные ему как подпись самого себя.

0 голосов
/ 05 октября 2012

Почему бы вам не использовать Bouncy Castle C # ?Он обеспечивает полную основу для криптографии, и есть класс для загрузки сертификата X509 из файла PEM.

0 голосов
/ 29 июня 2011

Вы можете зашифровать с помощью закрытого ключа.

Вот как минимум один пример этого:

http://www.csharpbydesign.com/2008/04/asymmetric-key-encryption-with.html

Обратите внимание на использование свойства PrivateKey при шифровании (хотя в статье упоминается расшифровка , вы можете сделать то же самое и с шифрованием)

...