C++版本DES加密/解密

代码如下

// Base64 编码函数
std::string Base64Encode(const std::vector<unsigned char>& input) {DWORD encodedLength = 0;// 先获取编码后的长度CryptBinaryToStringA(&input[0], static_cast<DWORD>(input.size()), CRYPT_STRING_BASE64, NULL, &encodedLength);std::vector<char> output(encodedLength);// 进行实际的编码操作CryptBinaryToStringA(&input[0], static_cast<DWORD>(input.size()), CRYPT_STRING_BASE64, &output[0], &encodedLength);return std::string(output.begin(), output.end() - 1); // 去掉末尾的换行符
}// Base64 解码函数
std::vector<unsigned char> Base64Decode(const std::string& input) {std::vector<unsigned char> output;DWORD decodedLength = 0;// 先获取解码后的长度CryptStringToBinaryA(input.c_str(), static_cast<DWORD>(input.length()), CRYPT_STRING_BASE64, NULL, &decodedLength, NULL, NULL);output.resize(decodedLength);// 进行实际的解码操作CryptStringToBinaryA(input.c_str(), static_cast<DWORD>(input.length()), CRYPT_STRING_BASE64, output.data(), &decodedLength, NULL, NULL);return output;
}// DES 加密函数
std::string DESEncrypt(const std::string& plainData, const std::string& key, const std::string& iv) {HCRYPTPROV hProv = 0;// 获取加密服务提供者的句柄if (!CryptAcquireContext(&hProv, NULL, NULL, PROV_RSA_FULL, CRYPT_VERIFYCONTEXT)) {printf("CryptAcquireContext failed: %d\n", GetLastError());return "";}HCRYPTKEY hKey = 0;// 准备 DES 密钥结构struct {BLOBHEADER hdr;DWORD dwKeySize;BYTE rgbKeyData[8];} KeyBlob;KeyBlob.hdr.bType = PLAINTEXTKEYBLOB;KeyBlob.hdr.bVersion = CUR_BLOB_VERSION;KeyBlob.hdr.reserved = 0;KeyBlob.hdr.aiKeyAlg = CALG_DES;KeyBlob.dwKeySize = 8;memcpy(KeyBlob.rgbKeyData, key.c_str(), 8);// 导入 DES 密钥if (!CryptImportKey(hProv, (BYTE*)&KeyBlob, sizeof(KeyBlob), 0, 0, &hKey)) {printf("CryptImportKey failed: %d\n", GetLastError());CryptReleaseContext(hProv, 0);return "";}// 设置初始化向量BYTE desIV[8];memcpy(desIV, iv.c_str(), 8);if (!CryptSetKeyParam(hKey, KP_IV, desIV, 0)) {printf("CryptSetKeyParam (IV) failed: %d\n", GetLastError());CryptDestroyKey(hKey);CryptReleaseContext(hProv, 0);return "";}// 准备加密数据DWORD dataLen = static_cast<DWORD>(plainData.length());std::vector<unsigned char> encryptedBytes(dataLen + 8); // 考虑填充memcpy(&encryptedBytes[0], plainData.c_str(), dataLen);// 进行加密操作if (!CryptEncrypt(hKey, 0, TRUE, 0, &encryptedBytes[0], &dataLen, static_cast<DWORD>(encryptedBytes.size()))) {printf("CryptEncrypt failed: %d\n", GetLastError());CryptDestroyKey(hKey);CryptReleaseContext(hProv, 0);return "";}// 释放资源CryptDestroyKey(hKey);CryptReleaseContext(hProv, 0);// 对加密后的数据进行 Base64 编码return Base64Encode(std::vector<unsigned char>(encryptedBytes.begin(), encryptedBytes.begin() + dataLen));
}// DES 解密函数
std::string DESDecrypt(const std::string& encryptedData, const std::string& key, const std::string& iv) {HCRYPTPROV hProv = 0;// 获取加密服务提供者的句柄if (!CryptAcquireContext(&hProv, NULL, NULL, PROV_RSA_FULL, CRYPT_VERIFYCONTEXT)) {printf("CryptAcquireContext failed: %d\n", GetLastError());return "";}HCRYPTKEY hKey = 0;// 准备 DES 密钥结构struct {BLOBHEADER hdr;DWORD dwKeySize;BYTE rgbKeyData[8];} KeyBlob;KeyBlob.hdr.bType = PLAINTEXTKEYBLOB;KeyBlob.hdr.bVersion = CUR_BLOB_VERSION;KeyBlob.hdr.reserved = 0;KeyBlob.hdr.aiKeyAlg = CALG_DES;KeyBlob.dwKeySize = 8;memcpy(KeyBlob.rgbKeyData, key.c_str(), 8);// 导入 DES 密钥if (!CryptImportKey(hProv, (BYTE*)&KeyBlob, sizeof(KeyBlob), 0, 0, &hKey)) {printf("CryptImportKey failed: %d\n", GetLastError());CryptReleaseContext(hProv, 0);return "";}// 设置初始化向量BYTE desIV[8];memcpy(desIV, iv.c_str(), 8);if (!CryptSetKeyParam(hKey, KP_IV, desIV, 0)) {printf("CryptSetKeyParam (IV) failed: %d\n", GetLastError());CryptDestroyKey(hKey);CryptReleaseContext(hProv, 0);return "";}// 对 Base64 编码的加密数据进行解码std::vector<unsigned char> encryptedBytes = Base64Decode(encryptedData);DWORD dataLen = static_cast<DWORD>(encryptedBytes.size());std::vector<unsigned char> decryptedBytes(dataLen);memcpy(decryptedBytes.data(), encryptedBytes.data(), dataLen);// 进行解密操作if (!CryptDecrypt(hKey, 0, TRUE, 0, decryptedBytes.data(), &dataLen)) {printf("CryptDecrypt failed: %d\n", GetLastError());CryptDestroyKey(hKey);CryptReleaseContext(hProv, 0);return "";}// 释放资源CryptDestroyKey(hKey);CryptReleaseContext(hProv, 0);// 将解密后的字节数组转换为字符串return std::string(decryptedBytes.begin(), decryptedBytes.begin() + dataLen);
}

例子如下

std::string key = "1frz2wsx";
std::string iv = "8uhb7yxc";int Test()
{//加密std::string plainText = "awsxedc";std::string encryptedData = DESEncrypt(plainText, key, iv);if (!encryptedData.empty()) {std::cout << "Encrypted data (Base64): " << encryptedData << std::endl;}//解密std::string decryptedData = DESDecrypt(encryptedData, key, iv);if (!decryptedData.empty()) {std::cout << "Decrypted Data: " << decryptedData << std::endl;}return 0;
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.rhkb.cn/news/13997.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

数据结构与算法(test1)

一、树和二叉树 1. 看图&#xff0c;完成以下填空 (1).树的度为________。 (2).树中结点的最大层次&#xff0c;称为树的_____或树的______&#xff0c;值是______。 (3).结点A和B的度分别为________ 和 ________。 (4).结点A是结点B的________。 (5).结点B是结点A的________…

【GitLab CI/CD 实践】从 0 到 1 搭建高效自动化部署流程

网罗开发 &#xff08;小红书、快手、视频号同名&#xff09; 大家好&#xff0c;我是 展菲&#xff0c;目前在上市企业从事人工智能项目研发管理工作&#xff0c;平时热衷于分享各种编程领域的软硬技能知识以及前沿技术&#xff0c;包括iOS、前端、Harmony OS、Java、Python等…

Kubernetes是什么?为什么它是云原生的基石

从“手工时代”到“自动化工厂” 想象一下&#xff0c;你正在经营一家工厂。在传统模式下&#xff0c;每个工人&#xff08;服务器&#xff09;需要手动组装产品&#xff08;应用&#xff09;&#xff0c;效率低下且容易出错。而Kubernetes&#xff08;k8s&#xff09;就像一个…

算法与数据结构(删除有序数组的重复项)

思路 题目要求需要在原地删除重复的元素&#xff0c;这说明不能使用额外的空间。我们可以使用一个索引index来记录赋值的位置&#xff0c;以此来不断地删除重复的元素。 解题过程: 我们可以首先求得nums的长度len 若没有元素&#xff0c;直接返回0。 从第二个元素开始遍历…

[论文阅读] Knowledge Fusion of Large Language Models

Knowledge Fusion of Large Language Models (FuseLLM) Methodology 整体Pipeline如下图所示 不同的动物代表不同的LLM。左边第一&#xff0c;第二分别是Ensemble以及Weight Merging方法。最右侧为本文提出的FuseLLM。 Ensemble: 融合多个models的预测结果&#xff0c;比如…

2024~2025学年佛山市普通高中教学质量检测(一)【高三数学】

一、选择题 本题共8小题&#xff0c;每小题5分&#xff0c;共40分。在每小题给出的四个选项中。只有一项是符合题目要求的。 1、若 5 z 2 i 1 \frac{5}{z}2i1 z5​2i1&#xff0c;则 z z z A. 1-2i B. 12i C. 2-i D. 2i2、已知集合 A { x ∣ 1 < x < a } A\left\{…

探索从传统检索增强生成(RAG)到缓存增强生成(CAG)的转变

在人工智能快速发展的当下&#xff0c;大型语言模型&#xff08;LLMs&#xff09;已成为众多应用的核心技术。检索增强生成&#xff08;RAG&#xff09;&#xff08;RAG 系统从 POC 到生产应用&#xff1a;全面解析与实践指南&#xff09;和缓存增强生成&#xff08;CAG&#x…

anaconda中可以import cv2,但是notebook中cv2 module not found

一、问题 anaconda中成功import cv2 但是jupyter notebook中却无法导入cv2 二、排查 anaconda中使用python路径如下&#xff1a; jupyter notebook中使用python路径如下&#xff1a; 可以发现路径不一致。 三、解决 ①查看可用的kernel ②选中想要修改的kernel&#xff0c;打…

【数据结构】_栈的结构与实现

目录 1. 栈的相关概念与结构 2. 栈的实现 2.1 栈实现的底层结构选择 2.2 Stack.h 2.3 Stack.c 2.4 Test_Stack.c 1. 栈的相关概念与结构 1、栈&#xff1a;一种特殊的线性表&#xff0c;只允许在固定的一端插入和删除数据&#xff1b; 允许进行数据插入和删除操作的一端…

mysql的cpu使用率100%问题排查

背景 线上mysql服务器经常性出现cpu使用率100%的告警&#xff0c; 因此整理一下排查该问题的常规流程。 1. 确认CPU占用来源 检查系统进程 使用 top 或 htop 命令&#xff0c;确认是否是 mysqld 进程导致CPU满载&#xff1a;top -c -p $(pgrep mysqld)2. 实时分析MySQL活动 …

某团面试题①—kudu读写流程

kudu 读写流程 前言 为什么会有kudu&#xff1f;先贴一个经典的图。 kudu诞生之前大数据的主要2种方式存储 静态数据 以hdfs引擎作为存储引擎&#xff0c;适用于高吞吐量的离线大数据分析场景&#xff0c;缺点是实现随机读写性能差&#xff0c;更新数据难 动态数据 以Hbase…

Deepseek本地部署指南:在linux服务器部署,在mac远程web-ui访问

1. 在Linux服务器上部署DeepSeek模型 要在 Linux 上通过 Ollama 安装和使用模型&#xff0c;您可以按照以下步骤进行操作&#xff1a; 步骤 1&#xff1a;安装 Ollama 安装 Ollama&#xff1a; 使用以下命令安装 Ollama&#xff1a; curl -sSfL https://ollama.com/download.…

go并发和并行

进程和线程 进程&#xff08;Process&#xff09;就是程序在操作系统中的一次执行过程&#xff0c;是系统进行资源分配和调度的基本单位&#xff0c;进程是一个动态概念&#xff0c;是程序在执行过程中分配和管理资源的基本单位&#xff0c;每一个进程都有一个自己的地址空间。…

element-ui rate 组件源码分享

评分组件&#xff0c;从三个方面分享&#xff1a; 1、页面结构。 2、组件属性。 3、组件方法。 一、页面结构&#xff1a; 主要有图标的、图标(默认或自定义图标)文字的、图标分数的。 二、属性。 2.1 value 2.2 max 最大分数。 2.3 disabled 是否只读 2.4 allow-half 是…

python学opencv|读取图像(五十六)使用cv2.GaussianBlur()函数实现图像像素高斯滤波处理

【1】引言 前序学习了均值滤波和中值滤波&#xff0c;对图像的滤波处理有了基础认知&#xff0c;相关文章链接为&#xff1a; python学opencv|读取图像&#xff08;五十四&#xff09;使用cv2.blur()函数实现图像像素均值处理-CSDN博客 python学opencv|读取图像&#xff08;…

HIVE如何注册UDF函数

如果注册UDF函数的时候报了上面的错误&#xff0c;说明hdfs上传的路径不正确&#xff0c; 一定要用下面的命令 hadoop fs -put /tmp/hive/111.jar /user/hive/warehouse 一定要上传到上面路径&#xff0c;这样在创建函数时&#xff0c;引用下面的地址就可以创建成功

紧跟潮流,将 DeepSeek 集成到 VSCode

Visual Studio Code&#xff08;简称 VSCode&#xff09;是一款由微软开发的免费开源代码编辑器&#xff0c;自 2015 年发布以来&#xff0c;凭借其轻便、强大、且拥有丰富扩展生态的特点&#xff0c;迅速成为了全球开发者的首选工具。VSCode 支持多平台操作系统&#xff0c;包…

HAL库 Systick定时器 基于STM32F103EZT6 野火霸道,可做参考

目录 1.时钟选择(这里选择高速外部时钟) ​编辑 2.调试模式和时基源选择: 3.LED的GPIO配置 这里用板子的红灯PB5 4.工程配置 5.1ms的systick中断实现led闪烁 源码: 6.修改systick的中断频率 7.systick定时原理 SysTick 定时器的工作原理 中断触发机制 HAL_SYSTICK_Co…

DeepSeek与llama本地部署(含WebUI)

DeepSeek从2025年1月起开始火爆&#xff0c;成为全球最炙手可热的大模型&#xff0c;各大媒体争相报道。我们可以和文心一言一样去官网进行DeepSeek的使用&#xff0c;那如果有读者希望将大模型部署在本地应该怎么做呢&#xff1f;本篇文章将会教你如何在本地傻瓜式的部署我们的…

【重新认识C语言----文件管理篇】

目录 ​编辑 -----------------------------------------begin------------------------------------- 引言 1. 文件的基本概念 2. 文件指针 3. 文件的打开与关闭 3.1 打开文件 3.2 关闭文件 4. 文件的读写操作 4.1 读取文件 4.1.1 使用fgetc()读取文件 4.1.2 使用fg…