加密模式 openssl sm4_OpenSSL/GmSSL 动态引擎
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
完成硬件加速成为了一种通用的加速手段。例如 intel
的 QAT
,国内的江南天安等。本文的剩余部分将介绍如何完成 OpenSSL
动态引擎的编写。
编写 OpenSSL Engine
除了国际算法,实际应用中可能有国密算法的需求,例如部分应用中需要使用国密套件SM2-WITH-SMS4-SM3
进行TLS
连接。本文将使用GmSSL完成引擎的实现。本文的示例代码可参考 gmssl_engine
。OpenSSL
提供了引擎相关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_METHOD
,OpenSSL 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
同样非常优秀。从NGINX
到OpenSSL
再到PCIE
加密卡,使得HTTPS
的连接速度变得更快。
加密模式 openssl sm4_OpenSSL/GmSSL 动态引擎相关推荐
- OpenSSL/GmSSL 动态引擎
OpenSSL 简介 OpenSSL 是包含安全套接字层和传输层安全协议的开源软件库,它几乎成为安全领域的事实标准,大部分的服务器和客户端都使用 OpenSSL,一些硬件加密算法的实现通常也需要使用 ...
- OpenSSL之调用EVP框架实现AES多种加密模式
OpenSSL之调用EVP框架实现AES多种加密模式 一.OpenSSL EVP简介 二.EVP中对称加密与解密流程 三.通过EVP实现AES多种加密模式 四.测试代码 原文链接: https://b ...
- 实战篇-OpenSSL之调用EVP框架实现AES多种加密模式
本文属于<OpenSSL加密算法库使用系列教程>之一,欢迎查看其它文章. 实战篇-OpenSSL之调用EVP框架实现AES多种加密模式 一.OpenSSL EVP简介 二.EVP中对称加密 ...
- php openssl支持的加密算法和加密模式及加密解密示范实例
<style> textarea{width:88%;height:188px;} </style><?php // 定义要加密的数据 $data = '我是中文@Thi ...
- OpenSSL RSA加密模式
一.RSA_NO_PADDING模式,顾名思义,无填充: 测试运行时,也遇到几个问题,需要注意(以下举例均以模数1024bit,128字节): 1.加密数不能大于模数 否则,会报错:"dat ...
- Python代码实现MD5、AES对称加密和RSA非对称加密以及OpenSSl实践
1.MD5加密算法 1.1 MD5加密的特点 不可逆运算 对不同的数据加密的结果是定长的32位和16位字符(不管文件多大都一样) 对相同的数据加密,得到的结果是一样的(也就是复制). 抗修改性 :信息 ...
- 无线网络安全:看无线网络各类加密模式
要想在无线网络里放心冲浪,对其加密是保障无线网络安全的一种方法.这里就为大家介绍几种无线加密模式. WEP(有线等效加密) 尽管从名字上看似乎是一个针对有线网络的安全选项,其实并不是这样.WEP标准在 ...
- 加密模式||填充模式
加密模式:https://docs.oracle.com/javase/8/docs/api/javax/crypto/Cipher.html ECB ECB : Electronic codeboo ...
- 3des java ecb_PHP 3DES加密 与JAVA通用 加密模式:ECB
昨天帮同事解决了一个接口加密的算法,同事是个小姑娘,不懂,所以老大派我协助她,所以我为了不在姑凉面前掉面子~~火速解决它... 甲方是电信,JAVA写的接口,我一听头就大了,大家都知道~~PHP在加密 ...
最新文章
- tidb mysql 协议_TiDB源码阅读(二) TiDB中的MySQL协议
- 【青少年编程】【四级】数字反转
- 江苏省三级偏软考试大纲
- Ubuntu最简单的方式安装NVIDIA显卡驱动和cuda工具
- Android—AspectJ实践
- 无心剑英译林清玄《永恒》
- 拓端tecdat|用R对Twitter用户的编程语言语义分析
- 【2018-2019 ACM-ICPC Pacific Northwest Regional Contest (Div. 1) D】Count The Bits【数位DP】
- ESD二极管,SOT-23封装型号大全
- 历史 微信开发者工具_微信开发者工具
- RabbitMQ使用教程
- miniblink每日最新下载地址
- Python的一点人生经验
- 微信小程序覆盖map组件
- 2020-10 补丁日:Oracle多个产品高危漏洞安全风险通告
- 据为己有!这位985博导把审稿的文章拒了,自己投!
- 基恩士KV-N60主站,KV-N14从站,松下触摸屏
- 独家记忆孙嘉灵海棠首发 婉转乐曲演绎动心爱情
- 【C++】C++11新特性
- Set里的元素是不能重复的,那么用什么方法来区分重复与否呢 是用==还是equals() 它们有何区别
热门文章
- ubuntu--雷鸟只能收邮件不能发邮件
- 谈谈这些年来我为什么一直在坚持
- 剑指offer(C++)-JZ76:删除链表中重复的结点(数据结构-链表)
- C++-采样函数GridSampling(采样提速必备)
- html显示数据库的数据类型,将HTML插入mysql数据库,显示E类型
- 壳体花纹怎么设计_换热器设计大全
- Some personal records
- 软件测试工程师,需要达到什么水平才能顺利拿到 20k+ 无压力?
- cmd sqlplus远程连接_Oracle连接远程数据库的四种方法
- 中随机打乱序列的函数_excel函数应用:如何快速制作考生座次分配表