openssl 框架中的另一个重头戏就是EVP接口,它提供了所有的加密和解密实现,不但封装了已有的著名算法,而且其简单易用的接口可以让你自己轻松实现一个算法,这 就增强了它的可扩展性,基本上,openssl只是提供了机制框架,策略由用户实现。EVP接口的重要数据结构如下:
typedef struct evp_cipher_st
{
int nid; //对象识别ID
int block_size; //加密数据的长度
int key_len; //加密算法缺省密钥长度
int iv_len;
unsigned long flags;
int (*init)(EVP_CIPHER_CTX *ctx, const unsigned char *key, const unsigned char *iv, int enc);
int (*do_cipher)(EVP_CIPHER_CTX *ctx, unsigned char *out, const unsigned char *in, unsigned int inl);//加密或者解密
int (*cleanup)(EVP_CIPHER_CTX *); //清理析构回调函数
int ctx_size;
int (*set_asn1_parameters)(EVP_CIPHER_CTX *, ASN1_TYPE *);
int (*get_asn1_parameters)(EVP_CIPHER_CTX *, ASN1_TYPE *);
int (*ctrl)(EVP_CIPHER_CTX *, int type, int arg, void *ptr); //操作函数
void *app_data;
}EVP_CIPHER;
typedef struct evp_cipher_ctx_st
{
const EVP_CIPHER *cipher; //加密结构
ENGINE *engine;
int encrypt; //指示加密还是解密
int buf_len; //该结构缓冲区里面当前的数据长度
unsigned char oiv[EVP_MAX_IV_LENGTH];
unsigned char iv[EVP_MAX_IV_LENGTH];
unsigned char buf[EVP_MAX_BLOCK_LENGTH];
int num;
void *app_data;
int key_len; //密钥长度
unsigned long flags;
void *cipher_data;
int final_used;
int block_mask;
unsigned char final[EVP_MAX_BLOCK_LENGTH];
} EVP_CIPHER_CTX;
我 们看一下EVP有几种被使用的方式,首先它可以直接被使用,也就是直接生成一个特定加密算法EVP_CIPHER对象即可,然后调用其do_cipher 实现加密或者解密,另外如果我们在更加复杂的环境或者更加复杂的流程中使用它的话,那么就需要更大的数据结构EVP_CIPHER_CTX来作为一个上下 文环境来包容一个特定的加密解密算法,比如它可以包含在一个BIO之中:
typedef struct enc_struct
{
int buf_len;
int buf_off;
int cont; /* int finished;
int ok; /* bad decrypt */
EVP_CIPHER_CTX cipher;
char buf[ENC_BLOCK_SIZE+BUF_OFFSET+2];
} BIO_ENC_CTX;
本 身来讲,BIO中就有那么一种过滤类型的BIO专门就是为了加密解密用的。另外用于ssl是必然的,本身openssl中最拿手的就是这个EVP了,所有 的安全加密解密都由它来实现,ssl本身就是安全相关的协议,因此实用角度,EVP的意义对于openssl来讲比BIO更加重要。因此正如下文讲的 SSL结构体中就有一个EVP的指针。
附:加密
迄今为止,加密算法分为对称算法和不对称算法又称公钥算法,公钥算法自然不必多说,依赖数 学函数的反解困难性,安全性大大提供,但是缺点就是太聪明了,导致不太容易被硬件实现,或者用软件实现速度也不佳,而对称算法由于基本都是靠置换和移位来 加密的,而计算机硬件最擅长的可能就是做这种事情了,因此往往都是使用公钥算法交换对称密钥,然后用对称算法进行加密,但是问题是,为何众人皆知的过程最 终就可以加密数据呢?要知道S盒之类的可是公开的啊。其实很简单,这就是混乱和和谐的辩证,1000中和谐只要加入1个混乱,那么结果就是混乱的,这是信 息熵决定的。和谐和混乱本来就是不是对称的,因为和谐的信息熵更低,而混乱的信息熵更高,同样数量的和谐和混乱信息熵不同,因此人们彻底搞清楚信息含义所 付出的努力也不会相同。如果一个数字序列,很和谐,1,2,3,4..突然在403后面来了一个37,是不是晕了,前面的假设被推翻,有时候就是这样,混 乱不一定越多越乱,在有序当中插入一点混乱就不得了了,对称加密算法中的置换其实就是为了掩人耳目的。事实证明,如果完全用混乱的加密算法,效率很差,效 果不一定多好,混入一些可以高效实现的置换,移位,不会因为这些操作是有序的就很容易被破解,效率还可以得到大大提升,要点就是整个加密过程不是完全的有 序的,而是混杂进了一点点无序,哪怕每次加一点或者说线性加入,解密难度将会指数级上升。
分享到:
相关推荐
出现以下报错,替换/usr/local/include/openssl里面的文件之后编译成功。add_assoc_name_entry’:/data/src/php-5.6.23/ext/openssl/openssl.c:664: warning: ‘ASN1_STRING_data’ is deprecated (declared at /usr...
openssl-devel-1.0.1e-57.el6.x86_64.rpm离线安装时的相关依赖库: openssl-devel-packages\e2fsprogs-1.41.12-22.el6.x86_64.rpm openssl-devel-packages\e2fsprogs-libs-1.41.12-22.el6.x86_64.rpm openssl-...
php使用openssl_encrypt中的AES-128-ECB加密解密 保证的传输数据的安全性 保证了开发系统的安全性
openssl-devel-1.1.1o-1.el7.x86_64 openssl-devel openssl openssl rpm包
[root@localhost openssl-1.1.1c]# ./config --prefix=/usr/local/openssl --openssldir=/usr/local/openssl enable-ec_nistp_64_gcc_128 [root@localhost openssl-1.1.1c]# make && make install 时间有点久。 ...
linux下编译/交叉编译openssl-1.1.1g生成动态库和静态库方法: 一、编译linux版本 1. cp openssl-1.1.1g.tar.gz /opt/ 2. tar -zxvf openssl-1.1.1g.tar.gz 3. mkdir build 4. ./config --prefix=/opt/openssl-1.1.1...
openssl-devel-1.0.2k-19.el7.x86_64.rpm的离线包,centos7版本的。
// C/C++, 利用OpenSSL库对Socket传输进行安全加密(RSA+AES) // 1. 利用RSA安全传输AES生成密钥所需的Seed(32字节) // 2. 利用AES_encrypt/AES_decrypt对Socket上面的业务数据进行AES加密/解密 // --- // * 理论上只...
sudo tar -zxvf openssl-1.0.1t.tar.gz # 安装nginx # Nginx 一般有两个版本,分别是稳定版和开发版,您可以根据您的目的来选择这两个版本的其中一个,下面是把 Nginx 安装到 /usr/local/nginx 目录下的详细步骤: ...
文件:openssl-1.1.1a.tar.gz 格式:*.tar.gz 来源:下载自官网 www.openssl.org 说明:于2018年12月下载,是当时的最新版、最高版 使用方法(亲测留档):以下为Ubuntu16.04.5上亲测,卸载并安装新版openssl # ...
openssl-devel-1.0.1e-42.el6.x86_64.rpm
--with-openssl=../openssl-1.1.1w \ --with-pcre=../pcre-8.45 \ --with-zlib=../zlib-1.3 \ --with-http_ssl_module \ --without-http_memcached_module \ --with-http_stub_status_module \ --with-...
openssl-libs-1.0.2k-16.el7.x86_64.rpm
官方离线安装包,测试可用。请使用rpm -ivh [rpm完整包名] 进行安装
官方离线安装包,测试可用。请使用rpm -ivh [rpm完整包名] 进行安装
Windows Server 合规漏洞修复,修复Windows Server CVE-2016-2183 SSL/TLS协议信息泄露漏洞修复脚本,基于Windows PowerShell, 兼容Windows Server 2016/2019,防止Sweet32 生日攻击
openssl-1.1.1-stable-SNAP-20190915
官方离线安装包,测试可用。请使用rpm -ivh [rpm完整包名] 进行安装
官方离线安装包,亲测可用。使用rpm -ivh [rpm完整包名] 进行安装