openssl之EVP

本文介绍了OpenSSL中的EVP(Encryption/Decryption Primitives)接口,EVP不仅包含了SSL的安全通信功能,还支持多种加密算法如DES、3DES、AES等。EVP提供了一种统一的接口,简化了加密和解密的过程。通过对EVP接口的使用,开发者可以方便地实现对称加密,包括ECB、CBC、CFB、OFB等模式。文章详细讲解了EVP_EncryptInit_ex、EVP_EncryptUpdate、EVP_EncryptFinal_ex等基本加密函数的用法,以及如何设置加密参数和使用不同加密算法。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

本文参考百度百科和http://blog.csdn.net/gdwzh/article/details/19231

一,什么是openssl?

        SSL 是一个缩写,代表的是 Secure Sockets Layer。它是支持在 Internet 上进行安全通信的标准,并且将数据密码术集成到了协议之中。数据在离开您的计算机之前就已经被加密,然后只有到达它预定的目标后才被解密。证书和密码学算法支持了这一切的运转,使用 OpenSSL,您将有机会切身体会它们。

        理论上,如果加密的数据在到达目标之前被截取或窃听,那些数据是不可能被破解的。不过,由于计算机的变化一年比一年快,而且密码翻译方法有了新的发展,因此,SSL 中使用的加密协议被破解的可能性也在增大。

        可以将 SSL 和安全连接用于 Internet 上任何类型的协议,不管是 HTTP、POP3,还是 FTP。还可以用 SSL 来保护 Telnet 会话。虽然可以用 SSL 保护任何连接,但是不必对每一类连接都使用 SSL。如果连接传输敏感信息,则应使用 SSL。

        OpenSSL 不仅仅是 SSL。它可以实现消息摘要、文件的加密和解密、数字证书、数字签名和随机数字。关于 OpenSSL 库的内容非常多,远不是一篇文章可以容纳的。OpenSSL 不只是 API,它还是一个命令行工具。命令行工具可以完成与 API 同样的工作,而且更进一步,可以测试 SSL 服务器和客户机。它还让开发人员对 OpenSSL 的能力有一个认识。

       OpenSSL采用C语言作为开发语言,这使得OpenSSL具有优秀的跨平台性能,这对于广大技术人员来说是一件非常美妙的事情,可以在不同的平台使用同样熟悉的东西。OpenSSL支持Linux、Windows、BSD、Mac、VMS等平台,这使得OpenSSL具有广泛的适用性。


二,EVP

      EVP是电脑的一种防毒技术,它可以防止缓存溢出,保护计算机免受缓存溢出型病毒及黑客程序的危害。

      EVP系列的函数定义包含在#include "openssl/evp.h"里面,这是一系列封装了openssl加密库里面所有算法的函数。通过这样的统一的封装,使得只需要在初始化参数的时候做很少的改变,就可以使用相同的代码但采用不同的加密算法进行数据的加密和解密。

    EVP系列函数主要封装了三大类型的算法:密钥证书管理,对称解密,非对称加密。

要支持全部这些算法,请调用OpenSSL_add_all_algorithms函数,下面分别就其结构作一个简单的介绍。

    【公开密钥算法】
    函数名称:EVP_Seal*...*,EVP_Open*...*
    功能描述:该系列函数封装提供了公开密钥算法的加密和解密功能,实现了电子信封的功能。
    相关文件:p_seal.c,p_open.c
    【数字签名算法】
    函数名称:EVP_Sign*...*,EVP_Verify*...*
    功能描述:该系列函数封装提供了数字签名算法和功能。
    相关文件:p_sign.c,p_verify.c
    【对称加密算法】
    函数名称:EVP_Encrypt*...*
    功能描述:该系列函数封装提供了对称加密算法的功能。
### OpenSSLEVP 的功能和用法 #### 功能概述 EVP(Envelope)接口是 OpenSSL 提供的一个高级别 API,其设计目标是为了简化加密操作并隐藏底层复杂性。通过该接口,开发者可以轻松执行多种加密任务而无需深入了解具体算法的实现细节[^2]。 #### 主要功能模块 以下是 EVP 接口的主要功能分类及其用途: 1. **对称加密** 对称加密支持 AES、DES 等常见算法。`EVP_EncryptInit_ex()` 和 `EVP_DecryptInit_ex()` 是初始化加密/解密上下文的核心函数。在实际使用过程中需要注意的是,如果遇到类似于 `EVP_DecryptFinal()` 卡住的情况,通常是因为填充模式不匹配或者数据长度不符合预期[^1]。 2. **哈希计算** 借助 EVP 函数库中的 Hash 计算接口,用户可方便地生成消息摘要。例如,SHA-256 或 SHA-512 可以通过简单的函数调用来完成。下面是一个基于 SHA-256 的代码示例[^3]: ```c #include <openssl/evp.h> #include <stdio.h> unsigned char *hash_message(const unsigned char *msg, size_t msg_len, unsigned int *digest_len) { EVP_MD_CTX *mdctx; const EVP_MD *md; unsigned char *digest; md = EVP_sha256(); digest = (unsigned char *)malloc(EVP_MAX_MD_SIZE); mdctx = EVP_MD_CTX_new(); if (!EVP_DigestInit_ex(mdctx, md, NULL)) goto err; if (!EVP_DigestUpdate(mdctx, msg, msg_len)) goto err; if (!EVP_DigestFinal_ex(mdctx, digest, digest_len)) goto err; EVP_MD_CTX_free(mdctx); return digest; err: if (mdctx != NULL) EVP_MD_CTX_free(mdctx); if (digest != NULL) free(digest); return NULL; } ``` 3. **公钥密码学** 支持 RSA 加密、签名验证等功能。这些操作可以通过 `EVP_PKEY_*` 系列函数来完成。它们允许动态加载私钥或公钥文件,并自动适配不同的算法类型。 4. **随机数生成器** 高质量的伪随机序列对于保障安全性至关重要。OpenSSL 的 RNG 实现同样集成到了 EVP 层次下,便于统一管理资源分配等问题。 #### 使用注意事项 当利用上述任意一种特性构建应用程序时,请务必遵循官方文档推荐的最佳实践指南。比如,在处理敏感信息之前先清理内存区域;始终校验返回状态码而非假设一切正常运行等等。 ---
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值