RSA加密解密(php)

困扰了两天的问题,终于解决了,ok,现在让我发个博客庆祝一下吧.....(开场不知道说啥),言归正传,现在我来说下我这两天踩得坑,有问题的欢迎留言,互相交流

1.关于RSA加密

RSA加密算法是一种非对称加密算法,非对称,意味着这个算法需要一对秘钥,分为公钥和私钥,公钥私钥都可以进行加密解密,哪个加的密,就必须用这一套的另外一个钥进行解密

RSA加密和MD5加密最大的区别就在于,RSA是可逆的,只要有相应的私钥就可以解开;而MD5是不可逆的,

2.使用场景

第一种用法:公钥加密,私钥解密。

这一种是做为信息加密用的,发送者通过公钥加密信息, 只有持有私钥的人才能解密. 保证了被发送的信息不会被第三方知晓。

第二种用法:私钥签名,公钥验签。

这一种适用于数字签名和验证,A使用自己的私钥,生成数字签名给B发消息,B利用公钥进行验签,确定发送方是否为A。

3.实现方式

openssl提供了对RSA的支持,使用时要注意是否打开了openssl的拓展,并注意以下问题。

注意点: RSA加密的明文长度是有限的,百度之后发现很多人说,明文长度要小于等于秘钥长度-11,然后我仔细去找了一下长度是怎么计算的,可参考下面图片上的内容,(附上链接RSA加密长度说明

我也是因为这个问题被困扰了两天,于是,我开始在网上找解决办法:加密的时候117个字符加密一次,然后把所有的密文拼接成一个密文;解密的时候需要128个字符解密一下,然后拼接成数据。ok,问题解决,大家可以参照PHP RSA密文过长加密解密 越过1024的解决代码,顺便附上我的代码

<?php
namespace Org\Weixin;
 
class  RSA{
        private $pi_key='';//私钥(用于用户加密)
        private $pu_key='';//公钥(用于服务端数据解密)
     
        public function __construct(){
            $this->pi_key = openssl_pkey_get_private(file_get_contents('./php_private.pem'));//私钥,用于加密

            $this->pu_key = openssl_pkey_get_public(file_get_contents('./php_public.pem'));//公钥,用于解密
        }
     
        //私钥加密
        /*public function PrivateEncrypt($data){
            openssl_private_encrypt($data,$encrypted,$this->pi_key);
            $encrypted = $this->urlsafe_b64encode($encrypted);//加密后的内容通常含有特殊字符,需要编码转换下,在网络间通过url传输时要注意base64编码是否是url安全的
            return $encrypted;
        }*/
 
        public function PrivateEncrypt($data){
           // openssl_private_encrypt($data,$encrypted,$this->pi_key);
            $crypto = '';
            foreach (str_split($data, 117) as $chunk) {
                openssl_private_encrypt($chunk, $encryptData, $this->pi_key);
                $crypto .= $encryptData;
            }
            $encrypted = $this->urlsafe_b64encode($crypto);//加密后的内容通常含有特殊字符,需要编码转换下,在网络间通过url传输时要注意base64编码是否是url安全的
            return $encrypted;
        }
 
 
        //加密码时把特殊符号替换成URL可以带的内容
        function urlsafe_b64encode($string) {
            $data = base64_encode($string);
            $data = str_replace(array('+','/','='),array('-','_',''),$data);
            return $data;
        }
 
        //解密码时把转换后的符号替换特殊符号
        function urlsafe_b64decode($string) {
            $data = str_replace(array('-','_'),array('+','/'),$string);
            $mod4 = strlen($data) % 4;
            if ($mod4) {
                $data .= substr('====', $mod4);
            }
            return base64_decode($data);
        }
 
        //私钥加密的内容通过公钥可用解密出来
        public function PublicDecrypt($encrypted){
           // $encrypted = $this->urlsafe_b64decode($encrypted);
            $crypto = '';
            foreach (str_split($this->urlsafe_b64decode($encrypted), 128) as $chunk) {
                openssl_public_decrypt($chunk, $decryptData, $this->pu_key);
                $crypto .= $decryptData;
            }
            //openssl_public_decrypt($encrypted,$decrypted,$this->pu_key);//私钥加密的内容通过公钥可用解密出来
            return $crypto;
        }
 
        //公钥加密
        public function PublicEncrypt($data){
            //openssl_public_encrypt($data,$encrypted,$this->pu_key);//公钥加密
            $crypto = '';
            foreach (str_split($data, 117) as $chunk) {
                openssl_public_encrypt($chunk, $encryptData, $this->pu_key);
                $crypto .= $encryptData;
            }
            $encrypted = $this->urlsafe_b64encode($crypto);
            return $encrypted;
        }
 
        //私钥解密
        public function PrivateDecrypt($encrypted)
        {
            $crypto = '';
            foreach (str_split($this->urlsafe_b64decode($encrypted), 128) as $chunk) {
                openssl_private_decrypt($chunk, $decryptData, $this->pi_key);
                $crypto .= $decryptData;
            }
            //$encrypted = $this->urlsafe_b64decode($encrypted);
            //openssl_private_decrypt($encrypted,$decrypted,$this->pi_key);
            return $crypto;
        }
 
 
}

 

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
好的,那我来给你简单地介绍一下 Vue 中使用 jsrsasign 进行 RSA 加密,以及 PHP 中如何使用 jsrsasign 进行 RSA 解密的方法。 首先,你需要在 Vue 项目中安装 jsrsasign 库。可以通过 npm 安装: ``` npm install --save jsrsasign ``` 接下来,在 Vue 组件中引入 jsrsasign 库: ```js import * as jsrsasign from 'jsrsasign'; ``` 然后,你可以使用 jsrsasign 库中的 RSA 加密方法进行加密: ```js const publicKey = "-----BEGIN PUBLIC KEY-----\nMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAxWq8GIV2n8B0vzgW/9f0\n9f8sokUeMv2kEX0VtL0X+gP+3Z6z8gfk1C0yRd4XnFqT+qfQexJgNQ+6N0lR5t57\nU0BuK7pM6hBcG/auDnTJH5k1ElL6wZaZP3ZwI+o9uZp4t9N4z0QFpQ/2kQGvN9Kv\n/y5Gc0kjM+Lw6J8QHbS3WbiH+OfkD6TwHs3Sv3XrQux6OvD4lSfJtA5pxzXs7pcq\n5X1EaVQq1Gd/5yG9vNzK4+Yx+2j5hJ3bhfJ+o7bLZieVUAyjy3DkGnBfrtD+LQ+3\n2wX8A2ZVd5H/3T3Kd+JyXpVxwX1m8lO5+Ih3vz5IbJfT9dAJWS5jQbT1t6w3OzQ\n1QIDAQAB\n-----END PUBLIC KEY-----"; const encrypt = (text) => { const publicKeyObj = jsrsasign.KEYUTIL.getKey(publicKey); const encrypted = jsrsasign.KJUR.crypto.Cipher.encrypt(text, publicKeyObj); return jsrsasign.hextob64(encrypted); }; ``` 这里的 `publicKey` 是你的 RSA 公钥字符串, `encrypt` 方法用于加密传入的文本。 接下来,我们来看看在 PHP 中如何使用 jsrsasign 进行 RSA 解密。首先,你需要在 PHP 项目中引入 jsrsasign 库: ```php require_once('jsrsasign.php'); ``` 然后,你可以使用 jsrsasign 库中的 RSA 解密方法进行解密: ```php use \phpseclib\Crypt\RSA; $privateKey = "-----BEGIN PRIVATE KEY-----\nMIIEvQIBADANBgkqhkiG9w0BAQEFAASCBKcwggSjAgEAAoIBAQD9r0L2CpkLq0XJ\n..."; $ciphertext = "..."; $rsa = new RSA(); $rsa->loadKey($privateKey); $plaintext = $rsa->decrypt(jsrsasign\ASN1::hex2bin($ciphertext)); ``` 这里的 `privateKey` 是你的 RSA 私钥字符串, `ciphertext` 是加密后的密文字符串。`plaintext` 是解密后的原文字符串。 希望这个简单的例子能够帮到你。如果有任何问题,欢迎继续提问。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值