2011-10-30 11 views
2

ここでプライベート2048ビットのDSA鍵でデータに署名するPHPのデモコードです:は、誰かが私のopenssl_sign例と間違って何を教えてもらえます

$priv_key = '-----BEGIN DSA PRIVATE KEY----- 
MIIDVQIBAAKCAQEA/uhSKJA6k5sSnYo+uBgi+mzJ72hqZrWgc+dNLpiiKoHsqDZ6 
7kGW0J3wnhU0FxpV2SVL57SfG6dC7GvwsJYBidSEJqe3bARP8WI4yL9wm1PVTqFD 
4zNkj1+zUZDWQWpJxaA8I10sJR08/WbwgD63bD6jg4JiPaowFMOrufYAW92hjANQ 
D7eZ+t0GXAoDB5L6q8btVRfJrGOvkdDN6eyzc7kpJEVC9g1J9Q6glnHQRIGdW4Ot 
ys/bpv2mGMfEykyTWhcMSLaAZ0YLTyKRfjYm8g7dCFWo3i8Fu0Jr+N3IWZI9Jgw5 
lGyUSX8x89gjMsqtcOzcrjOtC51oAh+pio8jaQIhAM2VbbgAoxSSVO3Nd5y2mPiO 
k62rr9cCj4tNy0MtYG3rAoIBABnMeAAeJpNpe3UhmWrGSJN/nQe76FSIhV/0wsu4 
Xu65tW610i+uf8t0ZDqHCrbF9LSvk6vPiBydKhOmmStCa/aJJZhCKYI9/8WgtXG8 
kSvAzLTNnozSLeHkapZHJwqY1wT+qxElheXjHJBRzgXVqwB+0CeJokJYlWiaPfuN 
n3H1GDekuYXSFAaK4bC4TEsctQH1/403ljSbv99aXVDTVSnW0hdbokyLSPsiJjvz 
w6GkyEiK/j6V2dTrIRn2X2ftzbTsE+0vEenHosIzJwM8+zUrhLvVvPBARWnbmsQ/ 
YstGs7WERGQzkFSsuPsWCN53Os4NnBEPiYg8//Cy1EHat3ACggEAD3mqwlAaPixs 
Up49/HYlGqrU4e862rWY7mb5XRJ7AY9t70C5hhZrVO/DTgpGkwO0Yi/cYo6W0g// 
cP73Nb2KZwaiyTCet2VsXb0H/8gvi8OqlidEpormedYW1T0DoyVrw57gXF0hp0D8 
scfZBg0hFM/hHlmqHPKYiZtDp5imk5TeSyIoLdyJjW8jII2ni8ryStjvZ61aAPyK 
VH8in3DpVANpn3MSGv1Hv1RYxaago71fVUyOkm1/pFNqBNIwBAxBIUsIPdNpjoGB 
bLKXDshCfdXkQJxnx80nVDslEkv10BapLqIr98uswU/bBYMduF6Xrg5pdugDG3Cw 
X8n3glog8QIgayYvNGvBvrDp9piq8RDg9mQJsd4IFBlpF7MnqIc749M= 
-----END DSA PRIVATE KEY----- 
'; 

$pkeyid = openssl_get_privatekey($priv_key); 
if(empty($pkeyid)){ 
    die("Can't load key id"); 
} 
$data = $_GET['i']; 
// compute signature 
if(!openssl_sign($data, $signature, $pkeyid,OPENSSL_ALGO_SHA1)){ 
    echo "Failed to sign data: $data"; 
} 
// free the key from memory 
openssl_free_key($pkeyid); 
echo $signature; 

スクリプトは常にopenssl_signで失敗します。 私はopenssl_signの出力にエラーや障害、単にFALSEを得ていないことだし、$署名は、私が間違っている可能性は何

openssl dsaparam -out dsaparam.pem 2048 
openssl gendsa -out privkey.pem dsaparam.pem 

で鍵を生成した

空のですか?

+0

どのように失敗しますか?エラー?警告?何かエラーがありましたか? –

+0

エラーなし、警告なし、ただ0を返し、$ signatureは空です。私は "データに署名できませんでした:テスト"というメッセージが表示されています –

+0

PHPがOpenSSLについて知っていることを確認しましたか? –

答えて

4

DSAを使用して物に署名する場合、OPENSSL_ALGO_SHA1ではなくOPENSSL_ALGO_DSS1をハッシングアルゴリズムとして使用する必要があります。

help file for the OpenSSL command-line version of thisは言う:

あなたはDSAアルゴリズムを使用してデータを署名するか検証したい場合は、DSS1ダイジェストを使用する必要があります。

これはOpenSSLライブラリの特異性ですが、DSS1は実際にはSHA1と同じアルゴリズムですが、OpenSSLはDSAで使用している場合はDSS1と主張します。

関連する問題