Php 为什么使用私钥签名和加密会产生不同的结果

Php 为什么使用私钥签名和加密会产生不同的结果,php,encryption,signature,Php,Encryption,Signature,我正在用openssl编码,我想知道,为什么openssl签名函数在逻辑意义上给出了与openssl\u private\u encrypt不同的结果 特别是openssl_标志: $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="f2e

我正在用openssl编码,我想知道,为什么openssl签名函数在逻辑意义上给出了与
openssl\u private\u encrypt
不同的结果

特别是openssl_标志:

$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.......
为什么
reto 22
$reto
不同?他们应该是一样的,不是吗? 据我所知,用
priv key=sign
加密

谢谢你的澄清
马里奥你可以用面粉做面包,也可以用面粉做面包。然而面包不是面包,面包也不是面包


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

一般来说,公钥系统中的加密是使用公钥执行的(以便可以使用私钥对其进行解密),而签名是使用私钥执行的(以便可以使用公钥对其进行验证)

使用openssl的签名涉及对消息的哈希进行加密。因此,即使使用相同的密钥,输出也会有所不同,因为虽然
openssl\u private\u encrypt
确实像在签名方案中一样使用私钥进行加密,但它不会散列消息,或者(可能不确定)执行与签名方案相同的填充

坚持使用
openssl\u sign
,因为与使用自己的签名方案相比,它效率更高,更不容易受到潜在的旁道攻击。

请参见以下答案:


这很有帮助,因为它解释了
openssl\u-sign
在返回签名之前在内部对数据执行哈希,而
openssl\u-private\u-encrypt
要求您自己执行哈希。我从概念上理解了为什么您想要
openssl\u签名
(因为加密通常是用公钥完成的,而签名是用私钥完成的),但我快发疯了,因为SSCrypto有一个名为
sign
的方法,它返回的数据与
openssl\u private\u encrypt
相同,而不是
openssl\u sign
,上面的答案帮助我解决了这个问题。我在iPhone应用程序中签署了一条消息,该消息将由PHP验证;我使用
SSCrypto
进行签名,并使用
openssl\u-verify
进行验证,但我使用
openssl\u-sign
进行测试,因为我需要与工作相同的数据。

我看到,在第一种情况下,每个人都可以看到文本,但事实证明是真实的。在第二种情况下,没有人会看到文本,受到保护。我想我的感激是对的。至少听起来是合理的。只有一个细节,在这两种情况下,我都使用私钥加密,我使用接收者的公钥,所以他是唯一一个看到的人,在应用私钥后,疑问仍然存在,这两部分不是一样的吗?或者什么是区别?谢谢你的建议,对不起,你最后说了什么?“内置结构”????它是一个软件吗?也许我的困惑在于函数openssl\u private\u encrypt的名称。在加密是使用接收方的公钥的情况下,为什么在函数中使用术语private?对我来说似乎矛盾或困惑。我有点误读了你的问题,所以最后一段不太合适<正如文档所述,code>openssl\u encrypt\u private确实使用私钥加密。从简单的意义上讲,对消息进行签名只是用私钥对其进行加密,但签名中还有其他内容,正如我更新了答案所反映的那样。我也想了解
openssl\u private\u encrypt
openssl\u sign
之间的区别,而当前的答案似乎无法很好地解释这一点。