OpenSSL之PKey的EVP封装
在Openssl中,非对称加密涉及到两个密钥。一个为公开的密钥(公钥),一个为非公开的密钥。而OpenSSL中非对称加密算法有RSA、DSA、ECC,他们的原理不同,因此其密钥结构不同。下面我们列出我们关心的密钥部分。
1)非对称算法密钥结构
OpenSSL中,生产密钥的算法通过以下几个函数
int RSA_generate_key_ex(RSA *rsa, int bits, BIGNUM *e, BN_GENCB *cb);
int DSA_generate_key(DSA *dsa);
int EC_KEY_generate_key(EC_KEY *eckey);
int DH_generate_key(DH *dh);
由以上几个函数可以知道生成的密钥都在RSA、DSA、ECKEY 、DH结构体中
RSA 结构rsa.h中,其中{n,e} 表示公钥,{n, d}表示私钥
struct rsa_st
{
.....
BIGNUM *n;
BIGNUM *e;
BIGNUM *d;
BIGNUM *p;
BIGNUM *q;
BIGNUM *dmp1;
BIGNUM *dmq1;
BIGNUM *iqmp;
.....
};
DSA结构在dsa.h中
struct dsa_st
{
......
BIGNUM *p;
BIGNUM *q; /* == 20 */
BIGNUM *g;
BIGNUM *pub_key; /* y public key */
BIGNUM *priv_key; /* x private key */
......
};
ECC结构在ecc.h
struct ec_key_st {
EC_GROUP *group;
EC_POINT *pub_key;
BIGNUM *priv_key;
} /* EC_KEY */;
DH结构体在dh.h中定义
struct dh_st
{ BIGNUM *p;
BIGNUM *g;
long length; /* optional */
BIGNUM *pub_key; /* g^x */
BIGNUM *priv_key; /* x */
}
2)EVP封装中的密钥结构EVP_PKEY
struct evp_pkey_st
{
int type;
int save_type;
int references;
const EVP_PKEY_ASN1_METHOD *ameth;
ENGINE *engine;
union {
char *ptr;
#ifndef OPENSSL_NO_RSA
struct rsa_st *rsa; /* RSA */
#endif
#ifndef OPENSSL_NO_DSA
struct dsa_st *dsa; /* DSA */
#endif
#ifndef OPENSSL_NO_DH
struct dh_st *dh; /* DH */
#endif
#ifndef OPENSSL_NO_EC
struct ec_key_st *ec; /* ECC */
#endif
} pkey;
int save_parameters;
STACK_OF(X509_ATTRIBUTE) *attributes; /* [ 0 ] */
} /* EV
先上面的结构,结构体中有union结构,在union结构中分别定义rsa、dsa、dh、ec,这些不难理解,定义共用体的目的是节省内存,因为每次这个结构体只为一个非对称密码算法服务。而为什么定义一个ptr呢?这边封装的技巧就在这,ptr指向密钥结构的地址。不管生产的密钥是1)中哪一种类型结构,将其强制转化为char* 赋值给ptr。而当我们调用时,我们根据type的类型,直接进行调用。比如说:EVP_KEY *pkey;pkey->pkey.rsa;直接就将ptr当成rsa类型操作。这就是共用体的好处。下面一幅图是从Openssl中截取的代码片段来证明上面的分析。
具体是用实例可以参考<openssl 编程> 赵春平
OpenSSL之PKey的EVP封装的更多相关文章
- 2.openssl rsa/pkey
分别是RSA密钥的处理工具和通用非对称密钥处理工具.它们用法基本一致,所以只介绍openssl rsa. [root@xuexi tmp]# man rsa NAME rsa - RSA key pr ...
- openssl rsa/pkey
openssl系列文章:http://www.cnblogs.com/f-ck-need-u/p/7048359.html openssl rsa和openssl pkey分别是RSA密钥的处理工具和 ...
- (4) openssl rsa/pkey(查看私钥、从私钥中提取公钥、查看公钥)
openssl rsa 是RSA对称密钥的处理工具 openssl pkey 是通用非对称密钥处理工具,它们用法基本一致,所以只举例说明openssl rsa. 它们的用法很简单,基 ...
- openssl之EVP系列之7---信息摘要算法结构概述
openssl之EVP系列之7---信息摘要算法结构概述 ---依据openssl doc/crypto/EVP_DigestInit.pod翻译和自己的理解写成 (作者:Dragon ...
- Openssl编程--源码分析
Openssl编程 赵春平 著 Email: forxy@126.com 第一章 基础知识 8 1.1 对称算法 8 1.2 摘要算法 9 1.3 公钥算法 9 1.4 回调函数 11 第二章 ope ...
- OPENSSL 学习整理-介绍
Openssl目录名以及功能描述 目录名 功能描述 Crypto 存放OpenSSL 所有加密算法源码文件和相关标注如X.509 源码文件,是OpenSSL中最重要的目录,包含了OpenSSL 密码算 ...
- [网络编程]VS2010+OpenSSL安装与初步了解
OpenSSL简介 功能作用:SSL(Secure Socket Layer)是netscape公司提出的主要用于web的安全通信标准,分为2.0版和3.0版.TLS(Transport Layer ...
- openssl 1.1.1 reference
openssl 1.1.1 include/openssl aes.h: # define HEADER_AES_H aes.h: # define AES_ENCRYPT 1 aes.h: # de ...
- PHP的openssl加密
PHP的openssl扩展 openssl扩展使用openssl加密扩展包,封装了多个用于加密解密相关的PHP函数,极大地方便了对数据的加密解密. 常用的函数有: 对称加密相关: string ope ...
随机推荐
- mySQL优化 my.ini 配置说明
[mysqld] port = 3306 serverid = 1 socket = /tmp/mysql.sock skip-name-resolve #禁止MySQL对外部连接进行DNS解析,使用 ...
- MongoDB与PHP的添加、修改、查询、删除
链接数据库使用下面的代码创建一个数据库链接 <?php$connection = new Mongo(); //链接到 localhost:27017$connection = new Mong ...
- SQL从入门到基础 - 04 SQLServer基础2(数据删除、数据检索、数据汇总、数据排序、通配符过滤、空值处理、多值匹配)
一.数据删除 1. 删除表中全部数据:Delete from T_Person. 2. Delete 只是删除数据,表还在,和Drop Table(数据和表全部删除)不同. 3. Delete 也可以 ...
- win8发布 wcf问题
WCF services don’t run on IIS 8 with the default configuration, because the webserver doesn’t know, ...
- wsdl和wadl区别
[转]http://blog.csdn.net/liuxiao723846/article/details/51611183 1.Java开发WebService最重要的两个规范: JSR-224 ( ...
- java对象初级知识
this属于类 方法中没有自己的this指针(本来以为js方法中有,其实并没有里,那是被new出来的function 在声明的时候可以赋初值: int a =12 但不能 int a ; a ...
- Java集合类笔试题
介绍Collection框架的结构 Collection接口是单值存放的最大父接口,可以向其中保存多个单值的数据(所谓单值就是指集合中的每个元素都是一个对象).其子接口主要有:List.Set.Que ...
- 纯css实现slide效果
尝试一下,仅作记录. <!DOCTYPE html><html><head><style> *{transition:all 1s ease 0s ...
- javascript sort()与reverse()
javascript 中提供了两个对数据进行排序的方法,即sort()和reverse() 在理解的时候犯了一个非常低级的错误,现记录如下: reverse()不包括排序的功能,只是把原来的数组反转. ...
- curl 转载
CURLOPT_RETURNTRANSFER 选项: curl_setopt($ch, CURLOPT_RETURNTRANSFER,1); 如果成功只将结果返回,不自动输出任何内容. 如果失败返回F ...