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相同的数据,并且上面的答案帮助我解决了这个问题。我正在一个 iPhone 应用程序中签署一条消息,该应用程序将由 PHP 验证;我用于签名和验证,但我正在测试,因为我需要数据与工作相同。openssl_private_encryptopenssl_signSSCryptoopenssl_verifyopenssl_sign

于 2014-07-23T21:01:07.020 回答
-3

你可以用面粉做面包,也可以用面粉做面糊。然而,面包不是面粉糊,面粉糊也不是面包。

同样,加密不是签名,签名也不是加密。

于 2013-02-15T22:11:32.413 回答