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 …...
渗透实战PortSwigger靶场-XSS Lab 14:大多数标签和属性被阻止
<script>标签被拦截 我们需要把全部可用的 tag 和 event 进行暴力破解 XSS cheat sheet: https://portswigger.net/web-security/cross-site-scripting/cheat-sheet 通过爆破发现body可以用 再把全部 events 放进去爆破 这些 event 全部可用 <body onres…...
关于iview组件中使用 table , 绑定序号分页后序号从1开始的解决方案
问题描述:iview使用table 中type: "index",分页之后 ,索引还是从1开始,试过绑定后台返回数据的id, 这种方法可行,就是后台返回数据的每个页面id都不完全是按照从1开始的升序,因此百度了下,找到了…...
【android bluetooth 框架分析 04】【bt-framework 层详解 1】【BluetoothProperties介绍】
1. BluetoothProperties介绍 libsysprop/srcs/android/sysprop/BluetoothProperties.sysprop BluetoothProperties.sysprop 是 Android AOSP 中的一种 系统属性定义文件(System Property Definition File),用于声明和管理 Bluetooth 模块相…...
ETLCloud可能遇到的问题有哪些?常见坑位解析
数据集成平台ETLCloud,主要用于支持数据的抽取(Extract)、转换(Transform)和加载(Load)过程。提供了一个简洁直观的界面,以便用户可以在不同的数据源之间轻松地进行数据迁移和转换。…...
Docker 本地安装 mysql 数据库
Docker: Accelerated Container Application Development 下载对应操作系统版本的 docker ;并安装。 基础操作不再赘述。 打开 macOS 终端,开始 docker 安装mysql之旅 第一步 docker search mysql 》〉docker search mysql NAME DE…...
PAN/FPN
import torch import torch.nn as nn import torch.nn.functional as F import mathclass LowResQueryHighResKVAttention(nn.Module):"""方案 1: 低分辨率特征 (Query) 查询高分辨率特征 (Key, Value).输出分辨率与低分辨率输入相同。"""def __…...
Selenium常用函数介绍
目录 一,元素定位 1.1 cssSeector 1.2 xpath 二,操作测试对象 三,窗口 3.1 案例 3.2 窗口切换 3.3 窗口大小 3.4 屏幕截图 3.5 关闭窗口 四,弹窗 五,等待 六,导航 七,文件上传 …...
【Linux】Linux 系统默认的目录及作用说明
博主介绍:✌全网粉丝23W,CSDN博客专家、Java领域优质创作者,掘金/华为云/阿里云/InfoQ等平台优质作者、专注于Java技术领域✌ 技术范围:SpringBoot、SpringCloud、Vue、SSM、HTML、Nodejs、Python、MySQL、PostgreSQL、大数据、物…...
接口自动化测试:HttpRunner基础
相关文档 HttpRunner V3.x中文文档 HttpRunner 用户指南 使用HttpRunner 3.x实现接口自动化测试 HttpRunner介绍 HttpRunner 是一个开源的 API 测试工具,支持 HTTP(S)/HTTP2/WebSocket/RPC 等网络协议,涵盖接口测试、性能测试、数字体验监测等测试类型…...
wpf在image控件上快速显示内存图像
wpf在image控件上快速显示内存图像https://www.cnblogs.com/haodafeng/p/10431387.html 如果你在寻找能够快速在image控件刷新大图像(比如分辨率3000*3000的图像)的办法,尤其是想把内存中的裸数据(只有图像的数据,不包…...
