Ruby的等价PHP openssl_seal
有谁知道ruby是否实现了类似于PHP的openssl_seal函数?我希望能够与运行this answer修改实现的服务器进行交互。 PHP解决方案非常简单,如果我能找到一些Ruby来做同样的事情,那将是非常棒的。Ruby的等价PHP openssl_seal
有人在一年前寻找相同的for python,但没有找到任何东西。
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密钥)相当困难,所以你最好不要自己去尝试。
的PHP文件是有点不清楚什么openssl_seal
正是这么做,但是它的来源是很短(在ext/openssl/openssl.c
寻找PHP_FUNCTION(openssl_seal)
,在线在这里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红宝石模块外露,也不由openssl
命令行工具,所以如果你真的想追求这条路我猜你是到两个选项:
- 使用FFI调用这些函数从红宝石
- 建设C(我认为是最好的路线,因为你已经有工作的C源和OpenSSL "Seal" in C (or via shell)得到了一些不错的三分球太)
信封加密做了两两件事:
- 加密使用对称加密数据(通过随机密钥)。这是快速的,并输出可比尺寸的数据。
- 使用非对称加密来加密随机密钥。这很快,因为数据量很小。
如果这是在Ruby的绑定到OpenSSL,但你可以自己做,这将是很好。从本质上讲,你做的是:
- 生成与K1随机IV和对称密钥(K1)
- 加密的明文(PT),得到密文(CT),结果
在这点,要解密CT到PT,你需要K1和IV。我们需要以安全的方式传输K1:使用
- K1加密的公钥来获得EK1
- 转移
消费者现在需要扭转这一进程。最终目标是将密文(CT)转换回明文(PT)。为此,我们需要撤消使用K1完成的对称加密。
- 展开加密EK1使用私钥和使用K1
这样的事情IV
除openssl_seal默认为RC4,不包含IV。 – OneSneakyMofo 2016-07-13 14:48:50
感谢您的例子。我最终在PHP中编写了'密封'例程,并从Ruby中解脱出来。不漂亮,但它的作品。 – 2011-03-14 10:43:25