有没有人知道ruby是否实现了类似于PHP的openssl_seal函数的东西?我希望能够与运行修改后的this answer实现的服务器进行交互。 PHP解决方案非常简单,如果我能找到Ruby做同样的事情,那就太棒了。
有人在一年前寻找同样的for python,但没找到任何东西。
答案 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 :(得分: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)
信封加密有两件事:
如果这是Ruby与OpenSSL的绑定,那就太好了,但你可以自己做。基本上你做的是:
此时,要将CT解密为PT,您需要K1和IV。我们需要以安全的方式转移K1:
消费者现在需要扭转这一过程。最终目标是将密文(CT)转换回明文(PT)。为此,我们需要撤消使用K1完成的对称加密。
这样的事情可以解决问题:https://gist.github.com/1899731