2011-03-06 101 views

回答

1

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密钥)相当困难,所以你最好不要自己去尝试。

+0

感谢您的例子。我最终在PHP中编写了'密封'例程,并从Ruby中解脱出来。不漂亮,但它的作品。 – 2011-03-14 10:43:25

1

的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命令行工具,所以如果你真的想追求这条路我猜你是到两个选项:

  1. 使用FFI调用这些函数从红宝石
  2. 建设C(我认为是最好的路线,因为你已经有工作的C源和OpenSSL "Seal" in C (or via shell)得到了一些不错的三分球太)
1

信封加密做了两两件事:

  1. 加密使用对称加密数据(通过随机密钥)。这是快速的,并输出可比尺寸的数据。
  2. 使用非对称加密来加密随机密钥。这很快,因为数据量很小。

如果这是在Ruby的绑定到OpenSSL,但你可以自己做,这将是很好。从本质上讲,你做的是:

  1. 生成与K1随机IV和对称密钥(K1)
  2. 加密的明文(PT),得到密文(CT),结果

在这点,要解密CT到PT,你需要K1和IV。我们需要以安全的方式传输K1:使用

  1. K1加密的公钥来获得EK1
  2. 转移

消费者现在需要扭转这一进程。最终目标是将密文(CT)转换回明文(PT)。为此,我们需要撤消使用K1完成的对称加密。

  1. 展开加密EK1使用私钥和使用K1

这样的事情IV

  • 解密CT应该做的伎俩解密它:https://gist.github.com/1899731

  • +0

    除openssl_seal默认为RC4,不包含IV。 – OneSneakyMofo 2016-07-13 14:48:50