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、人工智能如何挑战人类监管?3、确保人工智能受控的策略4、人类在人工智能发展中的角色5、平衡自主性与控制力6、总结与…...
基于Uniapp开发HarmonyOS 5.0旅游应用技术实践
一、技术选型背景 1.跨平台优势 Uniapp采用Vue.js框架,支持"一次开发,多端部署",可同步生成HarmonyOS、iOS、Android等多平台应用。 2.鸿蒙特性融合 HarmonyOS 5.0的分布式能力与原子化服务,为旅游应用带来…...
Keil 中设置 STM32 Flash 和 RAM 地址详解
文章目录 Keil 中设置 STM32 Flash 和 RAM 地址详解一、Flash 和 RAM 配置界面(Target 选项卡)1. IROM1(用于配置 Flash)2. IRAM1(用于配置 RAM)二、链接器设置界面(Linker 选项卡)1. 勾选“Use Memory Layout from Target Dialog”2. 查看链接器参数(如果没有勾选上面…...
HTML前端开发:JavaScript 常用事件详解
作为前端开发的核心,JavaScript 事件是用户与网页交互的基础。以下是常见事件的详细说明和用法示例: 1. onclick - 点击事件 当元素被单击时触发(左键点击) button.onclick function() {alert("按钮被点击了!&…...
【SSH疑难排查】轻松解决新版OpenSSH连接旧服务器的“no matching...“系列算法协商失败问题
【SSH疑难排查】轻松解决新版OpenSSH连接旧服务器的"no matching..."系列算法协商失败问题 摘要: 近期,在使用较新版本的OpenSSH客户端连接老旧SSH服务器时,会遇到 "no matching key exchange method found", "n…...
【MATLAB代码】基于最大相关熵准则(MCC)的三维鲁棒卡尔曼滤波算法(MCC-KF),附源代码|订阅专栏后可直接查看
文章所述的代码实现了基于最大相关熵准则(MCC)的三维鲁棒卡尔曼滤波算法(MCC-KF),针对传感器观测数据中存在的脉冲型异常噪声问题,通过非线性加权机制提升滤波器的抗干扰能力。代码通过对比传统KF与MCC-KF在含异常值场景下的表现,验证了后者在状态估计鲁棒性方面的显著优…...
MySQL 索引底层结构揭秘:B-Tree 与 B+Tree 的区别与应用
文章目录 一、背景知识:什么是 B-Tree 和 BTree? B-Tree(平衡多路查找树) BTree(B-Tree 的变种) 二、结构对比:一张图看懂 三、为什么 MySQL InnoDB 选择 BTree? 1. 范围查询更快 2…...
论文阅读:LLM4Drive: A Survey of Large Language Models for Autonomous Driving
地址:LLM4Drive: A Survey of Large Language Models for Autonomous Driving 摘要翻译 自动驾驶技术作为推动交通和城市出行变革的催化剂,正从基于规则的系统向数据驱动策略转变。传统的模块化系统受限于级联模块间的累积误差和缺乏灵活性的预设规则。…...
DeepSeek源码深度解析 × 华为仓颉语言编程精粹——从MoE架构到全场景开发生态
前言 在人工智能技术飞速发展的今天,深度学习与大模型技术已成为推动行业变革的核心驱动力,而高效、灵活的开发工具与编程语言则为技术创新提供了重要支撑。本书以两大前沿技术领域为核心,系统性地呈现了两部深度技术著作的精华:…...
五子棋测试用例
一.项目背景 1.1 项目简介 传统棋类文化的推广 五子棋是一种古老的棋类游戏,有着深厚的文化底蕴。通过将五子棋制作成网页游戏,可以让更多的人了解和接触到这一传统棋类文化。无论是国内还是国外的玩家,都可以通过网页五子棋感受到东方棋类…...
