2

opensslを使用して新しいキーペアを作成し、秘密キーを使用してデータに署名し、公開キーを使用して署名を検証すると、機能します。

$ openssl genrsa -out mykey.pem 1024
$ openssl rsa -in mykey.pem -pubout > mypubkey.pem
$ echo 'It could be bunnies' > file.txt
$ openssl rsautl -sign -in file.txt -inkey mykey.pem -out sig.txt
$ openssl rsautl -verify -in sig.txt -inkey mypubkey.pem -pubin
It could be bunnies

ただし、phpのopensslライブラリを使用して署名を検証しようとすると、失敗します。

$pubkey = openssl_pkey_get_public(file_get_contents('/var/key/mypubkey.pem')); 
$sig = file_get_contents('/var/key/sig.txt');
$data = file_get_contents('/var/key/file.txt');
$verifyResult = (openssl_verify($data, $sig, $pubkey) == 1);

Crypt_RSAと同様の話

$pubkey = file_get_contents('/var/test/mypubkey.pem');
$sig = file_get_contents('/var/test/sig.txt');
$data = file_get_contents('/var/test/file.txt');
$rsa = new Crypt_RSA();
$rsa->loadKey($pubkey);
$rsa->verify($data, $sig);
$verifyResult = $rsa->verify($data, $sig);

PHPをうまく再生するにはどうすればよいですか?これらの例は単純化されていますが、私のニーズには正確です。現実の世界では、データ、署名、公開鍵しかありません...

4

2 に答える 2

2

私は、誰かが公開鍵の質問に対する決定的な答えを出してくれることを本当に望んでいました。うまくいくようです。ただし、その間に、公開鍵から自己署名証明書に切り替えました。PHPのopensslライブラリは、そこから受け入れ可能な公開鍵を抽出することに満足しているようです。つまり、本当の問題(署名されたデータの検証)が解決されたということです。これで、サーバークライアントにデータ、署名、およびx.509証明書が割り当てられます。

コードスニペットは次のとおりです。

$ openssl genrsa -out server.key 4096
$ openssl req -new -key server.key -out server.csr
$ openssl x509 -req -days 365 -in server.csr -signkey server.key -out server.crt
$ openssl dgst -sha1 -sign server.key -out file.sha1 file.txt

..。

$pubkey = openssl_pkey_get_public(file_get_contents('/var/key/server.crt')); 
$sig = file_get_contents('/var/key/file.sha1');
$data = file_get_contents('/var/key/file.txt');
$verifyResult = (openssl_verify($data, $sig, $pubkey) == 1);
于 2012-05-15T15:53:32.800 に答える
1

phpseclibの場合、$ rsa-> verify()を呼び出す前に、$ rsa-> setSignatureMode(CRYPT_RSA_SIGNATURE_PKCS1)を試してください。

于 2012-05-15T16:04:27.713 に答える