jsencrypt实现rsa前端加密php后台解密

RSA加密算法是一种非对称加密算法,RSA加密使用了"一对"密钥.分别是公钥和私钥,这个公钥和私钥其实就是一组数字!其二进制位长度可以是1024位或者2048位.长度越长其加密强度越大,目前为止公之于众的能破解的最大长度为768位密钥,只要高于768位,相对就比较安全.所以目前为止,这种加密算法一直被广泛使用.

 

RSA秘钥生成方式

Mac系统内置OpenSSL(开源加密库),所以可以直接在终端上使用命令。

Windows系统可以使用git命令行工具

单击鼠标右键——git bash here 调出git bash

生成私钥,密钥长度为1024bit

从私钥中提取公钥

  $ openssl rsa -in private.pem -pubout -out public.pem

  writing RSA key

这样就生成了private.pem 和 public.pem两个文件,可以利用终端进行查看

 

jsencrypt是一个基于rsa加解密的js库

安装方法 npm install jsencrypt

目前的应用场景是在用户注册或登录的时候,用公钥对密码进行加密,再去传给后台,后台用私钥对加密的内容进行解密,然后进行密码校验或者保存到数据库。

 

前端代码

传递到php后台的是公钥加密的数据

    <!-- 引入jsencrypt.js文件 -->

    <script src="https://cdn.bootcss.com/jsencrypt/3.0.0-beta.1/jsencrypt.js"></script>

   <script>

    //公钥 PKCS8(JAVA适用)

    var PUBLIC_KEY = 'MIGfMA0GCSqGSIb3DQEBA';

    //私钥

    var PRIVATE_KEY ='MIICdwIBADANBgkqhkiG9';

    //PKCS1(非JAVA适用) 

    //var PUBLIC_KEY ='MIGfMA0GCSqGSIb';

    //var PRIVATE_KEY ='MIICWwIBAAKBgQCXn41';

    //使用公钥加密

    var encrypt = new JSEncrypt();

    encrypt.setPublicKey('-----BEGIN PUBLIC KEY-----' + PUBLIC_KEY + '-----END PUBLIC KEY-----');

    var encrypted = encrypt.encrypt("张三666");

    console.log('加密后数据:%o', encrypted);

 

    //使用私钥解密 不需要可以删除,方便测试查看使用

    var decrypt = new JSEncrypt();

    decrypt.setPrivateKey('-----BEGIN RSA PRIVATE KEY-----'+PRIVATE_KEY+'-----END RSA PRIVATE KEY-----');

    var uncrypted = decrypt.decrypt(encrypted);

    console.log('解密后数据:%o', uncrypted); // 张三

    //ajax 请求后台

    $.ajax

        ({

            url: "/index/Test/rsa",

            dataType: "json",

            type: "POST",

            data: {

                    encrypted: encrypted,

                  },

            success:function(res){

                   console.log(res);  //解密后的数据

            },

            error:function(){

                alert('failed!');

            },

        });

    </script>

后台私钥php解密

public function rsa(){

        if($this->request->isPost()){

            $encrypted=$this->request->post('encrypted');

            //私钥 PKCS8(JAVA适用)

            $pri ='MIICdwIBADANBgkqhkiG9w0BAQEFAASCAmEwg';

            //PKCS1(非JAVA适用) 解密不了

            //$pri ='MIICWwIBAAKBgQCXn41kvOtvur5bwUMW';

            

            //解密方式一

            $pem = chunk_split($pri, 64, "\n");

            $pem = "-----BEGIN PRIVATE KEY-----\n" . $pem . "-----END PRIVATE KEY-----\n";

            $prikeyid = openssl_pkey_get_private($pem);

            $crypttext = base64_decode($encrypted);

            if (openssl_private_decrypt($crypttext, $sourcestr, $prikeyid, OPENSSL_PKCS1_PADDING))

            {

                $this->success('成功','',['后台解密结果'=> $sourcestr]);

            }

            //解密方式二,我用的fastadmin系统,自带了rsa解密类,如果系统没有请使用解密方式一

           /* $rsa=new \fast\Rsa('',$pri);

            $this->success('成功','',['后台解密结果'=> $rsa->privDecrypt($encrypted)]);*/

        }

        return $this->view->fetch();

    }

如果解密不了,整理下公钥的字符串格式,还有就是生成的非JAVA的私钥也是解密不了的

 

有话要说