2

私はopensslでコーディングしていますが、openssl_sign関数がopenssl_private_encrypt論理的な意味とは異なる結果をもたらす理由を知りたいです。

具体的には openssl_sign を使用:

$fp = fopen("i.pem", "r");  //i.pem is the private key file
$priv_key = fread($fp, 8192);
fclose($fp);
$pkeyid = openssl_get_privatekey($priv_key);

$data="f2e140eb-2b09-44ab-8504-87b25d81914c";
openssl_sign($data, $signature, $pkeyid);
$reto22 = base64_encode($signature);    //this gives UNmlEfwISea9hoGfiwdM.......

特に openssl_private_encrypt を使用する場合:

$llave_priv = file_get_contents("i.pem");  //i.pem is the private key file
$plaintext = "f2e140eb-2b09-44ab-8504-87b25d81914c";
openssl_private_encrypt($plaintext, $encrypted, $llave_priv);
$reto = base64_encode($encrypted);  //this gives ugSMAsCQlIKIlQ17exIvSEqkA60.......

reto22がと異なるのはなぜ$retoですか? それらは同じであるべきですよね?priv key = sign私の知る限り、で暗号化する

マリオを明確にしてくれてありがとう

4

3 に答える 3

2

一般的に言えば、公開鍵システムでの暗号化は公開鍵を使用して実行され(秘密鍵を使用して復号化できるようにするため)、署名は秘密鍵を使用して実行されます(公開鍵を使用して検証できるようにするため)。

openssl による署名には、メッセージのハッシュの暗号化が含まれます。そのため、同じキーが使用されていても、出力は異なりopenssl_private_encryptます。これは、署名方式の場合のように秘密キーを使用して暗号化するため、メッセージをハッシュしないか、(おそらく確実ではありませんが)同じパディングを実行するためです。署名スキームが実行すること。

openssl_sign独自の署名スキームを展開するよりも効率的であり、潜在的なサイドチャネル攻撃の可能性が低いため、 に固執してください。

于 2013-02-16T19:04:55.367 に答える
1

この回答を参照してください:

https://stackoverflow.com/a/2706636/1359088

openssl_sign署名を返す前に内部でデータのハッシュを実行することを説明しているのに対し、openssl_private_encrypt自分でハッシュを実行する必要があるため、役に立ちます。あなたがしたい理由を概念的に理解していますopenssl_sign(暗号化は通常公開鍵で行われるのに対し、署名は秘密鍵で行われるため)が、SSCryptoにはではなくsignと同じデータを返すという名前のメソッドがあるため、私は夢中になりました。上記の回答は、それを整理するのに役立ちました。PHP によって検証される iPhone アプリでメッセージに署名しています。私は署名と検証に使用していますが、動作するデータが同一で​​ある必要があるため、テストしています。openssl_private_encryptopenssl_signSSCryptoopenssl_verifyopenssl_sign

于 2014-07-23T21:01:07.020 に答える
-3

小麦粉を使ってパンを作ったり、小麦粉を使ってルウを作ったりできます。しかし、パンはルーではなく、ルーはパンではありません。

同様に、暗号化は署名ではなく、署名は暗号化ではありません。

于 2013-02-15T22:11:32.413 に答える