openssl 学习之从证书中提取RSA公钥N 和 E
原文链接: http://blog.csdn.net/kkxgx/article/details/19850509
通常数字证书包含很多信息,其中N和E值即我们称为的公钥。如何从PEM 或者DER格式的证书中提出证书呢?下面给出代码实现从PEM和DER编码的证书中提出N、E。
- #include <openssl/evp.h>
- #include <openssl/x509.h>
- #include <stdio.h>
- #include <stdlib.h>
- void PrintHex(unsigned char *str, unsigned int len)
- {
- int i = 0;
- for(i =0;i< len; i++)
- {
- if(i%4 == 0)
- {
- printf("0x");
- }
- printf("%02x",str[i]);
- if(i%4 == 3)
- {
- printf(" ");
- }
- if(i%16 == 15)
- {
- printf("\n");
- }
- }
- printf("\n");
- }
- void GetPukfromPEM()
- {
- X509 *x;
- BIO *b;
- EVP_PKEY *k;
- RSA *rsa;
- unsigned char n[300] ={0x0};
- unsigned char e[300] ={0x0};
- unsigned int len;
- /*www.google.com1为PEM格式的数字证书,从firefox中导出 */
- b=BIO_new_file("www.google.com1","r");
- x=PEM_read_bio_X509(b,NULL,NULL,NULL);
- k=X509_get_pubkey(x);
- rsa=EVP_PKEY_get1_RSA(k);
- if(rsa->n != NULL)
- {
- BN_bn2bin(rsa->n, n);
- len= BN_num_bytes(rsa->n);
- printf("N:\n");
- PrintHex(n,len);
- }
- else
- {
- printf("PEM error \n");
- }
- if(rsa->e != NULL)
- {
- BN_bn2bin(rsa->e, e);
- len= BN_num_bytes(rsa->e);
- printf("E:\n");
- PrintHex(e,len);
- }
- else
- {
- printf("PEM error \n");
- }
- BIO_free(b);
- X509_free(x);
- }
- void GetPukfromDER()
- {
- X509 *x;
- FILE *fp;
- unsigned char buf[5000],*p;
- int ret;
- EVP_PKEY *k;
- RSA *rsa;
- unsigned char n[300] ={0x0};
- unsigned char e[300] ={0x0};
- unsigned int len;
- /* www.google.com2为DER编码的数字证书 ,从firefox中导出
- */
- fp=fopen("www.google.com2","rb");
- if(!fp) return ;
- len=fread(buf,1,5000,fp);
- fclose(fp);
- p=buf;
- x=X509_new();
- d2i_X509(&x,(const unsigned char **)&p,len);
- k=X509_get_pubkey(x);
- rsa=EVP_PKEY_get1_RSA(k);
- if(rsa->n != NULL)
- {
- BN_bn2bin(rsa->n, n);
- len= BN_num_bytes(rsa->n);
- printf("N:\n");
- PrintHex(n,len);
- }
- else
- {
- printf("DER error \n");
- }
- if(rsa->e != NULL)
- {
- BN_bn2bin(rsa->e, e);
- len= BN_num_bytes(rsa->e);
- printf("E:\n");
- PrintHex(e,len);
- }
- else
- {
- printf("DER error \n");
- }
- X509_free(x);
- }
- int main()
- {
- GetPukfromPEM();
- GetPukfromDER();
- return 0;
- }
程序执行结果如下:
- N:
- 0xb073f0f2 0x04eec2a2 0x46ca342a 0xaabb6023
- 0xd111761f 0x1f3ad065 0x834e9a45 0xa8437085
- 0x76f01f87 0x00021f6e 0x3b1717c4 0xb5e91946
- 0xa292258d 0x622ab463 0x301fb985 0xf835e116
- 0x5a7649cc 0x50485339 0x5989d684 0x02fb9aec
- 0x1bc751d5 0x769590d4 0x3a2ab8a6 0xde024d06
- 0xfbcdeda5 0x46415f55 0x74e5ec7e 0x40dc509c
- 0xb5e4355d 0x1e6820f8 0xe9dea36a 0x28bf41d2
- 0xa1b3e225 0x8d0c1bca 0x3d930c18 0xaedfc5bc
- 0xfdbc82ba 0x6800d716 0x32719f65 0xb511da68
- 0x59d0a657 0x641bc9fe 0x98e5f5a5 0x65eae1db
- 0xeef4b39d 0xb38eea87 0xae16d21e 0xa07c7c69
- 0x3f291685 0x0153a76c 0xf160abdd 0xa2fc2547
- 0xd432d112 0xddf74812 0xe0fc9ca2 0x7798e989
- 0x99b8f838 0xf18c06c2 0x7a23366d 0x9b9dcd30
- 0xc8c73417 0x1ebb7d42 0xc8abe715 0x16f673b5
- E:
- 0x010001
- N:
- 0xb073f0f2 0x04eec2a2 0x46ca342a 0xaabb6023
- 0xd111761f 0x1f3ad065 0x834e9a45 0xa8437085
- 0x76f01f87 0x00021f6e 0x3b1717c4 0xb5e91946
- 0xa292258d 0x622ab463 0x301fb985 0xf835e116
- 0x5a7649cc 0x50485339 0x5989d684 0x02fb9aec
- 0x1bc751d5 0x769590d4 0x3a2ab8a6 0xde024d06
- 0xfbcdeda5 0x46415f55 0x74e5ec7e 0x40dc509c
- 0xb5e4355d 0x1e6820f8 0xe9dea36a 0x28bf41d2
- 0xa1b3e225 0x8d0c1bca 0x3d930c18 0xaedfc5bc
- 0xfdbc82ba 0x6800d716 0x32719f65 0xb511da68
- 0x59d0a657 0x641bc9fe 0x98e5f5a5 0x65eae1db
- 0xeef4b39d 0xb38eea87 0xae16d21e 0xa07c7c69
- 0x3f291685 0x0153a76c 0xf160abdd 0xa2fc2547
- 0xd432d112 0xddf74812 0xe0fc9ca2 0x7798e989
- 0x99b8f838 0xf18c06c2 0x7a23366d 0x9b9dcd30
- 0xc8c73417 0x1ebb7d42 0xc8abe715 0x16f673b5
- E:
- 0x010001
openssl 学习之从证书中提取RSA公钥N 和 E的更多相关文章
- java 从 PKCS12(比如pfx格式)证书中提取私钥证书(PrivateKey)和受信任的公钥证书(X509Certificate)的序列号(SerialNumber)
import lombok.Cleanup; import lombok.Getter; import lombok.Setter; import lombok.SneakyThrows; impor ...
- (4) openssl rsa/pkey(查看私钥、从私钥中提取公钥、查看公钥)
openssl rsa 是RSA对称密钥的处理工具 openssl pkey 是通用非对称密钥处理工具,它们用法基本一致,所以只举例说明openssl rsa. 它们的用法很简单,基 ...
- (11) openssl req(生成请求证书、私钥和自建CA)
伪命令req大致有3个功能:生成证书请求文件.验证证书请求文件和创建根CA. 由于openssl req命令选项较多,所以先各举几个例子,再集中给出openssl req的选项说明.若已熟悉opens ...
- X509证书中RSA公钥的提取与载入
原文链接: http://blog.chinaunix.net/uid-16515626-id-2741894.html 由于项目需要,我计划利用openssl开发一个基本的CA,实现证书的发放等 ...
- [转载]X509证书中RSA公钥的提取与载入 pem key
原地址:https://blog.csdn.net/anddy926/article/details/8940377 由于项目需要,我计划利用openssl开发一个基本的CA,实现证书的发放等功能.在 ...
- java验证openssl生成的ssl证书和私钥是否匹配
最近有一个需求上传ssl证书和私钥,但是上传之前需要验证ssl证书和私钥是否正确,其中的业务逻辑涉及到以下几点: 一.读取ssl证书,读取ssl证书公钥 要实现该功能比较简单,java里面 ...
- OpenSSL学习笔记
SSL缺省只进行server端的认证,客户端的认证是可选的.以下是其流程图(摘自TLS协议). 加密算法介绍: 对称加密: DES:date encrption standard,56bit 3DES ...
- iOS中使用RSA对数据进行加密解密
RSA算法是一种非对称加密算法,常被用于加密数据传输.如果配合上数字摘要算法, 也可以用于文件签名. 本文将讨论如何在iOS中使用RSA传输加密数据. 本文环境 mac os openssl-1.0. ...
- OPENSSL 学习整理-介绍
Openssl目录名以及功能描述 目录名 功能描述 Crypto 存放OpenSSL 所有加密算法源码文件和相关标注如X.509 源码文件,是OpenSSL中最重要的目录,包含了OpenSSL 密码算 ...
随机推荐
- [ASE][Daily Scrum]11.25
View Shilin Liu 修复现有的bug,子弹无法破坏射程内视野外的墙 Yiming Liao 无法看见从视野外到视野内的子弹 Server Songtao He 服务器处理子弹命中t ...
- What's New in C# 6.0
Static Types as using So, we are all quite familiar with this notion of accessing static class membe ...
- PyCharm 4.5.4 环境配置
1.去掉“自动保存功能” pycharm默认是自动保存的,习惯自己按 ctrl + s 的可以进行如下设置: 菜单File -> Settings... -> Appearance &am ...
- Java 中的反射机制
JAVA反射机制 JAVA反射机制是在运行状态中,对于任意一个类,都能够知道这个类的所有属性和方法:对于任意一个对象,都能够调用它的任意一个方法:这种动态获取的信息以及动态调用对象的方法的功能称为ja ...
- 更改MySql表和字段区分大小写
数据库和表名在 Windows 中是大小写不敏感的 ,而在大多数类型的 Unix 系统中是大小写敏感的Windows 版的 MySQL 默认继承 os 的大小写习惯,即使 SQL中有区分,在导入的时候 ...
- jquery 常用插件
50款最有用的 jQuery 插件集锦<表单篇> 50款最有用的 jQuery 插件集锦<网页布局篇> 50款最有用的 jQuery 插件集锦<内容滑块篇> 50款 ...
- Spring - 初始化spring容器
2016.01.12 学习linux内核的过程中发现变相的提升了自己的工程能力.以前觉得spring这些东西很复杂麻烦.然而,学了linux内核再看这些东西,发现好简单. 学习spring首先就要学习 ...
- iOS Runtime原理及使用
runtime简介 因为Objc是一门动态语言,所以它总是想办法把一些决定工作从编译连接推迟到运行时.也就是说只有编译器是不够的,还需要一个运行时系统 (runtime system) 来执行编译后的 ...
- JProfiler8 注册码序列号
JProfiler_SN_8_x.txt 按默认选择"Single or evaluation license" Name 和 Company 随意 --------------- ...
- FIR.im Weekly - 技术是练出来的
本期 Weekly 主要精选了上周一些不错的 GitHub 资源.开发工具和技术实践教程类文章分享给大家. JSPatch – 动态更新 iOS APP JSPatch 是 @Bang 最近业余做的小 ...