2012-05-09 83 views
1

簽署使用PHP 5.2.4,我試圖創建的OpenSSL 0.9.8g模塊簽署的消化需要什麼版本的OpenSSL與sha256WithRSAEncryption

openssl_sign($stuff, $signeddigest, $key, 'sha256WithRSAEncryption'); 

唉$ signeddigest返回空的,我沒有得到任何錯誤。

如果不指定'sha256WithRSAEncryption'算法,則使用默認算法返回簽名摘要。

相同的代碼在PHP 5.3.10和OpenSSL 1.0.0g上運行良好。 OpenSSL 0.9.8g不支持'sha256WithRSAEncryption'算法嗎?

+0

你能看到'openssl_get_md_methods'返回什麼嗎?你可以嘗試一個整數常量而不是'sha256WithRSAEncryption''字符串嗎?似乎API由於某些原因突然接受了字符串,這在API中似乎沒有記錄... –

+0

openssl_get_md_methods()回到未定義狀態。如果我嘗試使用一個整數常量,只有1到4與實現的算法有關 - 我本以爲'sha256WithRSAEncryption'綁定到索引47上。 –

回答

7

一位好朋友想出了一個解決方法,在舊的PHP 5.2.4和OpenSSL 0.9.8g模塊上使用sha256WithRSAEncryption。

使用可在http://www.di-mgt.com.au/rsa_alg.html的信息,他給我寫了下面的代碼片段:

function my_openssl_sign($data, &$signature, $priv_key_id, $signature_alg = 'sha256WithRSAEncryption') { 
    $pinfo = openssl_pkey_get_details($priv_key_id); 
    $hash = hash('sha256', $data); 
    $t = '3031300d060960864801650304020105000420'; # sha256 
    $t .= $hash; 
    $pslen = $pinfo['bits']/8 - (strlen($t)/2 + 3); 

    $eb = '0001' . str_repeat('FF', $pslen) . '00' . $t; 
    $eb = pack('H*', $eb); 

    return openssl_private_encrypt($eb, $signature, $priv_key_id, OPENSSL_NO_PADDING); 
} 

謝謝的Mads,你做迷死人!

+0

哇,很好的解決方案。你是否也有類似的解決方案openssl_ verify – svn

+0

不,我們在系統的那一側有一個更新的設置。 –

+0

其實我在網上找到的:https://code.google.com/p/nemid-php/source/browse/trunk/lib/Nemid.php 看看Nemid52Compat類 這也是的Mads – svn