zoukankan      html  css  js  c++  java
  • PHP、Android、iOS接口RSA加密解密

    项目需要对敏感接口进行加密解密,操作如下,记录一下方便以后查找。

    一、PHP,Android,iOS需要密钥格式

    PHP 私钥需要PKCS1格式

    Android 私钥需要PKCS8格式

    iOS 私钥需要.p12的文件格式,公钥需要.der格式

    二、Win10安装使用OpenSSL

    http://slproweb.com/products/Win32OpenSSL.html

    安装好对应的版本,并加入到环境变量中

    http://slproweb.com/download/Win64OpenSSL-1_1_1k.exe

    进入到对应文件,执行进入终端

    D:Program FilesOpenSSL-Win64inopenssl.exe

    三、使用OpenSSL生成RSA公钥和私钥

    生成私钥文件

    genrsa -out rsa_private_key.pem 2048
    
    # openssl:是一个自由的软件组织,专注做加密和解密的框架。
    # genrsa:指定了生成了算法使用RSA
    # -out:后面的参数表示生成的私钥key的文件名字
    # 2048:表示的是生成key的长度,单位字节(bits)
    
    # 此命令后会生成一个名字为rsa_private_key.pem、2048位、PKCS1格式的RSA私钥
    

    生成公钥文件

    rsa -in rsa_private_key.pem -pubout -out rsa_public_key.pem
    

    此命令会从私钥中提取出来生成一个名字为 rsa_public_key.pem 的RSA公钥

    PHP

    所需公钥、私钥已经生成,即rsa_public_key.pem、rsa_private_key.pem

    Android

    需要把私钥的格式从默认的PKCS1转换为PKCS8格式

    pkcs8 -topk8 -inform PEM -in rsa_private_key.pem -outform PEM -nocrypt -out pkcs8_private_key.pem
    

    此命令会会生成名字为pkcs8_private_key.pem的RSA私钥文件

    Android所需公钥、私钥已经生成,即rsa_public_key.pem、pkcs8_private_key.pem

    iOS

    由rsa_private_key.pem生成csr -> 生成crt -> 生成der -> 生成p12

    1、 创建证书请求

    req -new -key rsa_private_key.pem -out rsacert.csr
    

    拿着RSA私钥文件去数字证书颁发机构(即CA)申请一个数字证书。CA会给你一个新的文件cacert.pem,那才是你的数字证书。

    输入命令后会提示让输入国家、省份、地区、邮箱等信息,按要求填写或者不填都可以,最终会生成rsacert.csr 文件

    2、生成证书并签名,设置有效期10年

    x509 -req -days 3650 -in rsacert.csr -signkey rsa_private_key.pem -out rsacert.crt
    

    509是一种非常通用的证书格式

    将用上面生成的密钥rsa_private_key.pem和rsacert.csr证书请求文件生成一个数字证书rsacert.crt,这个就是公钥

    3、转换格式:将pem格式文件转换成der格式 (公钥)

    x509 -outform der -in rsacert.crt -out public_key.der
    

    在iOS开发中,公钥是不能使用base64编码的,上面的命令是将公钥的base64编码字符串转换成二进制数据

    此时生成的public_key.der就是iOS所需的RSA公钥

    4、 导出 P12 文件

    pkcs12 -export -out private_key.p12 -inkey rsa_private_key.pem -in rsacert.crt
    

    在iOS使用私钥不能直接使用,需要导出一个p12文件。此命令就是将私钥文件导出为p12文件

    此时会提示让输入密码,可输入iOS私钥文件的密码,但是请注意:在项目中读取私钥文件时需要此时设置的密码。并且此密码是生成的p12私钥文件的密码,并不是rsa_private_key.pem原始私钥文件的密码

    四、PHP相关代码

    <?php
    
    /**
     * PHP、Android、iOS 非对称加解密。
     */
    final class CryptRSA
    {
    
        /**
         * 获取私钥
         */
        private function getPrivateKey()
        {
            return '';
        }
    
        /**
         * 获取公钥
         */
        private function getPublicKey()
        {
            return '';
        }
    
        /**
         * 私钥加密
         */
        public function privateEncrypt($data = '')
        {
            if (!is_string($data)) {
                return null;
            }
            return openssl_private_encrypt($data, $encrypted, $this->getPrivateKey()) ? base64_encode($encrypted) : null;
        }
    
        /**
         * 私钥解密
         */
        public function privateDecrypt($encrypted = '')
        {
            if (!is_string($encrypted)) {
                return null;
            }
            return (openssl_private_decrypt(base64_decode($encrypted), $decrypted, $this->getPrivateKey())) ? $decrypted : null;
        }
    
        /**
         * 公钥加密
         */
        public function publicEncrypt($data = '')
        {
            if (!is_string($data)) {
                return null;
            }
            return openssl_public_encrypt($data, $encrypted, $this->getPublicKey()) ? base64_encode($encrypted) : null;
        }
    
        /**
         * 公钥解密
         */
        public function publicDecrypt($encrypted = '')
        {
            if (!is_string($encrypted)) {
                return null;
            }
            return (openssl_public_decrypt(base64_decode($encrypted), $decrypted, $this->getPublicKey())) ? $decrypted : null;
        }
    
    }
    
    //$obj = new CryptRSA();
    //$res = $obj->privateEncrypt($_GET['data']); //加密数据   
    //echo $res;
    //echo '<hr>';
    //echo $obj->publicDecrypt($res); //解密
    //exit;
    

    五、Android与iOS查看其它文章

    下面的网址可以进行验证与调试

    http://web.chacuo.net/netrsakeypair

    参考方法:

    Windows安装使用Openssl
    https://blog.csdn.net/zha6476003/article/details/80900988

    使用OpenSSL生成RSA公钥和私钥
    https://blog.csdn.net/qq_38234594/article/details/79494289

    RSA公钥、私钥的生成详解,包含Java、PHP、Android、iOS端
    https://www.jianshu.com/p/b8d8d4fea0aa

  • 相关阅读:
    Mayan游戏 (codevs 1136)题解
    虫食算 (codevs 1064)题解
    靶形数独 (codevs 1174)题解
    黑白棋游戏 (codevs 2743)题解
    神经网络 (codevs 1088) 题解
    The Rotation Game (POJ 2286) 题解
    倒水问题 (codevs 1226) 题解
    银河英雄传说 (codevs 1540) 题解
    生日蛋糕 (codevs 1710) 题解
    第一章 1.11 高阶函数
  • 原文地址:https://www.cnblogs.com/widgetbox/p/14693239.html
Copyright © 2011-2022 走看看