Ruby相当于PHP openssl_seal

时间:2011-03-06 17:45:04

标签: php ruby openssl

有没有人知道ruby是否实现了类似于PHP的openssl_seal函数的东西?我希望能够与运行修改后的this answer实现的服务器进行交互。 PHP解决方案非常简单,如果我能找到Ruby做同样的事情,那就太棒了。

有人在一年前寻找同样的for python,但没找到任何东西。

3 个答案:

答案 0 :(得分:1)

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" in C (or via shell)也得到了一些好的指针)

答案 1 :(得分:1)

EVP_Seal使用RSA进行简单包装,因此您可以使用OpenSSL功能手动完成。

这是一个用1个证书密封的PHP脚本:

<?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密钥)相当困难,因此您最好不要自己尝试。

答案 2 :(得分:1)

信封加密有两件事:

  1. 使用对称加密(通过随机密钥)加密数据。这很快,输出的数据大小相当。
  2. 使用非对称加密来加密随机密钥。这很快,因为数据量很小。
  3. 如果这是Ruby与OpenSSL的绑定,那就太好了,但你可以自己做。基本上你做的是:

    1. 生成随机IV和对称密钥(K1)
    2. 使用K1加密您的明文(PT),结果获得密文(CT)
    3. 此时,要将CT解密为PT,您需要K1和IV。我们需要以安全的方式转移K1:

      1. 使用公钥加密K1以获取EK1
      2. 转移
      3. 消费者现在需要扭转这一过程。最终目标是将密文(CT)转换回明文(PT)。为此,我们需要撤消使用K1完成的对称加密。

        1. 使用私钥和IV
        2. 解密加密的EK1
        3. 使用K1
        4. 解密CT

          这样的事情可以解决问题:https://gist.github.com/1899731