Ruby等价于PHP openssl_seal

Ruby等价于PHP openssl_seal,php,ruby,openssl,Php,Ruby,Openssl,有人知道ruby是否实现了类似于PHP函数的功能吗?我希望能够与运行修改后的实现的服务器进行交互。PHP解决方案非常简单,如果我能为Ruby找到同样的解决方案,那就太好了 一年前有人在寻找同样的东西,但没有找到任何东西。PHP文档有点不清楚openssl\u seal到底做了什么,但是它的源代码很短(在ext/openssl/openssl.c中查找PHP\u函数(openssl\u seal),在线这里) 它是EVP\u sealinit(),EVP\u Seal\u Update(),EVP

有人知道ruby是否实现了类似于PHP函数的功能吗?我希望能够与运行修改后的实现的服务器进行交互。PHP解决方案非常简单,如果我能为Ruby找到同样的解决方案,那就太好了


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

PHP文档有点不清楚
openssl\u seal
到底做了什么,但是它的源代码很短(在
ext/openssl/openssl.c
中查找
PHP\u函数(openssl\u seal)
,在线这里)

它是
EVP\u sealinit()
EVP\u Seal\u Update()
EVP\u Seal\u Final()
序列上的包装器(请参阅)。据我所知,OpenSSL Ruby模块和
OpenSSL
命令行工具都没有公开这些OpenSSL函数,因此,如果你真的想走这条路,我想你有两个选择:

  • 使用FFI从Ruby调用这些函数
  • 在C中构建一个小的扩展(我认为这是最好的途径,因为您已经有了可用的C源代码,并且也得到了一些好的指针)

  • 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进行“密封”,但创建安全会话密钥(本例中为RC4密钥)相当困难,因此您最好不要自己尝试。信封加密有两个功能:

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

  • 生成随机IV和对称密钥(K1)
  • 用K1加密明文(PT),得到密文(CT)
  • 此时,要将CT解密为PT,您需要K1和IV。我们需要以安全的方式传输K1:

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

  • 通过使用私钥和
  • 使用K1解密CT

  • 类似这样的东西应该可以做到这一点:

    谢谢您的示例。最后,我用PHP编写了“seal”例程,并从Ruby开始编写。不漂亮,但它可以工作。除了这个openssl_密封默认为RC4,它没有include IV。
    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