在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_RSAstruct rsa_st *rsa;   /* RSA */
#endif
#ifndef OPENSSL_NO_DSAstruct dsa_st *dsa;   /* DSA */
#endif
#ifndef OPENSSL_NO_DHstruct dh_st *dh;  /* DH */
#endif
#ifndef OPENSSL_NO_ECstruct 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 编程> 赵春平

转载于:https://www.cnblogs.com/pangblog/p/3263238.html

OpenSSL之PKey的EVP封装相关推荐

  1. OpenSSL中文手册之EVP库详解

    1EVP 概览 1.1 EVP 简介   Openssl EVP(high-level cryptographic functions[1])提供了丰富的密码学中的各种函数.Openssl 中实现了各 ...

  2. Linux/Centos: OpenSSL中文手册之EVP库详解

    1EVP 概览 1.1 EVP 简介   Openssl EVP(high-level cryptographic functions[1])提供了丰富的密码学中的各种函数.Openssl 中实现了各 ...

  3. OpenSSL之EVP(一)——数据结构及源码结构介绍

    EVP简介 Openssl EVP提供了丰富的密码学中的各种函数. Openssl 中实现了各种对称算法.摘要算法以及签名/验签算法. EVP 函数将这些具体的算法进行了封装. EVP 主要封装了如下 ...

  4. OpenSSL之调用EVP框架实现AES多种加密模式

    OpenSSL之调用EVP框架实现AES多种加密模式 一.OpenSSL EVP简介 二.EVP中对称加密与解密流程 三.通过EVP实现AES多种加密模式 四.测试代码 原文链接: https://b ...

  5. 密码学专题 OpenSSL专题

    OpenSSL总体架构 软件包分为三个主要的功能部分:密码算法库 . SSL协议库及应用程序 MacOS,MS,OS/2及 VMS这几个目录,包含了在不同的 平台编译时的环境变量配置文件,在安装编译完 ...

  6. OpenSSL源码库目录解析

    OpenSSL目录名以及功能描述 目录名 功能描述 Crypto 存放OpenSSL所有加密算法源码文件和相关标注如X.509源码文件,是OpenSSL中最重要的目录,包含了OpenSSL密码算法库的 ...

  7. 对称加密算法AES之GCM模式简介及在OpenSSL中使用举例

    AES(Advanced Encryption Standard)即高级加密标准,由美国国家标准和技术协会(NIST)于2000年公布,它是一种对称加密算法.关于AES的更多介绍可以参考:https: ...

  8. php加密 dll扩展,PHP的openssl加密扩展使用小结(推荐)

    引言 互联网的发展史上,安全性一直是开发者们相当重视的一个主题,为了实现数据传输安全,我们需要保证:数据来源(非伪造请求).数据完整性(没有被人修改过).数据私密性(密文,无法直接读取)等.虽然现在已 ...

  9. Python OpenSSL 解析证书

    openssl 介绍这里不做过多赘述,可以搜到很多相关资料.本文提供python 使用OpenSSL解析证书的方法. OpenSSL 解析certificate 证书 import OpenSSL i ...

最新文章

  1. 蘑菇街2015校招 Java研发笔试题 详解,2015java
  2. VueX的store的简单使用心结
  3. Sublime text3装入插件Anaconda
  4. 【免费毕设】ASP.NET基于.NET的城市公交查询系统的实现与设计(源代码+lunwen)
  5. XILINX-DDR3IP核的使用
  6. 高通Android camera驱动框架
  7. 为什么程序员会秃头?盘点程序员糟心的几大因素
  8. 微信新版本文件乱保存自用解决方法
  9. 5990. 找出数组中的所有孤独数字
  10. passenger+nginx框架部署
  11. uniapp的分享到朋友圈和朋友(APP)
  12. 浙大开源快速扩散语音合成模型FastDiff和ProDiff
  13. Python爬虫监控(邮件和钉钉)
  14. 【翻译】开发人员的技术写作
  15. windows10 1909 原版纯净系统分享
  16. Trove系列(二)—Trove 的架构和流程介绍
  17. mac 终端查看端口命令
  18. Vue中router-view和子路由的使用方法
  19. YDOOK: ANSYS Maxwell 19 教程11:Maxwell 2D 静电场怎样设置激励源
  20. esp8266烧录Html文件

热门文章

  1. mysql 5.6特性_MySQL 5.6新特性概览
  2. Activity管理类,随时随地退出应用程序
  3. [机器学习]推荐系统介绍
  4. 在qt中使用QSplitter设置初始比例setStretchFactor失效的解决方法
  5. ASP.NET基础培训 - Cookie的正确利用
  6. redis安装配置参考
  7. hibernate annotations @Entity hql XX not mapped
  8. MySQL CASE WHEN 根据一个表的字段值不同关联查询两张不同的表【子查询】
  9. Android API级别、代号、发布时间及平台亮点整理
  10. 笔试题--Multicore简答题(上)