C++ 文档加密与解密运用【Crypto++】库

news2024/11/17 15:59:17

一、下载Cryptopp

鼠标放到下面网址,点击下载即可

github地址(8.7.0版本):https://github.com/weidai11/cryptopp/releases/tag/CRYPTOPP_8_7_0

二 、下载PEM包

pem包官方地址:PEM Pack - Crypto++ Wiki

三、调用Crypto++库

1、解压crypto++包和pem包,将pem文件夹中包含的全部文件复制粘贴到crypto++文件夹中

2、双击打开crypto++文件夹中的cryptest.sln工程

3、在cryptlib子工程里面添加头文件

  • pem.h
  • pem_common.h

 4、在cryptlib子工程源文件中添加

  • pem_common.cpp
  • pem_read.cpp
  • pem_write.cpp

5、build子工程cryptlib,生成lib文件,根据需要生成debug和release版,lib文件在x64->output里面的debug和release文件夹中

 新建文件夹include,将crypto++源文件中所有头文件(.h结尾的文件)复制到include文件夹内,供后面vs工程调用。

四、VS调用crypto++库

1、打开VS(我的是2019版本),文件->新建->项目->空项目

把下面的代码复制进去

#include "cryptlib.h"
#include "rijndael.h"
#include "modes.h"
#include "files.h"
#include "osrng.h"
#include "hex.h"

#include <iostream>
#include <string>

int main(int argc, char* argv[])
{
    using namespace CryptoPP;

    AutoSeededRandomPool prng;
    HexEncoder encoder(new FileSink(std::cout));

    SecByteBlock key(AES::DEFAULT_KEYLENGTH);
    SecByteBlock iv(AES::BLOCKSIZE);

    prng.GenerateBlock(key, key.size());
    prng.GenerateBlock(iv, iv.size());

    std::string plain = "CBC Mode Test:Hello!";
    std::string cipher, recovered;

    std::cout << "plain text: " << plain << std::endl;

    /*********************************\
    \*********************************/

    try
    {
        CBC_Mode< AES >::Encryption e;
        e.SetKeyWithIV(key, key.size(), iv);

        StringSource s(plain, true,
            new StreamTransformationFilter(e,
                new StringSink(cipher)
            ) // StreamTransformationFilter
        ); // StringSource
    }
    catch (const Exception& e)
    {
        std::cerr << e.what() << std::endl;
        exit(1);
    }

    /*********************************\
    \*********************************/

    std::cout << "key: ";
    encoder.Put(key, key.size());
    encoder.MessageEnd();
    std::cout << std::endl;

    std::cout << "iv: ";
    encoder.Put(iv, iv.size());
    encoder.MessageEnd();
    std::cout << std::endl;

    std::cout << "cipher text: ";
    encoder.Put((const byte*)&cipher[0], cipher.size());
    encoder.MessageEnd();
    std::cout << std::endl;

    /*********************************\
    \*********************************/

    try
    {
        CBC_Mode< AES >::Decryption d;
        d.SetKeyWithIV(key, key.size(), iv);

        StringSource s(cipher, true,
            new StreamTransformationFilter(d,
                new StringSink(recovered)
            ) // StreamTransformationFilter
        ); // StringSource

        std::cout << "recovered text: " << recovered << std::endl;
    }
    catch (const Exception& e)
    {
        std::cerr << e.what() << std::endl;
        exit(1);
    }

    return 0;
}


2、修改项目属性

(1)C/C++——常规——附加包含目录:选择我们刚刚新建的include文件夹路径

(2)链接器——常规——附加库目录:选择cryptlib.lib所在的路径

(3)连接器——输入——附加依赖项:添加cryptlib.lib

3、点击编译运行,出现以下结果则成功

五、加密&解密实例

#include <iostream>
#include "randpool.h"
#include "rsa.h"
#include "hex.h"
#include "files.h"
#include "config.h"
#include "stdcpp.h"
#include "modes.h"
#include"base64.h"

using namespace std;
using namespace CryptoPP;

#pragma comment(lib, "cryptlib.lib")

// 加密

string encrypt(const std::string& str_in, const std::string& key, const std::string& iv)
{
std::string str_out;
CryptoPP::CFB_Mode<CryptoPP::AES>::Encryption encryption((byte*)key.c_str(), key.length(), (byte*)iv.c_str());

CryptoPP::StringSource encryptor(str_in, true,
new CryptoPP::StreamTransformationFilter(encryption,
new CryptoPP::Base64Encoder(
new CryptoPP::StringSink(str_out),
false // do not append a newline
)
)
);
return str_out;
}

//解密
string decrypt(const std::string& str_in, const std::string& key, const std::string& iv)
{
std::string str_out;
CryptoPP::CFB_Mode<CryptoPP::AES>::Decryption decryption((byte*)key.c_str(), key.length(), (byte*)iv.c_str());

CryptoPP::StringSource decryptor(str_in, true,
new CryptoPP::Base64Decoder(
new CryptoPP::StreamTransformationFilter(decryption,
new CryptoPP::StringSink(str_out)
)
)
);
return str_out;
}

// Main函数

void main()
{
std::string str = "123456789012345";  //需要加密的字符串
std::string key = "01234567891234560123456789123456"; // 32 bytes 密钥
std::string iv = "0123456789123456"; // 16 bytes
std::string str_encrypted =  encrypt(str, key, iv);   //加密后密文

std::string str_decrypted = decrypt(str_encrypted, key, iv);  //解密后明文
std::cout << "str_encrypted: " << str_encrypted << std::endl;
std::cout << "str_decrypted: " << str_decrypted << std::endl;
}

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

深度学习环境安装|PyCharm,Anaconda,PyTorch,CUDA,cuDNN等

本文参考了许多优秀博主的博客&#xff0c;大部分安装步骤可在其他博客中找到&#xff0c;鉴于我本人第一次安装后&#xff0c;时隔半年&#xff0c;我忘记了当时安装的许多细节和版本信息&#xff0c;所以再一次报错时&#xff0c;重装花费了大量时间。因此&#xff0c;我觉得…

单个电源模块带电感,给多个负载用,但是用电电流不一致的直流压降仿真

单个电源模块带电感,给多个负载用,但是用电电流不一致的直流压降仿真 下面介绍单个电源模块带电感,给多个负载用,但是用电电流不一致的直流压降仿真,以下图为例 具体操作步骤如下 同样的设置好VRAM

【Mybits-Plus】拦截器的学习和使用,以及如何实现数据权限

【Mybits-Plus】拦截器的学习和使用目录标题 常规处理数据权限的话Mybits需要对Mybits\Mybits-plus拦截器了解1.基础知识学习2.各种场景--实战案例 常规处理数据权限的话Mybits需要对Mybits\Mybits-plus拦截器了解 1.基础知识学习 (请自行学习如下内容&#xff0c;后续才能根…

C++中随机数的使用总结

随机数 rand() 随机数发生器 #include <stdio.h> #include <unistd.h> #include <iostream> #include <string>using namespace std;int main(int argc, char *argv[]) {cout << "this is main()" << endl;cout << rand…

2023-07-14 monetdb-嵌入mysql-sql层交互-设计-分析

摘要: SQL层的兼容工作,时间紧,任务重,协议多,命令多,功能多,牵扯到数据一致性又万分紧张,需要非常谨慎,当前列了一些下一步的工作的设计分析. 主要是涉及sql层接口的兼容, innodb与monetdb数据的一致性, 查询和写入两个不同侧面的处理. monetdb嵌入mysql分析: 导图版…

C语言中定义和声明的区别

声明(declaration)与定义(definition) 为了使不同的文件都可以访问同一个变量&#xff0c;C会区 分变量的声明和定义。 变量的定义会为这个变量分配存储空间&#xff0c;并且 可能 会为其指定一个初始化的值&#xff0c; 一个变量的定义有且 仅有一处。 定义实际上是一种特殊…

七种最新群智能优化算法(NOA、LSO、SWO、ZOA、EVO、KOA、GRO)求解23个基准测试函数(含参考文献及MATLAB代码)

一、七种算法简介 &#xff08;1&#xff09;星雀优化算法NOA 星雀优化算法(Nutcracker optimizer algorithm,NOA)由Mohamed Abdel-Basset等人于2023年提出&#xff0c;该算法模拟星雀的两种行为&#xff0c;即&#xff1a;在夏秋季节收集并储存食物&#xff0c;在春冬季节搜…

路径规划算法:基于浣熊优化的路径规划算法- 附代码

路径规划算法&#xff1a;基于浣熊优化的路径规划算法- 附代码 文章目录 路径规划算法&#xff1a;基于浣熊优化的路径规划算法- 附代码1.算法原理1.1 环境设定1.2 约束条件1.3 适应度函数 2.算法结果3.MATLAB代码4.参考文献 摘要&#xff1a;本文主要介绍利用智能优化算法浣熊…

调频连续波(FMCW)波形设计、真实道路场景仿真及汽车自适应巡航控制信号处理(Matlab代码实现)

目录 &#x1f4a5;1 概述 &#x1f4da;2 运行结果 &#x1f389;3 参考文献 &#x1f468;‍&#x1f4bb;4 Matlab代码 &#x1f4a5;1 概述 以下是关于调频连续波&#xff08;FMCW&#xff09;波形设计、真实道路场景仿真以及汽车自适应巡航控制信号处理的概述&#x…

【问题解决】VSCode 远程安装插件特别慢

【问题描述】 我要配置 VSCode WSL 的开发环境&#xff0c;需要在 WSL 里也装上 C、CMake 系列的插件&#xff0c;如下图的直接下载方式特别慢&#xff1a; 【解决方法】 先去网站下载插件&#xff1a;https://marketplace.visualstudio.com/&#xff0c;后缀名&#xff1a;…

【DFS】LeetCode 17. 电话号码的字母组合

Halo&#xff0c;这里是Ppeua。平时主要更新C语言&#xff0c;C&#xff0c;数据结构算法…感兴趣就关注我bua&#xff01; 目录 题目:示例: 题解:代码实现: 题目: 示例: 题解: 这是一道全排列的问题,先来看看示例. 看第一个示例:输入"23",其对应的是"abc&qu…

【GIT】如何在GitHub上向一个开源项目贡献代码?

如何在GitHub上向一个开源项目贡献代码 参考链接&#xff1a;https://www.bilibili.com/video/BV1WC4y1a76G/?p1&t175 一、fork目标仓库的代码 必须先fork别人的代码到自己仓库之后才能修改代码&#xff0c;不能直接修改别人的代码。 这样就fork到自己的仓库了。 二、…

学习react,复制一个civitai-更新2

更新内容 耗时一个礼拜左右&#xff0c;增加了个新界面&#xff1a;模型图片详情界面。 看看效果图吧&#xff1a; 功能介绍 操作&#xff1a;在模型详情界面点击一个图片&#xff0c;就能到图片详情界面 1.点击哪个图片&#xff0c;就会展示哪个&#xff0c;同时还会更新图…

【C++】面试基础搬运

c/c c三大特性 封装 最开始接触代码是C语言&#xff0c;那么开始写一些逻辑代码的时候会很麻烦&#xff0c;因为你要在函数中定义变量&#xff0c;然后按顺序写对应的逻辑&#xff0c;接着可以将逻辑封装成函数。当时会感觉很麻烦&#xff0c;因为很散装&#xff0c;知道后面…

docker-compose 常用命令(附 docker-compose 的安装教程)

本文目录 1. docker-compose 介绍1. docker-compose 简介2. docker-compose 安装3. docker-compose 卸载 2. docker-compose 常用命令1. docker-compose 命令格式2. docker-compose up3. docker-compose ps4. docker-compose stop5. docker-compose down6. docker-compose logs…

虚幻引擎程序化资源生成框架PCG 之Gather(收集)、Merge(合并)、Union(并集)

有朋友询问&#xff1a;Gather&#xff08;收集&#xff09;、Merge&#xff08;合并&#xff09;、Union&#xff08;并集&#xff09;这三个运算节点&#xff0c;看名字有些相似&#xff0c;究竟区别是什么&#xff1f;目前还没有详细的官方文档&#xff0c;所以今天老王结合…

电脑城逐渐衰退甚至消失,究竟是好是坏呢?

在过去很长一段时间里&#xff0c;想要购买电子设备都逃不开一个叫“电脑城”的地方&#xff0c;那里鱼龙混杂良莠不齐&#xff0c;是令许多人记忆深刻分外难忘之处。但是随着时代发展电商兴起&#xff0c;采用传统线下销售的电脑城却逐渐衰退甚至面临消失。 电脑城曾经是很多…

【2】Spring手写模拟-依赖注入、初始化、AOP

首先回顾一下我们之前的流程ApplicationContext 构造方法 获取Spring配置类ComponetScan 注解&#xff0c;扫描包&#xff0c;获取其路径及其对应的字节码文件逐个扫描字节码文件 利用字节码文件获取类&#xff0c;查看是否包含Componet 注解&#xff0c;并获取或者生成BeanNa…

vv、vt 埋点上报自动化文档

vv、vt 埋点自动化文档 文章目录 vv、vt 埋点自动化文档一、项目简介二、环境搭建Airtest官方参考文档AirtestIDE下载Python环境安装Airtest安装安卓环境IOS 环境iOS-Tagent 编译 设置代理 三、框架介绍四、实现原理4.1 框架流程图4.2 初始化配置4.2.1 读取mock server配置&…

sqli-labs

目录 Less1 首先来爆字段 联合注入 判断注入点 爆数据库名 爆破表名 information_schema information_schmea.tables group_concat() 爆破列名 information_schema.columns 爆值 SQLMAP 主要对sqli-labs 的深入学习 Less1 我们先看看源代码 <?php //includ…