非对称加密
非对称加密算法需要两个密钥来进行加密和解密,这两个秘钥是公开密钥(public key,简称公钥)和私有密钥(private key,简称私钥)。
RSA加密算法
RSA是目前最有影响力的公钥加密算法,该算法基于一个十分简单的数论事实:将两个大素数相乘十分容易,但那时想要对其乘积进行因式分解却极其困难,因此可以将乘积公开作为加密密钥,即公钥,而两个大素数组合成私钥。公钥是可发布的供任何人使用,私钥则为自己所有,供解密之用。
解密者拥有私钥,并且将由私钥计算生成的公钥发布给加密者。加密都使用公钥进行加密,并将密文发送到解密者,解密者用私钥解密将密文解码为明文。
以甲要把信息发给乙为例,首先确定角色:甲为加密者,乙为解密者。首先由乙随机确定一个KEY,称之为密匙,将这个KEY始终保存在机器B中而不发出来;然后,由这个 KEY计算出另一个KEY,称之为公匙。这个公钥的特性是几乎不可能通过它自身计算出生成它的私钥。接下来通过网络把这个公钥传给甲,甲收到公钥后,利用公钥对信息加密,并把密文通过网络发送到乙,最后乙利用已知的私钥,就对密文进行解码了。以上就是RSA算法的工作流程。
生成公私钥
生成私钥文件
openssl genrsa -out rsa_private_key.pem 1024
利用私钥,生成公钥
openssl rsa -in rsa_private_key.pem -pubout -out rsa_public_key.pem
PHP RSA 实现
分为两种情况
公钥加密=>私钥解密
class RSA { /** * 使用公钥加密 * * @static * @param string $str 要加密的字符串 * @param string $publicKey 公钥文件内容 * @return string */ public static function encryptWithPublicKey(string $str, string $publicKey) { $encrypted = ''; $publicKey = openssl_pkey_get_public($publicKey); openssl_public_encrypt($str, $encrypted, $publicKey); return base64_encode($encrypted); } /** * 使用私钥解密 - 用于解密公钥加密的数据 * * @static * @param string $str 要解密的数据 * @param string $privateKey 私钥文件内容 * @return string */ public static function decryptWithPrivateKey(string $str, string $privateKey) { $decrypted = ''; $privateKey = openssl_pkey_get_private($privateKey); openssl_private_decrypt(base64_decode($str), $decrypted, $privateKey); return $decrypted; } }
私钥加密=>公钥解密
class RSA { /** * 使用私钥加密 * * @static * @param string $str 要加密的字符串 * @param string $privateKey 私钥文件内容 * @return string */ public static function encryptWithPrivateKey(string $str, string $privateKey) { $encrypted = ''; $privateKey = openssl_pkey_get_private($privateKey); openssl_private_encrypt($str, $encrypted, $privateKey); return base64_encode($encrypted); } /** * 使用公钥解密 - 用于解密私钥加密的数据 * * @static * @param string $str 要解密的数据 * @param string $publicKey 公钥文件内容 * @return string */ public static function decryptWithPublicKey(string $str, string $publicKey) { $decrypted = ''; $publicKey = openssl_pkey_get_public($publicKey); openssl_public_decrypt(base64_decode($str), $decrypted, $publicKey); return $decrypted; } }
文章来源:
鸿辰
版权声明:本网站可能会转载或引用其他来源的文章、图片、数据等信息。对于这些转载内容,版权归原作者所有。本站尊重原作者的劳动成果,并在可能的情况下注明来源和作者。如有任何版权问题,请及时联系,收到后将第一时间处理。