Linux C openssl aes-128-cbc demo
openssl 各版本下载
https://openssl-library.org/source/old/index.html
#include <stdio.h>
#include <string.h>
#include <openssl/aes.h>
#include <openssl/rand.h>
#include <openssl/evp.h>#define AES_KEY_BITS 128
#define GCM_IV_SIZE 12
#define GCM_TAG_SIZE 16int aes_cbc_encrypt(const unsigned char *plaintext,int plaintext_len, const unsigned char *aad,int aad_len, const unsigned char *key,unsigned char *ciphertext, unsigned char *tag)
{EVP_CIPHER_CTX *ctx = NULL;int len = 0;int ciphertext_len = 0;// 创建并初始化 EVP_CIPHER_CTX 对象ctx = EVP_CIPHER_CTX_new();EVP_EncryptInit_ex(ctx, EVP_aes_128_cbc(), NULL, NULL, NULL);// 设置加密密钥EVP_EncryptInit_ex(ctx, NULL, NULL, key, NULL);// 加密明文数据if (EVP_EncryptUpdate(ctx, ciphertext, &len, plaintext, plaintext_len) > 0){ciphertext_len = len;}else{printf("Error! \n");}// 结束加密过程,并生成认证标签EVP_EncryptFinal_ex(ctx, ciphertext + len, &len);ciphertext_len += len;EVP_CIPHER_CTX_ctrl(ctx, EVP_CTRL_GCM_GET_TAG, GCM_TAG_SIZE, tag);// 释放EVP_CIPHER_CTX对象EVP_CIPHER_CTX_free(ctx);return ciphertext_len;
}int aes_cbc_decrypt(const unsigned char *ciphertext,int ciphertext_len, const unsigned char *aad,int aad_len, const unsigned char *tag,const unsigned char *key, unsigned char *plaintext)
{EVP_CIPHER_CTX *ctx;int len;int plaintext_len;int ret;// 创建并初始化EVP_CIPHER_CTX对象ctx = EVP_CIPHER_CTX_new();EVP_DecryptInit_ex(ctx, EVP_aes_128_cbc(), NULL, NULL, NULL);// 设置解密密钥EVP_DecryptInit_ex(ctx, NULL, NULL, key, NULL);// 设置附加的认证数据(可选)EVP_DecryptUpdate(ctx, NULL, &len, aad, aad_len);// 解密密文数据EVP_DecryptUpdate(ctx, plaintext, &len, ciphertext, ciphertext_len);plaintext_len = len;// 设置接收到的认证标签EVP_CIPHER_CTX_ctrl(ctx, EVP_CTRL_GCM_SET_TAG, GCM_TAG_SIZE, (void *)tag);// 结束解密过程,如果认证失败则返回错误ret = EVP_DecryptFinal_ex(ctx, plaintext + len, &len);plaintext_len += len;// 释放EVP_CIPHER_CTX对象EVP_CIPHER_CTX_free(ctx);return ret == 1 ? plaintext_len : -1;
}int main()
{unsigned char key[AES_KEY_BITS / 8];unsigned char iv[GCM_IV_SIZE];unsigned char plaintext[] = "Hello, AES 128!";unsigned char ciphertext[sizeof(plaintext)];unsigned char decryptedtext[sizeof(plaintext)];unsigned char tag[GCM_TAG_SIZE];// 生成密钥if (RAND_bytes(key, sizeof(key)) != 1){printf("error generating AES key.\n");return 1;}printf("key: \n");for (int i = 0; i < AES_KEY_BITS / 8; i++){printf("0x%0x ", key[i]);}printf("\n");// 生成初始化向量if (RAND_bytes(iv, sizeof(iv)) != 1){printf("Error generating GCM IV.\n");return 1;}printf("\n");// 加密明文数据int ciphertext_len = aes_cbc_encrypt(plaintext, sizeof(plaintext) - 1, NULL, 0, key, ciphertext, tag);printf("line: %d ciphertext_len: %d Ciphertext: ", __LINE__, ciphertext_len);for (int i = 0; i < ciphertext_len; i++){printf("%02x", ciphertext[i]);}printf("\n");printf("line: %d Tag: ", __LINE__);for (int i = 0; i < GCM_TAG_SIZE; i++){printf("%02x", tag[i]);}printf("\n");// 解密密文数据int decryptedtext_len = aes_cbc_decrypt(ciphertext, ciphertext_len, NULL, 0, tag, key, decryptedtext);decryptedtext[decryptedtext_len] = '\0';printf("line: %d Decrypted text: %s\n", __LINE__, decryptedtext);return 0;
}
编译:
gcc main.c -o main -lssl -lcrypto
使用:
./main
读取文件到内存
#include <stdio.h>
#include <stdlib.h>
#include <memory.h>
#include <openssl/bio.h>
#include <sys/stat.h>
#include <sys/types.h>// 修改这,要预算大于文件内容
#define LENGTH 4096#define DEBUG_LOG(fmt, args...) \do \{ \printf("[debug] %s:%d %s() :", __FILE__, __LINE__, __FUNCTION__); \printf(fmt, ##args); \printf("\n"); \} while (0)/*** @brief** @param file_name 文件名称* @param pBuf 传出的文件内容指针* @param bufLen 传出文件内容的长度* @return int* */
int readFileBuf(const char *file_name, unsigned char **pBuf, int *bufLen)
{FILE *fp = NULL;int numRead = 0;int fileSize = 0;struct stat fileStat;if (NULL == file_name){DEBUG_LOG("input parameter is NULL");return -1;}memset(&fileStat, 0, sizeof(fileStat));if (stat(file_name, &fileStat) < 0){DEBUG_LOG("stat is error!\n");return -1;}else{DEBUG_LOG("size: 0x%X\n", fileStat.st_size);}// 创建跟文件大小一样的 buffileSize = fileStat.st_size;*pBuf = (unsigned char *)malloc(fileSize);if (NULL == *pBuf){DEBUG_LOG("malloc failed\n");return -1;}if ((fp = fopen(file_name, "r")) == NULL){DEBUG_LOG("open %s failed.\n", file_name);return -1;}numRead = fread(*pBuf, sizeof(unsigned char), fileSize, fp);if (numRead < fileSize){DEBUG_LOG("read file data failed.\n");fclose(fp);free(pBuf);return -1;}else{DEBUG_LOG("read file data success. fileSize: %d\n", fileSize);*bufLen = fileSize;}fclose(fp);return fileSize;
}int main()
{int numRead = 0;unsigned char *pBuf = NULL;// 目标文件const char *fileName = "./openssl-3.3.2.tar.gz";int length = 0;// 注意传进的 pBuf 是二重指针numRead = readFileBuf(fileName, &pBuf, &length);if (numRead > 0){DEBUG_LOG("length = %d\n", length);}// BIO_dump_fp(stdout, pBuf, length);free(pBuf);return 0;
}相关文章:
Linux C openssl aes-128-cbc demo
openssl 各版本下载 https://openssl-library.org/source/old/index.html#include <stdio.h> #include <string.h> #include <openssl/aes.h> #include <openssl/rand.h> #include <openssl/evp.h>#define AES_KEY_BITS 128 #define GCM_IV_SIZ…...
你了解哪些Java限流算法?
大家好,我是锋哥。今天分享关于【你了解哪些Java限流算法?】面试题。希望对大家有帮助; 你了解哪些Java限流算法? 1000道 互联网大厂Java工程师 精选面试题-Java资源分享网 Java 中常用的限流算法主要有以下几种,它们广泛应用于处理流量控…...
【漫话机器学习系列】065.梯度(Gradient)
梯度(Gradient) 在数学和机器学习中,梯度是一个向量,用来表示函数在某一点的变化方向和变化率。它是多变量函数的一阶偏导数的组合。 梯度的定义 设有一个标量函数 ,它对 是可微的,则该函数在某一点的…...
BswM(基础软件管理)详解
BswM(基础软件管理)详解 BswM(Basic Software Manager) 是 AUTOSAR BSW 的核心模块之一,负责协调基础软件(BSW)各模块的行为,根据系统状态、规则或事件动态配置其他模块。其设计目标…...
上位机知识篇---GitGitHub
文章目录 前言Git&GitHub是什么?GitGitHub Git和GitHub的区别定位功能使用方式开源协作 Git常用命令操作1. 配置2. 仓库操作3. 文件操作4. 分支与合并5.远程操作6.撤销更改7.查看历史 GitHub常用操作1.创建仓库2.Fork仓库3.Pull Request4.Issue跟踪5.代码审查 G…...
网站快速收录:提高页面加载速度的重要性
本文转自:百万收录网 原文链接:https://www.baiwanshoulu.com/32.html 网站快速收录中,提高页面加载速度具有极其重要的意义。以下从多个方面详细阐述其重要性: 一、提升用户体验 减少用户等待时间:页面加载速度直接…...
Vue.js组件开发-实现全屏背景图片滑动切换特效
使用 Vue 实现全屏背景图片滑动切换特效的详细步骤、代码、注释和使用说明。 步骤 创建 Vue 项目:使用 Vue CLI 创建一个新的 Vue 项目。准备图片资源:准备好要用于背景切换的图片,并将它们放在项目的合适目录下。编写 HTML 结构࿱…...
DeepSeek r1本地安装全指南
环境基本要求 硬件配置 需要本地跑模型,兼顾质量、性能、速度以及满足日常开发需要,我们需要准备以下硬件: CPU:I9内存:128GB硬盘:3-4TB 最新SSD,C盘确保有400GB,其它都可划成D盘…...
LitGPT - 20多个高性能LLM,具有预训练、微调和大规模部署的recipes
文章目录 一、关于 LitGPT二、快速启动安装LitGPT高级安装选项 从20多个LLM中进行选择 三、工作流程1、所有工作流程2、微调LLM3、部署LLM4、评估LLM5、测试LLM6、预训练LLM7、继续预训练LLM 四、最先进的功能五、训练方法示例 六、项目亮点教程 一、关于 LitGPT LitGPT 用于 …...
deepseek R1 14b显存占用
RTX2080ti 11G显卡,模型7b速度挺快,试试14B也不错。 7B显存使用5.6G,14B显存刚好够,出文字速度差不多。 打算自己写个移动宽带的IPTV播放器,不知道怎么下手,就先问他了。...
无用知识研究:对std::common_type以及问号表达式类型的理解
先说结论: 如果问号表达式能编译通过,那么std::common_type就能通过。因为common_type的底层依赖的就是?: common_type的实现里,利用了问号表达式:ternary conditional operator (?:) https://stackoverflow.com/questions/14…...
MapReduce概述
目录 1. MapReduce概述2. MapReduce的功能2.1 数据划分和计算任务调度2.2 数据/代码互定位2.3 系统优化2.4 出错检测和恢复 3. MapReduce处理流程4. MapReduce编程基础参考 1. MapReduce概述 MapReduce是面向大数据并行处理的计算模型、框架和平台: 1. 基于集群的高性能并行…...
循环神经网络(RNN)+pytorch实现情感分析
目录 一、背景引入 二、网络介绍 2.1 输入层 2.2 循环层 2.3 输出层 2.4 举例 2.5 深层网络 三、网络的训练 3.1 训练过程举例 1)输出层 2)循环层 3.2 BPTT 算法 1)输出层 2)循环层 3)算法流程 四、循…...
Mac cursor设置jdk、Maven版本
基本配置 – Cursor 使用文档 首先是系统用户级别的设置参数,运行cursor,按下ctrlshiftp,输入Open User Settings(JSON),在弹出的下拉菜单中选中下面这样的: 在打开的json编辑器中追加下面的内容: {"…...
WPS数据分析000005
目录 一、数据录入技巧 二、一维表 三、填充柄 向下自动填充 自动填充选项 日期填充 星期自定义 自定义序列 1-10000序列 四、智能填充 五、数据有效性 出错警告 输入信息 下拉列表 六、记录单 七、导入数据 编辑 八、查找录入 会员功能 Xlookup函数 VL…...
CTF从入门到精通
文章目录 背景知识CTF赛制 背景知识 CTF赛制 1.web安全:通过浏览器访问题目服务器上的网站,寻找网站漏洞(sql注入,xss(钓鱼链接),文件上传,包含漏洞,xxe,ssrf,命令执行,…...
Flutter使用Flavor实现切换环境和多渠道打包
在Android开发中通常我们使用flavor进行多渠道打包,flutter开发中同样有这种方式,不过需要在原生中配置 具体方案其实flutter官网个了相关示例(https://docs.flutter.dev/deployment/flavors),我这里记录一下自己的操作 Android …...
Springboot如何使用面向切面编程AOP?
Springboot如何使用面向切面编程AOP? 在 Spring Boot 中使用面向切面编程(AOP)非常简单,Spring Boot 提供了对 AOP 的自动配置支持。以下是详细的步骤和示例,帮助你快速上手 Spring Boot 中的 AOP。 1. 添加依赖 首先ÿ…...
51单片机(STC89C52)开发:点亮一个小灯
软件安装: 安装开发板CH340驱动。 安装KEILC51开发软件:C51V901.exe。 下载软件:PZ-ISP.exe 创建项目: 新建main.c 将main.c加入至项目中: main.c:点亮一个小灯 #include "reg52.h"sbit LED1P2^0; //P2的…...
基于MinIO的对象存储增删改查
MinIO是一个高性能的分布式对象存储服务。Python的minio库可操作MinIO,包括创建/列出存储桶、上传/下载/删除文件及列出文件。 查看帮助信息 minio.exe --help minio.exe server --help …...
致所有嵌入式学习者:一些比代码更重要的东西
文 / 一只会飞的猫 本文已经加入原创侵权保护,商业行为,禁止任何形式转载,违者必究。 文章所在专栏:嵌入式入行认知指南—芯片老兵带你打破学习信息差 文章目录1 为什么我要写这个专栏2 在这个专栏里,你会了解到什么&a…...
智能号码定位引擎:企业级地理信息快速响应解决方案
智能号码定位引擎:企业级地理信息快速响应解决方案 【免费下载链接】location-to-phone-number This a project to search a location of a specified phone number, and locate the map to the phone number location. 项目地址: https://gitcode.com/gh_mirrors…...
零基础如何选择PMP和软考?2025年考证避坑指南(含最新政策解读)
零基础如何选择PMP和软考?2025年考证避坑指南(含最新政策解读) 项目管理领域的证书选择一直是职场人士关注的焦点。PMP和软考作为两大主流认证,各自拥有独特的价值定位和适用场景。对于零基础考生而言,如何在2025年这…...
StructBERT文本相似度模型在互联网内容治理中的应用:重复与低质内容识别
StructBERT文本相似度模型在互联网内容治理中的应用:重复与低质内容识别 你有没有遇到过这样的情况?打开一个内容平台,满屏都是大同小异的文章,或者点开几篇帖子,发现内容似曾相识,只是换了几个词。对于平…...
3步构建数字时光机:GetQzonehistory全方位备份QQ空间回忆方案
3步构建数字时光机:GetQzonehistory全方位备份QQ空间回忆方案 【免费下载链接】GetQzonehistory 获取QQ空间发布的历史说说 项目地址: https://gitcode.com/GitHub_Trending/ge/GetQzonehistory 问题解决矩阵:为什么需要数字记忆备份 数字记忆的…...
QMCDecode:解放加密音乐的格式转换专家指南
QMCDecode:解放加密音乐的格式转换专家指南 【免费下载链接】QMCDecode QQ音乐QMC格式转换为普通格式(qmcflac转flac,qmc0,qmc3转mp3, mflac,mflac0等转flac),仅支持macOS,可自动识别到QQ音乐下载目录,默认转换结果存储…...
3个步骤解决CAJ文献跨平台阅读难题:开源格式转换工具全解析
3个步骤解决CAJ文献跨平台阅读难题:开源格式转换工具全解析 【免费下载链接】caj2pdf Convert CAJ (China Academic Journals) files to PDF. 转换中国知网 CAJ 格式文献为 PDF。佛系转换,成功与否,皆是玄学。 项目地址: https://gitcode.c…...
Qwen2.5-VL多模态大模型实战:如何用3090显卡高效部署7B版本(附避坑指南)
Qwen2.5-VL多模态大模型实战:3090显卡高效部署7B版本全攻略 当多模态大模型遇上消费级显卡天花板RTX 3090,会产生怎样的化学反应?作为目前最具性价比的24GB显存解决方案,3090显卡在部署7B参数规模的Qwen2.5-VL时既充满可能又暗藏…...
Go HTTP Server 性能分析与优化
Go HTTP Server 性能分析与优化 在当今高并发的互联网应用中,HTTP Server的性能直接决定了用户体验和系统稳定性。Go语言凭借其轻量级协程和高效的网络库,成为构建高性能HTTP服务的首选之一。即使使用Go,开发者仍需深入分析性能瓶颈并进行针…...
FireRedASR-AED-L语音识别模型WebUI快速部署教程:Python环境一键配置
FireRedASR-AED-L语音识别模型WebUI快速部署教程:Python环境一键配置 语音识别技术正在快速融入我们的日常开发,无论是做智能客服、会议纪要,还是内容审核,一个好用的识别模型都能省下大量时间。但很多朋友在第一步——环境部署上…...
