(全网最详细攻略)【Crypto++】在Visual studio2022中运行Cryptopp

news2025/1/17 3:14:22

文章目录

  • 前言
  • 一、Cryptopp是什么?
    • 1. Cryptopp(CRYPTO++)官方文档wiki
  • 二、下载Cryptopp
    • 2. Crypto++下载地址
    • 3. 下载PEM包
  • 三、在VS2022中使用Cryptopp库
    • 4. 处理crypto++源文件
    • 5. 在VS2022项目中使用crypto++库
  • 四、运行代码后一些关于c++的错误总结


前言

  1. Cryptopp是什么?
  2. 如何下载Cryptopp?
  3. 如何在VS中使用Crypto++?

一、Cryptopp是什么?

免费C++库,用于密码方案,最初由Wei Dai编写,包括密码,消息认证代码,单向哈希函数,公钥密码系统,密钥协议方案和压缩压缩。
PEM包:消息加密的部分实现,允许您读取和写入 PEM 编码的密钥和参数,包括加密的私钥。其他文件包括对 RSA、DSA、EC、ECDSA 密钥和 Diffie-Hellman 参数的支持。该包包括五个额外的源文件,一个使用OpenSSL创建测试密钥的脚本,一个用于测试读取和写入密钥的C++程序,以及一个用于验证使用OpenSSL编写的Crypto++编写的密钥的脚本。

1. Cryptopp(CRYPTO++)官方文档wiki

https://cryptopp.com/wiki/Main_Page

二、下载Cryptopp

2. Crypto++下载地址

  • 官网地址:https://www.cryptopp.com/#download
  • github地址(8.7.0版本):https://github.com/weidai11/cryptopp/releases/tag/CRYPTOPP_8_7_0
    有四个选项,请下载源码(如图所示)
    在这里插入图片描述

3. 下载PEM包

  • pem包官方地址:https://cryptopp.com/wiki/PEM_Pack
    滑动页面至底部,下载(如图所示)
    在这里插入图片描述
    在这里插入图片描述

三、在VS2022中使用Cryptopp库

4. 处理crypto++源文件

  1. 打开下载并解压好的crypto++文件和pem包,将pem包中包含的全部文件复制粘贴到crypto++包中:

图1是解压后的pem包
在这里插入图片描述
图2为pem包中包含的所有文件
在这里插入图片描述

  1. 将图2中所有文件粘贴到图3所示解压后的crypto++文件中,双击打开crypto++文件中的cryptest.sln:
    在这里插入图片描述
  2. 在VS2022中可以看到四个子工程(如图所示):
  • cryptdll - 生成cryptopp.dll动态库
  • dlltest - 用来测试cryptopp.dll,依赖cryptdll工程
  • cryptlib - 生成cryptlib.lib静态库
  • cryptest - 用来测试cryptopp,依赖cryptlib工程
    在这里插入图片描述
  1. 往crypto++源文件中加入pem包:

右击“Header Files”->添加->现有项:

  • pem.h
  • pem_common.h

右击“Source Files”->添加->现有项:

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

在这里插入图片描述
5. build子工程cryptlib,生成lib文件
分别在Release和debug两个情况下,调整设备型号(本机是x64),右击子工程cryptlib点击“生成”。输出显示成功后即为完成。

在这里插入图片描述

此时,crypto++源文件夹下会多出一个名称为x64的文件夹,该文件夹下有三个子文件夹,其中一个名为Output,Output文件夹下有两个子文件夹,如图所示。Debug和Release文件夹下都有lib文件,这两个lib文件就是我们后面要使用的lib库。
在这里插入图片描述
在这里插入图片描述

  1. 处理crypto++文件:
    新建文件夹,命名为cryptopp(或其他名称),文件夹下创建两个文件夹,分别命名为include,lib。
    在这里插入图片描述
  • 将crypto++源文件中所有头文件(.h结尾的文件)复制到新文件夹下的include文件夹下。
    在这里插入图片描述

在这里插入图片描述

  • 将上述Output文件夹复制粘贴到新建文件夹下的lib文件中。
    在这里插入图片描述
    至此,我们需要用到crypto++库整理完成。简而言之,从官网上下载下来的整个crypto++源码,我们只需要用到include和lib两个库文件。

5. 在VS2022项目中使用crypto++库

  1. 打开VS2022,文件->新建->项目->控制台应用
    在这里插入图片描述

  2. 将新创建的项目中原本的hello world代码换成以下代码(该代码为crypto++官网给出的AES加密代码)作为测试代码:

#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;
}
  1. 项目->属性
    跟着图片进行修改选项:
    a. 此处修改为我们新建的文件夹下的include文件路径。
    在这里插入图片描述
    b.留心你现在的模式是Release还是Debug。Release对应的运行库是/MT,Debug对应的是/MTd
    在这里插入图片描述
    c.此处修改为我们新建的文件夹下的lib文件下路径。查看自己的配置,Debug对应的是Debug文件下的路径;Release对应的是Release文件下的路径。
    在这里插入图片描述
  2. 运行测试代码,出现结果图则为crypto++配置成功。
    在这里插入图片描述

四、运行代码后一些关于c++的错误总结

  1. 关于VS中多个源文件如何分开运行的解决方法
    参考博文:https://blog.csdn.net/m0_62638970/article/details/121794983
  2. c++中setw()与setfill()的用法详情:https://blog.csdn.net/chen_zan_yu_/article/details/86663579
  3. C++ - “std” has no member “string”:https://blog.csdn.net/cedian0443/article/details/104930355

最后,由于crypto++的官方文档wiki资料不全面,非常感谢以下博文的贡献:

  • VS2019下Crypto++安装与调用
  • Crypto++的安装及使用
  • Crypto++安装和简单使用RSA加密解密
  • 视频教学(youtube):https://www.youtube.com/watch?v=5XE4zEN-WKg

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

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

相关文章

单片机--中断实验练习

【1】实验要求&#xff1a; STM32上电LED&#xff08;PB0&#xff09;灯亮 &#xff0c;当检测到按键&#xff08;PA8&#xff09;按下时处理中断事件&#xff0c;变量i 扩展&#xff1a;知识点 响应优先级->在两个中断同时触发时&#xff0c;且这两个中断的优先级相同&a…

SpringBootWeb入门

1. SpringBootWeb快速入门 1.1 需求 需求&#xff1a;基于SpringBoot的方式开发一个web应用&#xff0c;浏览器发起请求/hello后&#xff0c;给浏览器返回字符串 “Hello World ~”。 1.2 开发步骤 第1步&#xff1a;创建SpringBoot工程项目 第2步&#xff1a;定义HelloCon…

chatgpt赋能Python-python_docx_目录

简介 Python是一种非常优秀的编程语言&#xff0c;主要用于数据分析、机器学习、人工智能等领域。在这些领域中&#xff0c;常常需要使用文档处理相关的工具&#xff0c;例如Microsoft Word。在使用Python编程的过程中&#xff0c;文档处理是非常常见的操作&#xff0c;因此Py…

AC规则-1

本文主要参考规范 GPD_Secure Element Access Control_vxxx.pdf OMA 架构 基本定义 GP(GlobalPlatform)定义了一套允许各应用提供方独立且安全地管理其在SE上的应用的安全框架&#xff0c;而AC(Access Control)&#xff0c;顾名思义&#xff0c;是对外部应用进行SE上应用访问…

pyinstaller 打包 ! pyinstaller 打包路径问题!wordcloud打包缺失stopwords文件

wordcloud打包缺失stopwords文件 错误描述 Unhandled exception in script Failed to execute scriptmain due to unhandled exception: (Errno 2] No such file or directory: C:\Users\VADMINI\appDatallLocal\Templ\2\ME186322\wordcloud\stopwords解决办法 找到安装word…

实验室基础操作

一&#xff1a;FZmotion。 1&#xff1a;查看相机是否加入成功。 2&#xff1a;添加蒙版。 3&#xff1a;选择标定杆类型。500mm 4&#xff1a;标定。 5&#xff1a;数据传输。 二&#xff1a;MotionBuilder。 1&#xff1a;所使用插件。 2&#xff1a;fzmotion插件安装。 Mo…

chatgpt赋能Python-python_errno22

Python的errno22错误——引起问题的原因及解决方法 如果你使用过Python编程语言进行过开发&#xff0c;你可能会像其他开发者一样遭遇过errno22错误。这种错误通常会导致程序崩溃或者无法正常运行。在这篇文章里&#xff0c;我们将深入了解errno22错误的原因&#xff0c;并提供…

【数据结构】C--顺序表1.0版本(本文非常适合小白观看,已尽力详解,以及图解也是尽量列举)

目录 0.前言 什么是数据结构&#xff1f; 1.逻辑结构: 1.1线性结构: 1.2非线性结构: (1)集合 (2)树形结构 (3)图形结构或者网状结构 2.存储结构 一.线性表 二.顺序表 顺序表与数组的关系:(非常容易混淆) 1.静态顺序表&#xff1a;使用定长数组存储元素 2.动态顺序表…

MySQL中auto_increment有什么作用?(IT枫斗者)

MySQL中auto_increment有什么作用&#xff1f; 问题来源 很多时候&#xff0c;MySQL语句中会出现【auto_increment】这个词汇&#xff0c;大多数时候&#xff0c;表都是自动生成的&#xff0c;刚开始学习MySQL数据库时会学习到&#xff0c;后来&#xff0c;渐渐地可能会忘记&…

Windows安装VirtualBox教程(图文版)

VirtualBox是一款免费的虚拟化软件&#xff0c;可以在一台计算机上运行多个操作系统。它可以在Windows、Linux、Mac OS X和Solaris等操作系统上运行。VirtualBox支持多种虚拟硬件设备&#xff0c;包括网络适配器、USB控制器、显卡等。用户可以通过VirtualBox创建一个虚拟的计算…

同个前端页面,在手机端和PC端打开,访问到的资源有可能不是同一个

记录项目遇到的问题&#xff0c;问题表现为&#xff1a; 1、用手机端和PC端打开同一个前端页面&#xff0c;通讯到达的后端服务却不是同一个 排查&#xff1a; 1、确认手机端和PC端打开后&#xff0c;实际访问的前端资源并不是同一个 2、手机端配置的socket端口有误&#x…

图片模块封装:Glide高级使用+使用设计模式图片框架封装+Bitmap尺寸压缩和质量压缩+Bitmap加载大图长图

图片模块封装&#xff1a;Glide高级使用使用设计模式图片封装Bitmap尺寸压缩和质量压缩Bitmap加载大图长图 一.如何更换图片框架二.Glide配置1.依赖&#xff1a;2.缓存配置&#xff1a;3.网络配置&#xff1a;glide默认使用httpUrlConnection完成网络请求&#xff0c;可以改成o…

Python学习笔记——《吴恩达Machine Learning》逻辑回归例程

文章目录 逻辑回归和线性回归的区别&#xff1f;正则化逻辑回归逻辑回归中的梯度下降&#xff1a; 模型预测案例解决二分类问题&#xff1a;不同的 λ \lambda λ会产生不同的分类结果: 逻辑回归和线性回归的区别&#xff1f; 逻辑回归可以理解为线性回归的一个plus版&#xf…

架构-软件工程模块-3

系统测试 #mermaid-svg-cpVF4noxB0estLWd {font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;fill:#333;}#mermaid-svg-cpVF4noxB0estLWd .error-icon{fill:#552222;}#mermaid-svg-cpVF4noxB0estLWd .error-text{fill:#552222;stroke:#552222;}#…

【Python】判断语句 ③ ( if elif else 语句 | 语法简介 | 代码示例 )

文章目录 一、 if elif else 语句语法二、 代码示例 一、 if elif else 语句语法 在开发场景中 , 经常用到 多条件判定 , 初次判定 , 先进行 条件 1 判定 , 如果 条件 1 满足 则执行 条件 1 对应动作 , 如果 条件 1 不满足 , 则 判定 条件 2 是否满足 , 如果 条件 2 满足 则 …

linux操作系统【进阶完整版】

文章目录 基础命令tailvimsystemctl 用户和组/权限su/sudo创建删除ls -lchmodchown 实用操作快捷键软件安装软链接时区与时间date修改时区 ip、主机名网络传输请求端口 进程管理主机状态监控系统资源占用磁盘信息监控网络状态监控 环境变量上传和下载压缩和解压tarzip/unzip 安…

一、尚医通上传医院接口

文章目录 一、上传医院接口1、集成mongodb1.1添加依赖1.2添加配置 2、添加医院基础类2.1 添加model2.2 添加Repository2.3 添加service接口及实现类2.4 添加controller 3、上传医院3.1 接口数据分析3.2 添加service接口3.3 添加repository接口3.4 添加controller接口3.5 添加帮…

chatgpt赋能Python-python_errno2

Python errno2: 深入了解错误代码并解决问题 当你在使用 Python 进行编程时&#xff0c;不可避免地会遇到一些错误。这些错误通常会被分配一个错误代码&#xff0c;也称为errno。errno2是Python中的一个特定错误代码类型。在本文中&#xff0c;我们将深入了解errno2及其在Pyth…

chatgpt赋能Python-python_errno

Python errno: 什么是errno和它在Python中的应用 在Python编程中&#xff0c;errno是一个非常重要的概念&#xff0c;用于表示系统调用或库函数调用返回的错误代码。在本文中&#xff0c;我们将深入探讨errno是什么&#xff0c;如何在Python中使用它&#xff0c;以及一些常见的…

第3章 TensorFlow进阶

文章目录 第3章 TensorFlow进阶3.1 TensorFlow 的计算模型3.1.1 计算图的工作原理3.1.2 在不同计算图上定义和使用张量进行计算3.2.1 在 GPU 上执行简单的算术运算 3.2 TensorFlow 的嵌入层3.3 TensorFlow 的多层3.4 TensorFlow 实现损失函数3.4.1 softmax 损失函数3.4.1 稀疏矩…