2011-03-06 71 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