我们相信:世界是美好的,你是我也是。平行空间的世界里面,不同版本的生活也在继续...

大家已经会使用jsencrypt对数据进行加密解密了,苏南大叔也说了,在前端角度上来看的话,更常用的就是加密了。所以,从后端角度上来说,解密就是重要的工作了。那么,在本篇文章中,苏南大叔将要讲述:如何利用phpRSA算法对数据进行加密解密。

苏南大叔:php如何使用RSA加密或解密数据? - php-rsa
php如何使用RSA加密或解密数据?(图3-1)

本文测试环境:mac/php72

前言

php版本的RSA加密解密中,掺杂着base64加解密的过程,而且公钥和私钥都不是可以直接使用字符串的,需要使用函数先处理一下。这个加密解密过程,和jsRSA,是可以相互处理数据的。前提就是两者的公钥和私钥保持一致。

如何获得一对RSA公钥私钥呢?

另外,php需要开启libssl.so扩展,可以参考下面的这篇文章:

前端javascript使用rsa算法的例子,如下:

密钥对处理

获得的公钥和密钥在php里面使用的时候,可以直接使用,不用像js一样,再去除一下回车换行。这是因为php本身的语言特性所决定的。

例如,在php里面定义个公钥(公钥内容并不完整,由于篇幅限制,下面仅为示意),可以这样定义:

define('RSA_PUBLIC', '-----BEGIN PUBLIC KEY-----
UVlVw+rQnYYyVuiLAgMBAAE=
-----END PUBLIC KEY-----');

或者也可以这样定义:

$rsa_public = "-----BEGIN PUBLIC KEY-----
UVlVw+rQnYYyVuiLAgMBAAE=
-----END PUBLIC KEY-----";

苏南大叔:php如何使用RSA加密或解密数据? - php-rsa-defined
php如何使用RSA加密或解密数据?(图3-2)

公钥加密,私钥解密(推荐)

公钥加密

下面的是个RSA公钥加密的范例:

function encode($data){
    $key = openssl_pkey_get_public(RSA_PUBLIC);
    if (!$key) {
        return('公钥不可用');
    }
    $_ret = openssl_public_encrypt($data, $crypted, $key);
    if (!$_ret) {
        return('加密失败,请检查RSA秘钥');
    }
    return base64_encode($crypted);
}

私钥解密

下面的是个RSA私钥解密的范例:

function decode($data){
    $private_key = openssl_pkey_get_private(RSA_PRIVATE);
    if (!$private_key) {
        return('私钥不可用');
    }
    $_ret = openssl_private_decrypt(base64_decode($data), $decrypted, $private_key);
    if (!$_ret) {
        return('解密失败,请检查RSA秘钥');
    }
    return $decrypted;
}

苏南大叔:php如何使用RSA加密或解密数据? - php-rsa-code
php如何使用RSA加密或解密数据?(图3-3)

私钥加密,公钥解密

私钥加密

下面的是个RSA私钥加密的范例:

function encode($data){
    $key = openssl_pkey_get_private(RSA_PRIVATE);
    if (!$key) {
        return('私钥不可用');
    }
    $_ret = openssl_private_encrypt($data, $crypted, $key);
    if (!$_ret) {
        return('加密失败,请检查RSA秘钥');
    }
    return base64_encode($crypted);
}

公钥解密

下面的是个RSA公钥解密的范例:

function decode($data){
    $key = openssl_pkey_get_public(RSA_PUBLIC);
    if (!$key) {
        return('公钥不可用');
    }
    $_ret = openssl_public_decrypt(base64_decode($data), $decrypted, $key);
    if (!$_ret) {
        return('解密失败,请检查RSA秘钥');
    }
    return $decrypted;
}

注意事项

  • 这里要特别强调一下,上述系列加密解密函数里面的第二个参数和返回值。所有的第二个参数都是引用类型的,而他们的返回值,只是用于显示加密或者解密的成果。那么,这个openssl_*_*系列函数,就是显得那么的沙雕。大家所希望的他们的返回值,并不出现在等式的左侧,而是在右侧的第二个引用参数里面。这个和大家的习惯是非常不一致的。
  • 虽然,大家一般都是使用公钥加密,然后再使用私钥解密的。但是事实上,RSA作为一个非对称加密。也是可以使用私钥加密,然后使用公钥解密的。这个虽然不常见,但是事实上是可以运行的。

总结

在实际应用过程中,可以前端js加密,后端php解密。这样,就可以形成功能上的闭环了。唯一需要注意的地方,就是两者的密钥对要保持一致。更多rsa相关博客文章,请参见苏南大叔的博客:

如果本文对您有帮助,或者节约了您的时间,欢迎打赏瓶饮料,建立下友谊关系。
本博客不欢迎:各种镜像采集行为。请尊重原创文章内容,转载请保留作者链接。

 【福利】 腾讯云最新爆款活动!1核2G云服务器首年50元!

 【源码】本文代码片段及相关软件,请点此获取更多信息

 【绝密】秘籍文章入口,仅传授于有缘之人   php    rsa