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这个函数。
分享到:
相关推荐
本文介绍了OpenSSL对称加密算法中添加新算法的方法。
易语言OpenSSL加密算法源码,OpenSSL加密算法,AES_CBC_encrypt,NoPadding,pkcs5padding,ISO10126Padding,Padding_dec,random,Base64Encoding,Base64Decrypt,AES_set_encrypt_key,AES_cbc_encrypt,AES_set_decrypt_key
openSSL DES ecb padding
通过调用openssl 的rsa 算法,封装成Qt版本接口的实现。通过本示例了解rsa 算法,了解密钥如何从字符串和16进制之间的转化。
基于Openssl算法库实现的SM2算法。实现数字签名和密钥交换,公钥加密没有实现。全部源代码,需要Openssl库支持,VC工程。 KDF使用标准HASH算法,没有使用SM3。 可参考作者的SM3算法实现KDF。 ECC曲线使用SM2算法建议...
openssl rsa算法加密,
需要了解 ECC 加密的,可以参考一下,这个是基于openssl 的ECC 算法。解压后,test_ecc 里面是测试代码,大家看看,就明白了ECC算法的流程,里面有生成key,加密、解密。
一个简单的程序,通过调用openssl中的RSA加密算法对明文加密,然后用MD5算法提取明文摘要,最后用RSA算法对密文解密,简单演示了数字签名的过程。 其中,加密过程采用CBC模式,分块长度为256位,最后一个分块不足一...
易语言OpenSSL加密算法源码。@资源源码站。
国密算法--Openssl 实现国密算法(加密和解密),内涵对称算法,非对称算法加解密流程,图文直观,并附有C语言代码
[i][b]关于openssl中blowfish算法的运用。blowfish算法,包括Blowfish-ECB,Blowfish-CBC,Blowfish-CTR,Blowfish-OFB,Blowfish-CFB,目前我的Demo只实现了ECB是如何运用的。[/b][/i]注意:嵌入式开发的小伙伴们,如果...
用openssl实现sm2算法文档中示例,包括数字签名,密钥交换,加解密,KDF用sm3算法
易语言源码易语言OpenSSL加密算法源码.rar
OpenSSL是一个强大的安全套接字层密码库,Apache使用它加密HTTPS,OpenSSH使用它加密SSH,但是,你不应该只将其作为一个库来... 本工具调用了OPENSSL中的加密算法库,用来实现包含DES、AES、RSA以及摘要算法的加解密。
TaSSL,在国际开源OpenSSL基础上融入了SM2、SM3、SM4国密算法,按照国密SSL标准实现了基于国密双证书体系和国产密码算法的SSL安全通讯服务,并兼容原有OpenSSL的架构体系,彻底解决了国内商用密码体系无法构建基于...
3DES加密算法,使用openssl库,ECB算法,pkcs7padding填充模式(借鉴网上的算法,并经过自己的改良,可以实现加密与解密)
OpenSSL对称算法、哈希校验、非对称算法、证书管理、SSL安全
OpenSSL加密算法套件[归类].pdf
通过对开源项目OpenSSL分析,整理了GMSSL项目介绍,Windows下的编译,Windows命令行下SM4加解密,SM2密钥对生成,加密验签的操作方法等。