OpenSSL 是一个开源的软件库,提供了一组用于进行加密、解密、哈希和证书操作的函数和工具。其中,EVP(Envelope Cryptography API)是 OpenSSL 中的一个模块,用于处理对称加密和哈希算法。
EVP 提供了一个统一的接口,使得开发人员能够使用相同的代码处理不同的加密算法,而无需关心具体的算法细节。它支持对称加密算法(如 AES、DES、RC4)、哈希算法(如 MD5、SHA-1)以及其他一些密码学功能。

EVP 模块的主要特点和功能:

  1. 简化的编程接口:EVP 提供了一个高级的、简化的编程接口,使得开发人员可以使用相同的方式处理各种对称加密和哈希算法,无需直接操作底层算法细节。
  2. 支持多种加密算法:EVP 支持多种常见的对称加密算法,如 AES、DES、RC4 等,以及一些其他的算法。
  3. 支持多种哈希算法:EVP 支持多种常见的哈希算法,如 MD5、SHA-1、SHA-256 等,以及一些其他的算法。
  4. 提供安全的随机数生成:EVP 提供了安全的伪随机数生成函数,用于生成加密过程中所需的随机数,以增加安全性。
  5. 支持密码学功能:EVP 不仅提供了加密和哈希算法,还支持其他密码学功能,如数字签名、密钥派生、公钥加密等。

使用 EVP 模块可以极大地简化密码学操作的代码编写过程,并提高代码的可读性和可维护性。开发人员可以根据需要选择适当的算法和函数来实现加密、解密、哈希和其他密码学功能。同时,EVP 模块也遵循了密码学的最佳实践和标准,提供了可信赖的加密和哈希功能。

想要详细了解的可以单独去搜索相关资料,这里还是使用 EVP_aes_256_cbc 来加密。
EVP_aes_256_cbc 提供了一种安全且广泛使用的加密算法,适用于保护敏感数据的机密性

  1. 密钥长度:EVP_aes_256_cbc 使用 256 位的密钥长度,提供更高的安全性,使得破解密钥变得困难。
  2. 加密模式:EVP_aes_256_cbc 使用 CBC 模式,在加密数据块之前,先将明文分块,并将前一个密文块与当前明文块进行异或运算,以增强加密的随机性和安全性。
  3. 填充方式:EVP_aes_256_cbc 使用标准的填充方式(PKCS#5 或 PKCS#7),以确保待加密数据的长度是块长度的整数倍。
  4. 初始化向量(IV):CBC 模式需要一个初始化向量作为初始状态。开发人员需要自行生成一个安全的随机初始化向量,并在加密和解密时保持一致。
  5. 安全性:EVP_aes_256_cbc 是一个被广泛接受和使用的加密算法,提供了较高的安全强度。然而,为了确保最佳的安全性,开发人员还应采取其他安全措施,如正确处理密钥、随机数和不当使用情况等。

密钥问题: 在算法中真正使用的密钥长度和初始化密钥长度是根据算法来决定的。(也就是你传入的key或者iv长度可以是任意的,实际使用的数据取决于算法,不足会自动补上,超过会自动舍去

#include <iostream>
#include <openssl/aes.h>
#include <openssl/evp.h>bool encryptFile(const std::string& inputFile, const std::string& outputFile, const std::string& key, const std::string& iv) {// 初始化 OpenSSL 的 EVP 库EVP_CIPHER_CTX* ctx = EVP_CIPHER_CTX_new();if (!ctx) {std::cout << "无法初始化 OpenSSL EVP 库" << std::endl;return false;}// 使用 AES-256-CBC 加密算法const EVP_CIPHER* cipher = EVP_aes_256_cbc();// 初始化加密上下文if (EVP_EncryptInit_ex(ctx, cipher, nullptr, (const unsigned char*)key.c_str(), (const unsigned char*)iv.c_str()) != 1) {std::cout << "无法初始化加密上下文" << std::endl;EVP_CIPHER_CTX_free(ctx);return false;}// 打开输入文件FILE* inFile = fopen(inputFile.c_str(), "rb");if (!inFile) {std::cout << "无法打开输入文件" << std::endl;EVP_CIPHER_CTX_free(ctx);return false;}// 创建输出文件FILE* outFile = fopen(outputFile.c_str(), "wb");if (!outFile) {std::cout << "无法创建输出文件" << std::endl;fclose(inFile);EVP_CIPHER_CTX_free(ctx);return false;}// 加密缓冲区const int BUFFER_SIZE = 4096;unsigned char bufferIn[BUFFER_SIZE];unsigned char bufferOut[BUFFER_SIZE + EVP_MAX_BLOCK_LENGTH];int bytesRead;int bytesWritten;// 加密输入文件并写入输出文件while ((bytesRead = fread(bufferIn, 1, BUFFER_SIZE, inFile)) > 0) {if (EVP_EncryptUpdate(ctx, bufferOut, &bytesWritten, bufferIn, bytesRead) != 1) {std::cout << "加密错误" << std::endl;fclose(inFile);fclose(outFile);EVP_CIPHER_CTX_free(ctx);return false;}fwrite(bufferOut, 1, bytesWritten, outFile);}// 结束加密过程if (EVP_EncryptFinal_ex(ctx, bufferOut, &bytesWritten) != 1) {std::cout << "加密结束错误" << std::endl;fclose(inFile);fclose(outFile);EVP_CIPHER_CTX_free(ctx);return false;}fwrite(bufferOut, 1, bytesWritten, outFile);// 清理加密上下文EVP_CIPHER_CTX_free(ctx);// 关闭文件fclose(inFile);fclose(outFile);std::cout << "加密完成" << std::endl;return true;
}bool decryptFile(const std::string& inputFile, const std::string& outputFile, const std::string& key, const std::string& iv) {// 初始化 OpenSSL 的 EVP 库EVP_CIPHER_CTX* ctx = EVP_CIPHER_CTX_new();if (!ctx) {std::cout << "无法初始化 OpenSSL EVP 库" << std::endl;return false;}// 使用 AES-256-CBC 加密算法const EVP_CIPHER* cipher = EVP_aes_256_cbc();// 初始化加密上下文if (EVP_DecryptInit_ex(ctx, cipher, nullptr, (const unsigned char*)key.c_str(), (const unsigned char*)iv.c_str()) != 1) {std::cout << "无法初始化解密上下文" << std::endl;EVP_CIPHER_CTX_free(ctx);return false;}// 打开输入文件FILE* inFile = fopen(inputFile.c_str(), "rb");if (!inFile) {std::cout << "无法打开输入文件" << std::endl;EVP_CIPHER_CTX_free(ctx);return false;}// 创建输出文件FILE* outFile = fopen(outputFile.c_str(), "wb");if (!outFile) {std::cout << "无法创建输出文件" << std::endl;fclose(inFile);EVP_CIPHER_CTX_free(ctx);return false;}// 加密缓冲区const int BUFFER_SIZE = 4096;unsigned char bufferIn[BUFFER_SIZE];unsigned char bufferOut[BUFFER_SIZE + EVP_MAX_BLOCK_LENGTH];int bytesRead;int bytesWritten;// 加密输入文件并写入输出文件while ((bytesRead = fread(bufferIn, 1, BUFFER_SIZE, inFile)) > 0) {if (EVP_DecryptUpdate(ctx, bufferOut, &bytesWritten, bufferIn, bytesRead) != 1) {std::cout << "解密错误" << std::endl;fclose(inFile);fclose(outFile);EVP_CIPHER_CTX_free(ctx);return false;}fwrite(bufferOut, 1, bytesWritten, outFile);}// 结束加密过程if (EVP_DecryptFinal_ex(ctx, bufferOut, &bytesWritten) != 1) {std::cout << "解密结束错误" << std::endl;fclose(inFile);fclose(outFile);EVP_CIPHER_CTX_free(ctx);return false;}fwrite(bufferOut, 1, bytesWritten, outFile);// 清理加密上下文EVP_CIPHER_CTX_free(ctx);// 关闭文件fclose(inFile);fclose(outFile);std::cout << "解密完成" << std::endl;return true;
}int main() {std::string inputFile = "input.mp4";std::string encryptedFile = "encrypted.enc";std::string decryptedFile = "decrypted.mp4";const std::string key = "0123456789abcdef0123456789abcdef";const std::string iv = "abcdef0123456789";encryptFile(inputFile, encryptedFile, key, iv);decryptFile(encryptedFile, decryptedFile, key, iv);std::cout << "视频加密解密完成!\n" << std::endl;return 0;
}

补充文件

  • OpenSSL中文手册之EVP库详解

记录一个视频加密解密--AES 进阶版 (EVP)相关推荐

  1. android视频流加密,android 视频 加密/解密(使用AES)

    java语言进行加密解密速度挺慢的..一个6MB左右的文件需要10多秒...等有空了瞅瞅ffmpeg去.. MainActivity.java /** * 视频加密/解密 * * @author ol ...

  2. 解决安卓视频同步(下载)到本地,视频加密解密播放问题

    安卓视频加密解密播放问题 出现问题场景:安卓端需要用到视频播放部分,鉴于为防止视频到处拷贝,故有此场景.目前播放部分采用的是ExoPlayer开源播放插件,下载部分采用的是filedownloader ...

  3. [crypto]-52-python3中rsa(签名验签加密解密)aes(ecb cbc ctr)hmac的使用,以及unittest测试用

    环境: 在ubuntu14.04下,记得安装:sudo pip3 install pycrypto 代码示例1: =========================== import base64 f ...

  4. python rsa加密解密_RSA加密解密(python版)

    RSA的算法涉及三个参数,n.e.d. 其中,n是两个大质数p.q的积,n的二进制表示时所占用的位数,就是所谓的密钥长度. e1和d是一对相关的值,e可以任意取,但要求e与(p-1)*(q-1)互质: ...

  5. 利用php的mcrypt模块加密解密(AES、DES等等)

    php des加密: $cipher_list = mcrypt_list_algorithms();//mcrypt支持的加密算法列表 $mode_list = mcrypt_list_modes( ...

  6. RSA加密解密DES加密解密AES

    文章目录 RSA java 依赖 RSACoder RSACoderTest js示例 DES 示例一 js java 示例2 js java AES AesUtil RSA java 依赖 < ...

  7. python加密解密开源库_RSA加密解密(python版)

    RSA的算法涉及三个参数,n.e.d. 其中,n是两个大质数p.q的积,n的二进制表示时所占用的位数,就是所谓的密钥长度. e1和d是一对相关的值,e可以任意取,但要求e与(p-1)*(q-1)互质: ...

  8. Python3 django2.0 字段加密 解密 AES

    以下设置,适用于python3.5及以前的 pip install pycryptoimport base64 from Crypto.Cipher import AES from Crypto im ...

  9. 传奇3外挂加密解密过程(C#)版

    加密算法1:public string Base64Encode(string source){byte[] a1,a2,a3;BitArray b1,b2,b3;a1 = Encoding.Defa ...

最新文章

  1. 照抄不翻车:抗住千万流量的大型分布式系统架构设计
  2. python中元组的使用_Python当中tuple元组的使用
  3. 将solr安装到tomcat里
  4. 《入门经典》——6.24
  5. C/C++学习之路_九:文件操作
  6. oracle dbfile数,通过案例学调优之--Oracle参数(db_file_multiblock_read_count)
  7. 苹果支付60亿美元与高通和解?亚马逊不再运营中国国内市场业务;华为愿同德国签“无间谍软件协议”;Facebook开发语音服务...
  8. python os模块 os.chmod
  9. c语言开发刷机工具,移动叔叔专用mtk刷机工具
  10. 原生H5+JS文件上传
  11. 解压war包并重新编译成war包
  12. jadx重新打包_Android改机系列:一.Android一键新机原理刨析
  13. SVN回退到之前的版本
  14. luogu P3324 [SDOI2015]星际战争
  15. Efficientnet-b5网络结构
  16. K8S查看服务器日志
  17. excel文件下载下来损坏 js_使用Java / javascript和apache POI导出.xls文件时获取损坏的文件...
  18. ESB 企业服务总线基本内容概述
  19. 旧金山大学的算法可视化学习教程 赞的教程,将抽象的算法可视化,易于理解...
  20. 计算机网络国际标准界最,计算机网络标准综述.pdf

热门文章

  1. 有奖征文活动:从 RTC 到 RTE,从音视频到「实时万象」!
  2. c语言 random安全函数,random函数-关于C语言的函数问题请问,randomize()random这两 爱问知识人...
  3. USACO Section 2.3 Money Systems - 矮油.有Trick阿...
  4. 学计算机找对象容易吗,这4个大学专业单身率最高,找到对象很不容易,一直单身到毕业...
  5. 网页木马的特征 清除木马和病毒的具体操作步骤
  6. Z字形扫描(对矩阵进行Z字形扫描)
  7. 从计算机上移除p2p程序最有效的方法,手动删除p2psrv.exe
  8. 0/0型极限等于多少_高等数学——讲透求极限两大方法,夹逼法与换元法
  9. abap CA CO CS CP
  10. 使用Eclipse开发工具运行MapReduce统计单词出现次数