我正在使用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
进行加密
感谢澄清 马里奥
答案 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)
你可以用面粉制作面包,你可以用面粉制作面糊。然而,面包不是面糊,面糊不是面包。
同样,加密不是签名,签名不是加密。