OpenSSL 简介

OpenSSL 是包含安全套接字层和传输层安全协议的开源软件库,它几乎成为安全领域的事实标准,大部分的服务器和客户端都使用 OpenSSL,一些硬件加密算法的实现通常也需要使用 OpenSSL 的命令行工具进行验证。在实际应用中,OpenSSL可以提供动态引擎框架,可以方便用户使用密码设备完成硬件加速。

GmSSL 简介

国内与OpenSSL相对应的开源项目为 GmSSL,该项目中增加了国密算法,如SM2/SM3/SM4/SM9等,同时也增加了对国家密码标准规范的支持,如SKF/SDF/IPSEC等。

OpenSSL Engine 介绍

OpenSSL 为第三方提供了Engine加载框架,方便用户使用自己的硬件设备完成密码学算法,例如服务器厂商可以通过加密卡厂商提供的 OpenSSL引擎完成HTTPS的加速。OpenSSL 1.1.1版本之后增加了异步模式的支持,这使得使用OpenSSL Engine完成硬件加速成为了一种通用的加速手段。例如 intelQAT ,国内的江南天安等。本文的剩余部分将介绍如何完成 OpenSSL动态引擎的编写。

编写 OpenSSL Engine

除了国际算法,实际应用中可能有国密算法的需求,例如部分应用中需要使用国密套件SM2-WITH-SMS4-SM3进行TLS连接。本文将使用GmSSL完成引擎的实现。本文的示例代码可参考 gmssl_engineOpenSSL提供了引擎相关Demo,编写引擎时首先通过ENGINE_set_x接口完成引擎相关信息及接口的配置:

static int bind_gmssl_engine(ENGINE *e, const char *id)
{int ret = 1;gmssl_engine_create_ciphers();ret &= ENGINE_set_id(e, engine_id);ret &= ENGINE_set_name(e, engine_name);ret &= ENGINE_set_ciphers(e, gmssl_engine_ciphers);ret &= ENGINE_set_pkey_meths(e, gmssl_engine_pkey);ret &= ENGINE_set_destroy_function(e, engine_destroy);ret &= ENGINE_set_init_function(e, engine_init);ret &= ENGINE_set_finish_function(e, engine_finish);ret &= ENGINE_set_ctrl_function(e, engine_ctrl);ret &= ENGINE_set_cmd_defns(e, cmd_defns);_assert(ret != 0, ret);return ret;
}

通过IMPLEMENT_DYNAMIC_BIND_FN宏定义完成引擎的注册:

IMPLEMENT_DYNAMIC_BIND_FN(bind_gmssl_engine)
IMPLEMENT_DYNAMIC_CHECK_FN()

这样只需要实现引擎中注册的相关接口即可,例如前面通过ENGINE_set_pkey_meths接口设置的gmssl_engine_pkey接口。以Pkey接口为例,通过EVP_PKEY_meth_set_x接口完成PKEY方法的注册。这里也可以通过PKEY的子方法完成注册,例如ECC相关的EC_KEY_METHODOpenSSL speed速度测试中直接调用字方法完成,这样的好处是可以使用speed工具完成性能测试,但PKEY接口更加通用,将公钥算法全部包含在内,目前GmSSL支持的公钥算法相关NID如下:

# define EVP_PKEY_NONE   NID_undef
# define EVP_PKEY_RSA    NID_rsaEncryption
# define EVP_PKEY_RSA2   NID_rsa
# define EVP_PKEY_DSA    NID_dsa
# define EVP_PKEY_DSA1   NID_dsa_2
# define EVP_PKEY_DSA2   NID_dsaWithSHA
# define EVP_PKEY_DSA3   NID_dsaWithSHA1
# define EVP_PKEY_DSA4   NID_dsaWithSHA1_2
# define EVP_PKEY_DH     NID_dhKeyAgreement
# define EVP_PKEY_DHX    NID_dhpublicnumber
# define EVP_PKEY_EC     NID_X9_62_id_ecPublicKey
# define EVP_PKEY_HMAC   NID_hmac
# define EVP_PKEY_CMAC   NID_cmac
# define EVP_PKEY_TLS1_PRF   NID_tls1_prf
# define EVP_PKEY_HKDF       NID_hkdf
# define EVP_PKEY_PAILLIER   NID_paillier
# define EVP_PKEY_SM9_MASTER NID_id_sm9MasterSecret
# define EVP_PKEY_SM9        NID_id_sm9PublicKey

OpenSSL还支持异步模式,引擎中需要增加ASYNC_x相关接口完成挂起以及唤醒操作,在异步模式过程中,首先通过ASYNC_start_job接口创建异步Job,引擎相关加速接口中将任务卸载到硬件后通过ASYNC_get_wait_ctx接口得到当前异步job,并通过ASYNC_WAIT_CTX_get_fd接口得到异步句柄,通过读取异步句柄的方式将任务挂起,当硬件计算完成后通过回调函数将任务唤醒继续执行,该过程和将人物挂起的流程类似,通过写异步句柄的方式将人物唤醒。由于示例代码中没有使用硬件设备,异步模式没有进行添加,但在实际应用中确非常重要。

总结

OpenSSL不仅提供了很多实用的工具,其引擎框架在实际应用中也非常重要,与之对应的GmSSL同样非常优秀。从NGINXOpenSSL再到PCIE加密卡,使得HTTPS的连接速度变得更快。

加密模式 openssl sm4_OpenSSL/GmSSL 动态引擎相关推荐

  1. OpenSSL/GmSSL 动态引擎

    OpenSSL 简介 OpenSSL 是包含安全套接字层和传输层安全协议的开源软件库,它几乎成为安全领域的事实标准,大部分的服务器和客户端都使用 OpenSSL,一些硬件加密算法的实现通常也需要使用 ...

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

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

  3. 实战篇-OpenSSL之调用EVP框架实现AES多种加密模式

    本文属于<OpenSSL加密算法库使用系列教程>之一,欢迎查看其它文章. 实战篇-OpenSSL之调用EVP框架实现AES多种加密模式 一.OpenSSL EVP简介 二.EVP中对称加密 ...

  4. php openssl支持的加密算法和加密模式及加密解密示范实例

    <style> textarea{width:88%;height:188px;} </style><?php // 定义要加密的数据 $data = '我是中文@Thi ...

  5. OpenSSL RSA加密模式

    一.RSA_NO_PADDING模式,顾名思义,无填充: 测试运行时,也遇到几个问题,需要注意(以下举例均以模数1024bit,128字节): 1.加密数不能大于模数 否则,会报错:"dat ...

  6. Python代码实现MD5、AES对称加密和RSA非对称加密以及OpenSSl实践

    1.MD5加密算法 1.1 MD5加密的特点 不可逆运算 对不同的数据加密的结果是定长的32位和16位字符(不管文件多大都一样) 对相同的数据加密,得到的结果是一样的(也就是复制). 抗修改性 :信息 ...

  7. 无线网络安全:看无线网络各类加密模式

    要想在无线网络里放心冲浪,对其加密是保障无线网络安全的一种方法.这里就为大家介绍几种无线加密模式. WEP(有线等效加密) 尽管从名字上看似乎是一个针对有线网络的安全选项,其实并不是这样.WEP标准在 ...

  8. 加密模式||填充模式

    加密模式:https://docs.oracle.com/javase/8/docs/api/javax/crypto/Cipher.html ECB ECB : Electronic codeboo ...

  9. 3des java ecb_PHP 3DES加密 与JAVA通用 加密模式:ECB

    昨天帮同事解决了一个接口加密的算法,同事是个小姑娘,不懂,所以老大派我协助她,所以我为了不在姑凉面前掉面子~~火速解决它... 甲方是电信,JAVA写的接口,我一听头就大了,大家都知道~~PHP在加密 ...

最新文章

  1. tidb mysql 协议_TiDB源码阅读(二) TiDB中的MySQL协议
  2. 【青少年编程】【四级】数字反转
  3. 江苏省三级偏软考试大纲
  4. Ubuntu最简单的方式安装NVIDIA显卡驱动和cuda工具
  5. Android—AspectJ实践
  6. 无心剑英译林清玄《永恒》
  7. 拓端tecdat|用R对Twitter用户的编程语言语义分析
  8. 【2018-2019 ACM-ICPC Pacific Northwest Regional Contest (Div. 1) D】Count The Bits【数位DP】
  9. ESD二极管,SOT-23封装型号大全
  10. 历史 微信开发者工具_微信开发者工具
  11. RabbitMQ使用教程
  12. miniblink每日最新下载地址
  13. Python的一点人生经验
  14. 微信小程序覆盖map组件
  15. 2020-10 补丁日:Oracle多个产品高危漏洞安全风险通告
  16. 据为己有!这位985博导把审稿的文章拒了,自己投!
  17. 基恩士KV-N60主站,KV-N14从站,松下触摸屏
  18. 独家记忆孙嘉灵海棠首发 婉转乐曲演绎动心爱情
  19. 【C++】C++11新特性
  20. Set里的元素是不能重复的,那么用什么方法来区分重复与否呢 是用==还是equals() 它们有何区别

热门文章

  1. ubuntu--雷鸟只能收邮件不能发邮件
  2. 谈谈这些年来我为什么一直在坚持
  3. 剑指offer(C++)-JZ76:删除链表中重复的结点(数据结构-链表)
  4. C++-采样函数GridSampling(采样提速必备)
  5. html显示数据库的数据类型,将HTML插入mysql数据库,显示E类型
  6. 壳体花纹怎么设计_换热器设计大全
  7. Some personal records
  8. 软件测试工程师,需要达到什么水平才能顺利拿到 20k+ 无压力?
  9. cmd sqlplus远程连接_Oracle连接远程数据库的四种方法
  10. 中随机打乱序列的函数_excel函数应用:如何快速制作考生座次分配表