zoukankan      html  css  js  c++  java
  • linux下OpenSSL的RSA密钥生成

    工具的安装:

    一.源码安装

    OpenSSL Version:openssl-1.0.0e.tar.gz

    ------------------------安装:

    1、将下载的压缩包放在根目录,

    2、在文件夹下解压缩,

    命令:tar -xzf  openssl-openssl-1.0.0e.tar.gz

    得到openssl-openssl-1.0.0e文件夹

    3、进入解压的目录:cd openssl-1.0.0e

    4、设定Openssl 安装,( --prefix )参数为欲安装之目录,也就是安装后的档案会出现在该目录下:

    执行命令:./config  --prefix=/usr/local/openssl

    5、执行命令./config  -t

    6.执行make,编译Openssl

    ----------------------完成安装。

    二,yum安装

    #yum install openssl* -y

    1.生成秘钥:(生成1024位的私钥,不指定的话默认2048位)

    输入“genrsa -out rsa_private_key.pem 1024”命令,回车后,在当前 bin 文件目 录中会新增一个 rsa_private_key.pem 文件,其文件为原始的商户私钥(请妥善保 存该文件,PHP 开发语言中需要使用该文件)

    [root@wentao12 ~]# openssl genrsa -out rsa_private_key.pem 1024

    2.生成公钥:(根据这个私钥生成公钥)

    输入“rsa -in rsa_private_key.pem -pubout -out rsa_public_key.pem”命令回车 后,在当前 bin 文件目录中会新增一个 rsa_public_key.pem 文件,其文件为原始 的商户公钥(请妥善保存该文件,PHP 开发语言中需要使用该文件)

    [root@wentao12 ~]# openssl rsa -in rsa_private_key.pem -pubout -out rsa_public_key.pem

    3.生成PKCS8 编码的私钥

    输入命令“pkcs8 -topk8 -inform PEM -in rsa_private_key.pem -outform PEM -nocrypt”并回车,当前界面中会直接显示出生成结果

    [root@wentao12 ~]# openssl pkcs8 -topk8 -inform PEM -in rsa_private_key.pem -outform PEM -nocrypt

    ,把复制的内容粘 贴进一个新的记事本中,可随意命名,只要知道这个是 PKCS8 格式的私钥即可(请 妥善保存该文件)

    经过我测试就用屏幕打印的这个作为私钥,

    公钥查看:#cat rsa_public_key.pem

    注意文件格式前后标记符不能去掉,可以正常加密解密。

    例子:

    <?php
    /**
     * Created by PhpStorm.
     * User: Administrator
     * Date: 2018/4/1
     * Time: 1:50
     */
    
    //注意格式一定要有下面的标识符
    $pub_key = "-----BEGIN PUBLIC KEY-----
    MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQC+p18S45D/xf+EpDpRDwMLp7Im
    edUzYhPUAy5orgPnOIwjUo7jDb6Zsn6axv5gDA+ooaxZoT+fXz2gNDhlvCWanLIv
    i0o2X6G5l1rCarb8irOQOyAP4Z3M8Pj9maaG3zwU251udcVTcLpV2q65sMKaJBOI
    jPpzwPFo+RU040k0kwIDAQAB
    -----END PUBLIC KEY-----";
    $pri_key = "-----BEGIN RSA PRIVATE KEY-----
    MIICXAIBAAKBgQC+p18S45D/xf+EpDpRDwMLp7ImedUzYhPUAy5orgPnOIwjUo7j
    Db6Zsn6axv5gDA+ooaxZoT+fXz2gNDhlvCWanLIvi0o2X6G5l1rCarb8irOQOyAP
    4Z3M8Pj9maaG3zwU251udcVTcLpV2q65sMKaJBOIjPpzwPFo+RU040k0kwIDAQAB
    AoGAcrevA2SeuOhgiWVwGZoY0QiEr5YbbSGUoLuRTzd17ckeuZpRk9mPWFgIygT2
    xsA7I9K0K/JUoAbkw+LoFH8TeFtxrq28L3jZE8Xr5MTrxVb4sImWwsJ/+bEW51Zs
    6bp03/2SIVwtl1SkH9zyJlEWlEhb41KGIm0dC1ctMKE2HEECQQD12wFNSCqOyOEU
    LffZKD/IqoHVU2RfGevft1/08OG7cVp+4YMZ+gRTsRYZDEkPTG8SjHxbTBxJ/EH/
    qFDlOhrRAkEAxoVD+xJBRqu11uIXafd5reJrfTa0qwupYuTiH7c3EWPa5YRKg6Xk
    pTnUstvl0FBjwyTJ9iDTcChYFx2c/q1qIwJAWDAao3IDcfw0YFyszsRVPNGMiMzE
    8CgIJ9NLJD1Tez0JzQFvWV4JN0wKNSnm+wnbvbeO0+DVNOS7d80UV2UkQQJAMDb7
    rMXhPrXDgz4EK8NkNRwxuQaJWKWLbS5j0QohgMK8zlOT+WdYIdzq0MnhhfeQUzvj
    JTkRwUK7KloR4DTj+wJBAJwRkRVtyNKfH/nb6WkTAVqRjoecLJHIN/JT3UzgzD6X
    ybxwxyupVw8aK1QZDYwn9LVqru2WjpG99JXxEcSP+vY=
    -----END RSA PRIVATE KEY-----";
    
    
    $str = "这个是要加密的字符4567串888";
    
    //这个例子是演示RSA加密
    //非对称加密 分为 公钥和私钥
    //通常 公钥加密 私钥解密,私钥加密,公钥解密
    
    /*
     * 用到的加密函数
    openssl_private_decrypt — Decrypts data with private key
    openssl_private_encrypt — Encrypts data with private key
    openssl_public_decrypt — Decrypts data with public key
    openssl_public_encrypt — Encrypts data with public key
     *
     */
    
    //echo $private_key;
    $pi_key =  openssl_pkey_get_private($pri_key);//这个函数可用来判断私钥是否是可用的,可用返回资源id Resource id
    $pu_key = openssl_pkey_get_public($pub_key);//这个函数可用来判断公钥是否是可用的
    //print_r($pi_key);echo "
    ";
    //print_r($pu_key);echo "
    ";
    
    
    //公钥加密过程
    $enStr = '';
    openssl_public_encrypt($str,$enStr,$pu_key);
    //加密后的字符 有些无法显示 需要 base64_encode ( string $data ) ,解密的时候不需要要 base64_decode ( string $data )
    echo base64_encode ($enStr);
    echo "<br/>";
    
    
    //私钥解密过程
    $deStr = '';
    //$enStr = base64_decode ( $enStr);
    openssl_private_decrypt($enStr,$deStr,$pi_key);
    echo $deStr;
    echo "<br/>";
    
    
    //下面是签名验证例子,验证签名 一定是用公钥去验证 对方私钥加密的结果
    $binary_signature = "";
    // At least with PHP 5.2.2 / OpenSSL 0.9.8b (Fedora 7)
    // there seems to be no need to call openssl_get_privatekey or similar.
    // Just pass the key as defined above
    openssl_sign($str, $binary_signature, $pi_key, OPENSSL_ALGO_SHA1);
    
    // Check signature
    $ok = openssl_verify($str, $binary_signature, $pu_key, OPENSSL_ALGO_SHA1);
    
    echo "check #1: ";
    if ($ok == 1) {
        echo "signature ok (as it should be)
    ";
    } elseif ($ok == 0) {
        echo "bad (there's something wrong)
    ";
    } else {
        echo "ugly, error checking signature
    ";
    }
    
    //var_dump(openssl_get_cipher_methods() );

    生成秘钥:http://php.net/manual/en/function.openssl-private-encrypt.php

    $res = openssl_pkey_new();
    
    // Get private key
    openssl_pkey_export($res, $privkey);
    
    // Get public key
    $pubkey = openssl_pkey_get_details($res);
    $pubkey = $pubkey["key"];
    var_dump($privkey);
    var_dump($pubkey);

    参考:

    http://stephen830.iteye.com/blog/2087281

    https://www.cnblogs.com/jaryoung/p/7644481.html

  • 相关阅读:
    JsBridge踩坑之WebViewJavascriptBridge is undefined,找不到Bridge对象
    Android踩坑之couldn't find "libClingSDK.so"
    GDM, KDM, LightDM, SDDM的区别和安装配置
    安装完ubuntu需要做得事
    apt vs snap
    在shell下执行命令的方法
    Vimmer一套全语言支持的完美Vim配置——附Monaco字体
    Ubuntu gnome安装Monaco字体,FontForge module is probably not installed
    Ubuntu全方位美化,定制教程
    stm32--FatFs调试过程(SPIFlash)
  • 原文地址:https://www.cnblogs.com/fps2tao/p/8685588.html
Copyright © 2011-2022 走看看