使用openssl_public_encrypt加密的数据每次都不同?

pan*_*nny 3 php encryption openssl rsa

为什么$每次加密的内容都不同?

// aquire public key from server
$server_public_key = openssl_pkey_get_public(file_get_contents("C:\publickey.pem"));

// rsa encrypt
openssl_public_encrypt("123", $encrypted, $server_public_key);
Run Code Online (Sandbox Code Playgroud)

我也试过这个

$publicKey = "file://C:/publickey.pem";
$privateKey = "file://C:/privatekey.pem";
$plaintext = "String to encrypt";

openssl_public_encrypt($plaintext, $encrypted, $publicKey);
$transfer = base64_encode($encrypted);
openssl_private_decrypt($encrypted, $decrypted, $privateKey);

echo $transfer;  //encrypted string
Run Code Online (Sandbox Code Playgroud)

和$ transfer每次都是不同的字符串:...

Z1xyMUquARxcGjqjjSHNAm41CnHI02GXxLyFivvta8YhDkhRJdD4i3kx + 8GElljdiSY/NMF9UD3ritWMLGmscdq/QyIf + geYxJFePNd1dNWg + V6zbAKRLaEpsU + aB87jiM/GjytLEkI63dku02BS0ZBgz9UZw/FDNaynV5bTTDM =

mRgLPsPtMoV9la7zzuU + cLzS5xMDp7QUmH6Iv4Sv4/FNjt62zcv9ZMWkfG3uVhS8Z1UDtGl + met1CYjBTcfjHCR6hahbwOkTCICXtkRQcc371vURW04XhQzMNgIIbvN5BBdmIyYI6alrS2vKUq7b3T0h8sJf36zh5CynYzyDCFU =

G5FhMoJGiUwEBvEOeZpDDrEXdxbWX5iaJ6F + VdYJ3CURPRMftskZNlDhat8gA5V0G + 3nXVQZptkHjxMkOqPlmwJHjgIqAiFppHLpEKohyT9qNwkAR00Y6PiWrNUJPiEIZqXHAb8TS0AA0Quhc0UAwcc + I8NGOD59k8BrZE6Z5Ew =

ZZ *_*der 5

PKCS#1加密算法使用一些随机种子来使密码文本每次都不同.

这可以保护密文免受多种攻击,如频率分析,密文匹配.例如,如果您使用公钥来加密所有密码而没有随机性.所有相同的密码将产生相同的密文.有人可以通过检查密文的频率来找出所有流行的密码.

对于对称密钥加密,IV(初始向量)用于类似目的.

  • @panny:请阅读PKCS#1规范.您不需要按照要求进行操作,PKCS#1格式可以在不事先知道的情况下通过解密器删除随机位.你的rsa解密功能几乎肯定会为你做这件事. (2认同)