为什么不同的结果与标志和私钥加密

时间:2013-02-15 22:06:03

标签: php encryption signature

我正在使用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进行加密

感谢澄清 马里奥

3 个答案:

答案 0 :(得分:2)

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

使用openssl签名涉及加密消息的散列。因此,即使使用相同的密钥,输出也会不同,因为虽然openssl_private_encrypt确实使用私钥加密,就像在签名方案中一样,但它不会散列消息,或者(可能不确定) )执行签名方案将执行的相同填充。

坚持openssl_sign,因为它比滚动你自己的签名方案更有效率,更不容易发生潜在的旁道攻击。

答案 1 :(得分:1)

看到这个答案:

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

这很有用,因为它解释了openssl_sign在返回签名之前在内部对数据执行散列,而openssl_private_encrypt要求您自己执行散列。我从概念上理解你为什么要openssl_sign(因为加密通常是用公钥完成的,而签名是用私钥完成的),但我疯了,因为SSCrypto有一个名为sign的方法,返回与openssl_private_encrypt而不是openssl_sign相同的数据,上面的答案帮我整理了一下。我正在iPhone应用程序中签署一条消息,该消息将由PHP验证;我正在使用SSCrypto进行签名并openssl_verify进行验证,但我正在使用openssl_sign进行测试,因为我需要数据与工作相同。

答案 2 :(得分:-1)

你可以用面粉制作面包,你可以用面粉制作面糊。然而,面包不是面糊,面糊不是面包。

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