创建RSA公钥、私钥证书

下载OpenSSL工具

  • Linux用户(以Ubuntu为例)

    sudo apt-get install openssl

  • Windows用户

    开发者可以在OpenSSL官方网站下载Windows的OpenSSL安装包进行安装。

RSA私钥及公钥生成

Linux用户(以Ubuntu为例), 先在terminal下创建一个文件夹,然后进入文件夹

  • 生成私钥
genrsa -out rsa_private_key.pem 1024
  • 生成公钥
rsa -in rsa_private_key.pem -pubout -out rsa_public_key.pem

此时私钥和公钥就在当前文件夹下创建好了

以下是在mac上的生成记录

wenqidongdeMBP:~ wenqidong$ openssl genrsa -out rsa_private_key.pem 1024
Generating RSA private key, 1024 bit long modulus (2 primes)
......................+++++
.+++++
e is 65537 (0x010001)
wenqidongdeMBP:~ wenqidong$ 

wenqidongdeMBP:~ wenqidong$ openssl rsa -in rsa_private_key.pem -out rsa_public_key.pem -pubout
writing RSA key

wenqidongdeMBP:rsa wenqidong$ ls
rsa_private_key.pem rsa_public_key.pem

在PHP中,测试加密解决数据

使用私钥加密-->使用公钥解密

使用公钥加密-->使用私钥解密

    public function testRsa()
    {
        $privateKeyFilePath = '../rsa/rsa_private_key.pem';
        $publicKeyFilePath = '../rsa/rsa_public_key.pem';
        extension_loaded('openssl') or die('php需要openssl扩展支持');
        (file_exists($privateKeyFilePath) && file_exists($publicKeyFilePath)) or die('文件路径不正确');
        $privateKey = openssl_pkey_get_private(file_get_contents($privateKeyFilePath));
        $publicKey = openssl_pkey_get_public(file_get_contents($publicKeyFilePath));

        ($privateKey && $publicKey) or die('密钥或者公钥不可用');

        // 加密数据
        $originalData = '{"user_name":"admin","password":"123456","code":"9KL2"}';
        // 加密以后的数据
        $encryptData = '';
        echo '原数据为:', $originalData, PHP_EOL;

        //用私钥加密
        if (openssl_private_encrypt($originalData, $encryptData, $privateKey)) {
            // 加密后 可以base64_encode后方便在网址中传输
            echo '加密成功,加密后数据(base64_encode后)为:', base64_encode($encryptData), PHP_EOL;
        } else {
            exit('加密失败');
        }

        //用公钥解密

        //解密以后的数据
        $decryptData = '';

        if (openssl_public_decrypt($encryptData, $decryptData, $publicKey)) {
            echo '解密成功,解密后数据为:', $decryptData, PHP_EOL;
        } else {
            exit('解密成功');
        }

        // 用公钥加密数据
        if (openssl_public_encrypt($originalData, $encryptData, $publicKey)) {
            echo '公钥加密数的数据为:' . base64_encode($encryptData) . PHP_EOL;
        } else {
            exit('公钥加密失败');
        }

        // 用私钥解密数据
        if (openssl_private_decrypt($encryptData, $decryptData, $privateKey)) {
            echo "私钥解密数据后:" . $decryptData . PHP_EOL;
        } else {
            exit('私钥解密失败');
        }

    }

输出:

原数据为:{"user_name":"admin","password":"123456","code":"9KL2"} 

加密成功,加密后数据(base64_encode后)为:QN1MNSy8yKpjfE7KzcxCEoMT6h9ErJRhqsWkkVhk2CPupY8MGUgJDLcWi5Mt21bOhPVM1w5teSKysI0AONqqK1kdi0B//Q8KVdlS47HstFUbwjzk+8f1uesnEmUf549rl/Ye3B8bw77vdeVarxD3LDdxO8RC2h/bE0sav0+m0bU= 

解密成功,解密后数据为:{"user_name":"admin","password":"123456","code":"9KL2"} 

公钥加密数的数据为:edLH7O340I0WIBBdzuF0VAXDBpcIQgspFd2EZBbGYvlhn3aEo5tylkCXrAfyrgAAXakQfMsn9L4H9PdHbLLCZPbwyjYYpVmN2P0CryqTedAliKmwaH66eSundWyvT8G0CE6VRc/d3Gu5bivcPgMOKBZFCY8fUVUnsF5YZU10UiI= 

私钥解密数据后:{"user_name":"admin","password":"123456","code":"9KL2"}

参见:支付宝rsa私钥公钥创建与提交 https://blog.csdn.net/zhouhui520w/article/details/49885135

linux 需要安装openssl工具包,传送门http://www.openssl.org/source/

window 下需要安装openssl的程序,传送门http://slproweb.com/products/Win32OpenSSL.html