openssl pem.h 中提供了关于pem格式密钥对的操作接口

通常使用.pem的格式文件来保存openssl 生成的密钥对;

在终端下 cat xxx.pem 可以看到

-----BEGIN RSA PRIVATE KEY-----

XXXX


-----END RSA PRIVATE KEY-----

密钥数据进行了BASE64编码

1. 示例:将生成的密钥对保存成pem文件

void testWriteRSA2PEM()
{
//生成密钥对
RSA *r = RSA_new();
int bits = ;
BIGNUM *e = BN_new();
BN_set_word(e, );
RSA_generate_key_ex(r, bits, e, NULL); RSA_print_fp(stdout, r, ); BIO *out;
out = BIO_new_file("/Users/cocoajin/Desktop/opriv.pem","w");
//这里生成的私钥没有加密,可选加密
int ret = PEM_write_bio_RSAPrivateKey(out, r, NULL, NULL, , NULL, NULL);
printf("writepri:%d\n",ret);
BIO_flush(out);
BIO_free(out); out = BIO_new_file("/Users/cocoajin/Desktop/opub.pem","w");
ret = PEM_write_bio_RSAPublicKey(out, r);
printf("writepub:%d\n",ret);
BIO_flush(out);
BIO_free(out); BN_free(e);
RSA_free(r); }

在目标路径保存了生成的公钥opub.pem和私钥oprov.pem

输出日志

Private-Key: ( bit)
modulus:
:e6::f5:6f:4d:5e:c2:ad:0d:f5:::::
ca:6f::4f:3a:::e2:ee:a2:cc::::e2:
3d:0d:e3:0d:c0:6a:::b6:c7:de:e2:d6:::
9e::::dd:2d::c5:a8:f2:c1::8b::f9:
:0a:7a::
publicExponent: (0x10001)
privateExponent:
:ca:1b::6f:c5:de:c2:bf:2f:b6::f7:ad:d8:
::fc::fd:0a:e0::6b::::ea::8c:
b0:7a:d3:d8::b7:fb::f1:4e::9d:bf::3a:
e0:f3:fa::d3::fd:b0:f5:cd:5c::d1::8c:
:e3:fb:c7:
prime1:
:f6:d7::c4:1a:2f:eb:0b:c4:::3b:fe:f6:
0d:c1:::ca:6c::fc:de:d7::ac::9d::
:fe:9b
prime2:
:ef:::::4d:ac::aa:ed:e9:a7:1d:5d:
b1:7d:1c:1a:ef::8f:2d:bc:8a:e7::f5:f8::
::
exponent1:
:f4:d2:c0:6f:b8:ed::fa:::2f::::
b3::9f:c0:6c:b8:::b1:df:b4::fd:2a::
:ec:2b
exponent2:
:b5::c1::bc:3d::f8:::db:f9:5c:c4:
:d8::fe:::7e:a6:b4:6a:::db::d0:
::
coefficient:
0a:::2f:e9:ca:b6::::3b:5a::ea:5e:
8d:::b9:7a:::c4::cb::0e::6b:1b:
e5:c4
writepri:
writepub:
Program ended with exit code:

2. 示例:从pem文件中获取公钥私钥方式一(利用了BIO)

void testReadRSAFromPEM()
{
RSA *pubkey = RSA_new();
RSA *prikey = RSA_new(); BIO *pubio;
BIO *priio; priio = BIO_new_file("/Users/cocoajin/Desktop/opriv.pem", "rb");
prikey = PEM_read_bio_RSAPrivateKey(priio, &prikey, NULL, NULL); pubio = BIO_new_file("/Users/cocoajin/Desktop/opub.pem", "rb");
pubkey = PEM_read_bio_RSAPublicKey(pubio, &pubkey, NULL, NULL); RSA_print_fp(stdout, pubkey, );
RSA_print_fp(stdout, prikey, ); RSA_free(pubkey);
BIO_free(pubio);
RSA_free(prikey);
BIO_free(priio); }

从目标路径读取公钥opub.pem和私钥opriv.pem

输出日志

Public-Key: ( bit)
Modulus:
:e6::f5:6f:4d:5e:c2:ad:0d:f5:::::
ca:6f::4f:3a:::e2:ee:a2:cc::::e2:
3d:0d:e3:0d:c0:6a:::b6:c7:de:e2:d6:::
9e::::dd:2d::c5:a8:f2:c1::8b::f9:
:0a:7a::
Exponent: (0x10001)
Private-Key: ( bit)
modulus:
:e6::f5:6f:4d:5e:c2:ad:0d:f5:::::
ca:6f::4f:3a:::e2:ee:a2:cc::::e2:
3d:0d:e3:0d:c0:6a:::b6:c7:de:e2:d6:::
9e::::dd:2d::c5:a8:f2:c1::8b::f9:
:0a:7a::
publicExponent: (0x10001)
privateExponent:
:ca:1b::6f:c5:de:c2:bf:2f:b6::f7:ad:d8:
::fc::fd:0a:e0::6b::::ea::8c:
b0:7a:d3:d8::b7:fb::f1:4e::9d:bf::3a:
e0:f3:fa::d3::fd:b0:f5:cd:5c::d1::8c:
:e3:fb:c7:
prime1:
:f6:d7::c4:1a:2f:eb:0b:c4:::3b:fe:f6:
0d:c1:::ca:6c::fc:de:d7::ac::9d::
:fe:9b
prime2:
:ef:::::4d:ac::aa:ed:e9:a7:1d:5d:
b1:7d:1c:1a:ef::8f:2d:bc:8a:e7::f5:f8::
::
exponent1:
:f4:d2:c0:6f:b8:ed::fa:::2f::::
b3::9f:c0:6c:b8:::b1:df:b4::fd:2a::
:ec:2b
exponent2:
:b5::c1::bc:3d::f8:::db:f9:5c:c4:
:d8::fe:::7e:a6:b4:6a:::db::d0:
::
coefficient:
0a:::2f:e9:ca:b6::::3b:5a::ea:5e:
8d:::b9:7a:::c4::cb::0e::6b:1b:
e5:c4
Program ended with exit code:

3. 示例:从pem文件中读取公钥私钥方式二(利用FILE)

void testPEMReadRSA()
{
RSA *pubkey = RSA_new();
RSA *prikey = RSA_new(); FILE *pubf = fopen("/Users/cocoajin/Desktop/opub.pem", "rb");
pubkey = PEM_read_RSAPublicKey(pubf, &pubkey, NULL, NULL); FILE *prif = fopen("/Users/cocoajin/Desktop/opriv.pem", "rb");
prikey = PEM_read_RSAPrivateKey(prif, &prikey, NULL, NULL); RSA_print_fp(stdout, pubkey, );
RSA_print_fp(stdout, prikey, ); fclose(pubf);
fclose(prif);
RSA_free(pubkey);
RSA_free(prikey); }

输出日志

Public-Key: ( bit)
Modulus:
:e6::f5:6f:4d:5e:c2:ad:0d:f5:::::
ca:6f::4f:3a:::e2:ee:a2:cc::::e2:
3d:0d:e3:0d:c0:6a:::b6:c7:de:e2:d6:::
9e::::dd:2d::c5:a8:f2:c1::8b::f9:
:0a:7a::
Exponent: (0x10001)
Private-Key: ( bit)
modulus:
:e6::f5:6f:4d:5e:c2:ad:0d:f5:::::
ca:6f::4f:3a:::e2:ee:a2:cc::::e2:
3d:0d:e3:0d:c0:6a:::b6:c7:de:e2:d6:::
9e::::dd:2d::c5:a8:f2:c1::8b::f9:
:0a:7a::
publicExponent: (0x10001)
privateExponent:
:ca:1b::6f:c5:de:c2:bf:2f:b6::f7:ad:d8:
::fc::fd:0a:e0::6b::::ea::8c:
b0:7a:d3:d8::b7:fb::f1:4e::9d:bf::3a:
e0:f3:fa::d3::fd:b0:f5:cd:5c::d1::8c:
:e3:fb:c7:
prime1:
:f6:d7::c4:1a:2f:eb:0b:c4:::3b:fe:f6:
0d:c1:::ca:6c::fc:de:d7::ac::9d::
:fe:9b
prime2:
:ef:::::4d:ac::aa:ed:e9:a7:1d:5d:
b1:7d:1c:1a:ef::8f:2d:bc:8a:e7::f5:f8::
::
exponent1:
:f4:d2:c0:6f:b8:ed::fa:::2f::::
b3::9f:c0:6c:b8:::b1:df:b4::fd:2a::
:ec:2b
exponent2:
:b5::c1::bc:3d::f8:::db:f9:5c:c4:
:d8::fe:::7e:a6:b4:6a:::db::d0:
::
coefficient:
0a:::2f:e9:ca:b6::::3b:5a::ea:5e:
8d:::b9:7a:::c4::cb::0e::6b:1b:
e5:c4
Program ended with exit code:

4. 在终端下使用openssl命令生成公钥私钥

//生成1024位的RSA私钥
openssl genrsa -out private.pem //再由私钥生成公钥
openssl rsa -in private.pem -pubout -out public.pem //私钥文件private.pem
//公钥文件public.pem
//上面私钥是没加密的,可选加密,指定一个加密算法生成时输入密码

以上测试使用openssl 1.1.0c

参考:https://www.openssl.org/docs/man1.1.0/crypto/PEM_read_bio_RSAPublicKey.html

openssl pem 生成公钥和私钥及文件的更多相关文章

  1. openssl windows 生成公钥与私钥

    链接: https://pan.baidu.com/s/1qn-qeFxovor-vcAWFl8jIw 提取码: zy5v 一,下载安装windows平台openssl密钥生成工具,执行安装目录bin ...

  2. git 生成公钥、私钥方法与clone使用方法

    我的配置流程 Git配置 Git安装完之后,需做git配置.打开git bash,分别执行以下两句命令 git config --global user.name "用户名" gi ...

  3. Git简单生成生成公钥和私钥方法

    Git简单生成生成公钥和私钥方法 Git配置 Git安装完之后,需做最后一步配置.打开git bash,分别执行以下两句命令 git config --global user.name “用户名” g ...

  4. Git安装与使用(windows环境)(一)----Git安装、生成公钥和私钥、添加SSH

    安装 1.从官网下载git:http://git-scm.com/downloads 2.安装git,选择git组件安装,如下图 3.一直next,直到出现下面的窗口.这里是选择命令行形式.(可以理解 ...

  5. GIT生成公钥和私钥

    转载至:https://blog.csdn.net/gwz1196281550/article/details/80268200 打开 git bash! git config --global us ...

  6. MAC下用OPENSSL生成公钥和私钥

    MAC OS自带了OpenSSL,所以不用去编译那一坨跟SHIT一样的源码.直接在命令行里使用OPENSSL就可以. 打开命令行工具,然后输入 openssl打开openssl,接着只要三句命令就可以 ...

  7. 使用keytool生成公钥、私钥、证书并且读取出来,使用私钥签名jar并验证(转)

    参考链接:http://happyqing.iteye.com/blog/2139504 :https://blog.csdn.net/arjelarxfc/article/details/52461 ...

  8. xshell生成公钥和私钥

    一.打开你的xshell工具,工具栏有一个工具选项,点开选择新建用户密钥生成向导(如下图所示) 二. 点开之后就会如上图所示一样,点击选择下一步,出现如下,再点击下一步 点击完下一步会出现如下图所示 ...

  9. sourceTree 生成公钥和私钥 然后拉项目代码

    第一步 用sourceTree生成公钥pub和私钥文件ppk    打开sourceTree -> 工具 -> 创建或导入ssh密钥 -> 点击generate -> 上面会显 ...

随机推荐

  1. java中使用jxl导出Excel表格详细通用步骤

    该方法一般接收两个参数,response和要导出的表格内容的list. 一般我们将数据库的数据查询出来在页面进行展示,根据用户需求,可能需要对页面数据进行导出. 此时只要将展示之前查询所得的数据放入s ...

  2. XEN的启动信息输出到“Platform timer is 14.318MHz HPET”就暂停接收的解决办法

    使用Serial Over Lan(SOL)来双机调试 XEN,在 XEN 启动时,引导信息输出到以下这一句时,就不再发送调试信息了: ...(XEN) Intel machine check rep ...

  3. MySQL免安装的配置

    ①:下载并获取解压路径: ②:修改 my-default.ini: ③:管理员身份进入cmd,并cd到上面的路径(否则发生错误2,找不到文件): ④:忘记ROOT密码如何重置:

  4. CEGUI0.8.4例子

    #define GLUT_DISABLE_ATEXIT_HACK#pragma comment(lib,"glew32.lib")#include<stdlib.h># ...

  5. [WCF]DomainServices客户端操作异常处理

    作为个人备忘,不做排版.此扩展函数用于DomainServices的Load及SubmitChanges时处理Error信息,包括验证消息.实体冲突. public static string ToE ...

  6. Configure Visual Studio 2013 for debugging .NET framework

    https://referencesource.microsoft.com/ In order to configure Visual Studio 2013 do the following in ...

  7. Web.config配置详解

    一.认识Web.config文件 Web.config   文件是一个XML文本文件,它用来储存   ASP.NET   Web   应用程序的配置信息(如最常用的设置ASP.NET   Web   ...

  8. empty isset

    1.当变量未定义时,is_null()和"参数本身"是不允许作为参数判断的,会报Notice警告错误: 2.empty,isset首先都会检查变量是否存在,然后对变量值进行检测.而 ...

  9. 使用java mail 发送邮件

    1.关联jar包:   activation.jar   mail.jar 2.调用 @Test public void test1() { List<String> imageUrlLi ...

  10. Javascript中bind、call、apply函数用法

    js 里函数调用有 4 种模式:方法调用.正常函数调用.构造器函数调用.apply/call 调用. 同时,无论哪种函数调用除了你声明时定义的形参外,还会自动添加 2 个形参,分别是 this 和ar ...