2

PHP 5.2.4 と OpenSSL 0.9.8g モジュールを使用して、署名付きダイジェストを作成しようとしています

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

残念ながら $signeddigest は空で返され、エラーは発生しません。

「sha256WithRSAEncryption」アルゴリズムを指定しない場合、デフォルトのアルゴリズムを使用して署名付きダイジェストが返されます。

同じコードが PHP 5.3.10 と OpenSSL 1.0.0g で正常に動作しています。「sha256WithRSAEncryption」アルゴリズムは OpenSSL 0.9.8g でサポートされていませんか?

4

1 に答える 1

10

古い 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); 
}

ありがとう、マッズ、あなたはすごい!

于 2012-06-20T10:12:33.720 に答える