簡體   English   中英

Ruby等價於PHP openssl_seal

[英]Ruby equivalent of PHP openssl_seal

有誰知道ruby是否實現了類似於PHP的openssl_seal函數的功能? 我希望能夠與運行此答案的修改實現的服務器進行交互。 PHP解決方案非常簡單,如果我能找到一些讓Ruby做到這一點的方法,那就太好了。

一年前有人在為python尋找相同東西,但沒有找到任何東西。

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 Ruby模塊或openssl命令行工具都未公開這些OpenSSL函數,因此,如果您真的想走這條路,我想您有兩種選擇:

  1. 使用FFI從Ruby調用這些函數
  2. 在C中構建一個小型擴展(我認為這是最佳途徑,因為您已經可以使用C源代碼,並且在C中(或通過shell)使用OpenSSL“ Seal”也獲得了一些很好的指針)

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密鑰)相當困難,因此最好不要嘗試自己做。

信封加密有兩件事:

  1. 使用對稱加密(通過隨機密鑰)對數據進行加密。 這樣速度很快,並且可以輸出可比較大小的數據。
  2. 使用非對稱加密來加密隨機密鑰。 由於數據大小較小,因此速度很快。

如果這是在Ruby與OpenSSL的綁定中,那會很好,但是您可以自己執行此操作。 本質上,您要做的是:

  1. 生成隨機IV和對稱密鑰(K1)
  2. 用K1加密您的純文本(PT),結果得到密文(CT)

此時,要將CT解密為PT,需要K1和IV。 我們需要以安全的方式轉移K1:

  1. 使用公鑰加密K1以獲取EK1
  2. 傳遞

消費者現在需要逆轉該過程。 最終目標是將密文(CT)轉換回純文本(PT)。 為此,我們需要撤消使用K1完成的對稱加密。

  1. 通過使用私鑰和IV解密加密的EK1來解開加密的EK1
  2. 使用K1解密CT

這樣的事情應該可以解決這個問題: https : //gist.github.com/1899731

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM