Рубиновый эквивалент PHP openssl_seal - PullRequest
1 голос
/ 06 марта 2011

Кто-нибудь знает, реализует ли ruby ​​нечто подобное функции openssl_seal из PHP? Я хотел бы иметь возможность взаимодействовать с сервером, на котором работает измененная реализация этого ответа . Решение PHP довольно простое, и было бы замечательно, если бы я мог найти что-то для Ruby, чтобы сделать то же самое.

Кто-то искал тот же для python год назад, но ничего не нашел.

Ответы [ 3 ]

1 голос
/ 07 марта 2011

EVP_Seal выполняет простую упаковку с RSA, так что вы можете сделать это вручную с помощью функций OpenSSL.

Вот скрипт PHP, который запечатывает с 1 сертификатом:

<?php
$pubkey = openssl_pkey_get_public(file_get_contents('selfcert.pem'));

$message = 'hello,world';
$cipher_text = NULL;

$keys = NULL;
openssl_seal($message, $cipher_text, $keys, array($pubkey));

$file = fopen('wrapped.bin', 'wb');
fwrite($file, $keys[0]);
fclose($file);

$file = fopen('data.bin', 'wb');
fwrite($file, $cipher_text);
fclose($file);
?>

и скрипт Ruby,распечатайте его:

require 'openssl'

wrapped = File.read('wrapped.bin')
cipher_text = File.read('data.bin')

privkey = OpenSSL::PKey::RSA.new(File.read('privkey.pem'))
key = privkey.private_decrypt(wrapped)

cipher = OpenSSL::Cipher.new('rc4')
cipher.decrypt
cipher.key = key

p cipher.update(cipher_text) + cipher.final

Вы также можете выполнить 'печать' с Ruby, но создать безопасный ключ сеанса (ключ RC4 для этого примера) довольно сложно, поэтому лучше не пытаться делать это самостоятельно.

1 голос
/ 24 февраля 2012

Шифрование конверта выполняет две функции:

  1. Шифрует ваши данные с использованием симметричного шифрования (с помощью случайного ключа).Это быстро и выводит данные сопоставимого размера.
  2. Использует асимметричное шифрование для шифрования случайного ключа.Это быстро, потому что размер данных небольшой.

Было бы неплохо, если бы это было в привязках Ruby к OpenSSL, но вы можете сделать это самостоятельно.По сути, вы делаете:

  1. Создайте случайный IV и симметричный ключ (K1)
  2. Зашифруйте ваш открытый текст (PT) с помощью K1, получив зашифрованный текст (CT)

На этом этапе, чтобы расшифровать CT до PT, вам нужны и K1, и IV.Нам нужно безопасно передать K1:

  1. Зашифровать K1 с помощью открытого ключа, чтобы получить EK1
  2. Передать

Потребителю теперь необходимо выполнить обратноепроцесс.Конечная цель - превратить зашифрованный текст (CT) обратно в открытый текст (PT).Для этого нам нужно отменить симметричное шифрование, выполненное с использованием K1.

  1. Развернуть зашифрованный EK1, расшифровав его с помощью закрытого ключа и IV
  2. Расшифровать CT с помощью K1

Нечто подобное должно сработать: https://gist.github.com/1899731

1 голос
/ 07 марта 2011

В документации PHP немного неясно, что именно делает openssl_seal, однако его источник довольно короткий (ищите PHP_FUNCTION(openssl_seal) в ext/openssl/openssl.c, онлайн здесь: http://svn.php.net/viewvc/php/php-src/trunk/ext/openssl/openssl.c?view=markup).

Это оболочкав последовательности EVP_SealIinit(), EVP_Seal_Update(), EVP_Seal_Final() (см. http://www.openssl.org/docs/crypto/EVP_SealInit.html). Насколько я вижу, эти функции OpenSSL не предоставляются ни модулем OpenSSL Ruby, ни инструментом командной строки openssl,так что если вы действительно хотите идти по этому пути, я думаю, у вас есть два варианта:

  1. , используя FFI для вызова этих функций из Ruby
  2. , создав небольшое расширение в C (что ядумаю, это лучший маршрут, так как у вас уже есть работающий исходный код C и OpenSSL "Seal" в C (или через оболочку) также есть несколько хороших указателей)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...