openssl为了支持可插拔的算法采用了engine,这里面有一些专利原因和政治原因,暂且掠过。在说engine之前首先看看算法的组织方式,其实如果你完全明白了这种组织,那么engine就是一个自然而然的结果了。首先看一下openssl中是如何组织算法的:

图表已经很清晰了,如果非要解释一下的话,那么就看下面的文字:openssl首先将所有的算法分成几个大的类别,每一个类别有一个所谓的table表示,比如rsa,dsa,cipher等等,然后在每一个大的类别中再细分为若干小类,对于这一点,如果你仅仅看rsa那么很难看明白,毕竟大家几乎都知道rsa好像只有一种算法,就是rsa算法,事实上并不是这样的,比如考虑cipher,我们就会看出为何这么看是不对的,cipher是所有对称算法的总称,由aes,des,3des等组成,对于这个例子,那么aes,des,3des就在上图中占据一个椭圆形的冲突节点,之所以用哈希再组织我认为是为了查找的迅速,如果仅仅有几种算法的table,完全没有必要用哈希表去组织,事实上,对于大多数的table,其哈希值算法就是简单返回算法的算法ID,这在算法ID唯一的系统中就唯一定位了一个算法。算法既然被定位了,那么接下来就要定位它的实现了,众所周知一个算法可以有很多种不同的实现,那么具体要选用哪一种呢,如果没有提供额外的信息,那么首先就要通过算法ID利用哈希算法定位到一个算法(哈希定位用table的哈希算法,冲突链定位用比较算法),然后选取默认的算法实现,那么如果一个调用者提供了一些额外的信息呢,比如调用者能否调用自己的算法而不使用默认的实现呢?这就是engine的意义,事实上一个engine包含了所有的算法,也就是所有的table中的每一个算法,每一个算法都提供一个实现(也可以不提供,用默认实现填充),然后调用时用engine和算法id作为参数就可以了,一个engine必须有能力通过一个算法的id来选出一个算法的实现,比如对于cipher而言,engine提供了一个回调函数,该函数的目的是通过算法id来得到一个EVP_CIPHER。
     上图中给定了一个算法id和一个engine,选择一个实现所使用的原则是优先适用原则,只选择第一个可用的实现
     我故意省略了engine的实现,为了当我遗忘的时候能够有个思考的过程。我们看一下ssl的握手过程中的算法确定,首先说一个简单的,那就是客户端rsa结构体的确定,其实结构体rsa中的很多参数是服务器传过来的,客户端通过d2i操作解码了参数,下面看一个更加实际的,服务器传来一个算法id,客户端通过以参数engine为NULL调用EVP_CipherInit_ex,得到的结果就是:
else
    impl = ENGINE_get_cipher_engine(cipher->nid);
if(impl){
    const EVP_CIPHER *c = ENGINE_get_cipher(impl, cipher->nid);
这个结果说明了一切,另外看看RSA_new这个函数。

转载于:https://blog.51cto.com/dog250/1271988

openssl中算法的组织方式相关推荐

  1. 今天想到了关于 Django 中 view 的组织方式问题

    之前一直做 ASP.NET, 对于一个页面文件一个 view 的做法感觉很好.而 django 中在一个文件里很多个函数,每一个代表一个 view. 这样的做法在网站程序复杂化后,查找代码很不方便.当 ...

  2. 利用ENGINE替换OPENSSL中的加解密算法

    一:ENGINE的目的: ENGINE是OPENSSL预留的加载第三方加密库,主要包括了动态库加载的代码和加密函数指针管理的一系列接口.如果要使用Engine(假设你已经加载上该Engine了),那么 ...

  3. 下图所示的PCB(进程控制块)的组织方式是(),图中()。【最全!最详细分析】

    下图所示的PCB(进程控制块)的组织方式是(),图中(). A.链接方式 B.索引方式 C.顺序方式 D.Hash A.有1个运行进程.2个就绪进程.4个阻塞进程 B.有2个运行进程.3个就绪进程.2 ...

  4. 组织c语言程序的是什么,C程序在内存中的组织方式

    对我本人来说,学习任何一种高级语言,总想知道高级语言是如何被编译并载入内存的,一个程序的运行,在计算机内存中是怎样组织的等等问题,总想打破砂锅问到底,有好多疑问,因此我就学习了汇编语言,汇编语言确实让 ...

  5. L1-030 一帮一 (15分) “一帮一学习小组”是中小学中常见的学习组织方式,老师把学习成绩靠前的学生跟学习成绩靠后的学生排在一组。本题就请你编写程序帮助老师自动完成这个分配工作,即在得到全班学生

    L1-030 一帮一 (15分) "一帮一学习小组"是中小学中常见的学习组织方式,老师把学习成绩靠前的学生跟学习成绩靠后的学生排在一组.本题就请你编写程序帮助老师自动完成这个分配工 ...

  6. “一帮一学习小组”是中小学中常见的学习组织方式,老师把学习成绩靠前的学生跟学习成绩靠后的学生排在一组。本题就请你编写程序帮助老师自动完成这个分配工作,即在得到全班学生的排名后,在当前尚未分组的学生中,

    "一帮一学习小组"是中小学中常见的学习组织方式,老师把学习成绩靠前的学生跟学习成绩靠后的学生排在一组.本题就请你编写程序帮助老师自动完成这个分配工作,即在得到全班学生的排名后,在当 ...

  7. L1-030——一帮一学习小组”是中小学中常见的学习组织方式,老师把学习成绩靠前的学生跟学习成绩靠后的学生排在一组。

    一帮一学习小组"是中小学中常见的学习组织方式,老师把学习成绩靠前的学生跟学习成绩靠后的学生排在一组.本题就请你编写程序帮助老师自动完成这个分配工作,即在得到全班学生的排名后,在当前尚未分组的 ...

  8. “一帮一学习小组”是中小学中常见的学习组织方式,老师把学习成绩靠前的学生跟学习成绩靠后的学生排在一组.

    "一帮一学习小组"是中小学中常见的学习组织方式,老师把学习成绩靠前的学生跟学习成绩靠后的学生排在一组.本题就请你编写程序帮助老师自动完成这个分配工作,即在得到全班学生的排名后,在当 ...

  9. C/C++中算法运行时间的三种计算方式(By 虚怀若谷)

    算法执行时间需通过依据该算法编制的程序在计算机上运行时所消耗的时间来度量.而度量一个程序的执行时间通常有两种方法. 事后统计的方法:该方法利用计算机内部的计时功能,可以精确到毫秒级别,这种方法有两个缺 ...

最新文章

  1. 大厂程序员和北京户口教师女友买房分歧,要求分配产权怕离婚扯皮
  2. 华为明年发布鸿蒙系统手机,华为鸿蒙系统2.0正式发布,明年将运用在手机上
  3. CSS + DIV 让页脚始终底部
  4. DDD领域驱动设计---战略设计(包括四色原型建模)
  5. C#(.Net) 连接 ORACLE数据库
  6. oracle 主键列创建自增长,powerdesigner创建oracle 数据库表,设置表主键列为自动增长。 ....
  7. TypeScript 2019 路线图:更效率,更易用!
  8. python slicer_报表筛选:Excel Slicer与SQL Server Reporting Services(SSRS)参数
  9. 实验四 木马的远程控制和清除
  10. 方波信号小波去噪matlab,Matlab小波去噪
  11. python调用短信api接口实现验证码发送
  12. 2020经济学人电子版杂志分享资源
  13. HDU 4699 Editor【模拟栈】
  14. xp大容量u盘补丁_u盘128g 个性 大容量电脑系统修复
  15. mac 不显示 外接屏幕_Mac连接投影仪 Mac外接显示器设置教程
  16. centos下安装xcrysden出现的问题
  17. 中央农村工作会议释放重要信号,AI 技术助力农业的十种路径,未来可期
  18. 极路由 刷linux,极路由极壹HC6361刷OpenWrt固件教程
  19. h5+ 调用本地摄像头拍照
  20. Gibbs Sampling\吉布斯采样(一)

热门文章

  1. 安装计算机的更新每次更新失败,win7电脑自动更新失败怎么办,电脑自动更新失败解决方法...
  2. java盘点系统_2020年度综合大盘点:火爆IT业的7大Java技术,任何一项都是“卧槽牛逼”!...
  3. java包名命名规则_告别编码5分钟,命名2小时!史上最全的Java命名规范参考!
  4. python3 opencv_python3 opencv3 实现基本的人脸检测、识别功能
  5. 封装mysql数据库操作系统_封装MySQL的单例,连接数据库并对数据进行增删改查操作...
  6. hadoop2.9.2安装hadoop_pid_dir_Hadoop3.2 +Spark3.0全分布式安装
  7. extjs office java_Extjs使用(最最基础)
  8. 4服务器内存和普通内存_Java服务器内存过高CPU过高问题排查
  9. 纯新手DSP编程--5.30--任务的通信和同步
  10. python中reversed函数,Python3