当前位置: 首页 > news >正文

openssl中算法的组织方式

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

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这个函数。



 本文转自 dog250 51CTO博客,原文链接:http://blog.51cto.com/dog250/1271988

相关文章:

  • Goldengate can't extract data from compressed table
  • 开源Linux监控系统:Icinga
  • 组策略故障实际案例排错
  • RHEL5.4编译安装LAMP
  • 生产环境监控mysql服务状态
  • 了解Handler,Looper, MessageQueue,Message的工作流程
  • 对BSD的新路由查找算法的理解
  • 验证文件中记录总行数是否与数据库文件同名表记录总数是否一致
  • 编写一个Linux虚拟网卡来实现类NVI
  • Windows下powershell可执行python
  • Css基本样式————文本
  • js 简单实现 LRU
  • DoS Attacks Prevention with TCP Intercept
  • NIOS2随笔——自定义IP(DPRAM)
  • Webpack入门教程十五
  • python3.6+scrapy+mysql 爬虫实战
  • Bootstrap JS插件Alert源码分析
  • C++类中的特殊成员函数
  • cookie和session
  • el-input获取焦点 input输入框为空时高亮 el-input值非法时
  • GraphQL学习过程应该是这样的
  • PHP 的 SAPI 是个什么东西
  • Python连接Oracle
  • Python学习之路16-使用API
  • Redis在Web项目中的应用与实践
  • Spring框架之我见(三)——IOC、AOP
  • Web设计流程优化:网页效果图设计新思路
  • win10下安装mysql5.7
  • 测试开发系类之接口自动化测试
  • 电商搜索引擎的架构设计和性能优化
  • 互联网大裁员:Java程序员失工作,焉知不能进ali?
  • 可能是历史上最全的CC0版权可以免费商用的图片网站
  • 爬虫进阶 -- 神级程序员:让你的爬虫就像人类的用户行为!
  • 前端攻城师
  • 浅谈JavaScript的面向对象和它的封装、继承、多态
  • 如何用vue打造一个移动端音乐播放器
  • 三栏布局总结
  • 提醒我喝水chrome插件开发指南
  • 微信小程序:实现悬浮返回和分享按钮
  • 完善智慧办公建设,小熊U租获京东数千万元A+轮融资 ...
  • #{}和${}的区别?
  • #我与Java虚拟机的故事#连载09:面试大厂逃不过的JVM
  • (AngularJS)Angular 控制器之间通信初探
  • (c语言版)滑动窗口 给定一个字符串,只包含字母和数字,按要求找出字符串中的最长(连续)子串的长度
  • (js)循环条件满足时终止循环
  • (附程序)AD采集中的10种经典软件滤波程序优缺点分析
  • (附源码)计算机毕业设计ssm高校《大学语文》课程作业在线管理系统
  • (三)Honghu Cloud云架构一定时调度平台
  • (学习日记)2024.01.19
  • (一)eclipse Dynamic web project 工程目录以及文件路径问题
  • (转载)PyTorch代码规范最佳实践和样式指南
  • *p=a是把a的值赋给p,p=a是把a的地址赋给p。
  • .bat批处理(五):遍历指定目录下资源文件并更新
  • .NET Framework 和 .NET Core 在默认情况下垃圾回收(GC)机制的不同(局部变量部分)
  • .net mvc actionresult 返回字符串_.NET架构师知识普及