当前位置: 首页 > news >正文

cryptopp des加密文件_Crypto++入门学习笔记(DES、AES、RSA、SHA-256)

Crypto++是个免费的C++加解密类库,由于资格太老、持续更新,最新版本到了CryptoPP 5.6,对天缘而言,第一眼看到CryptoPP就感觉头大,根目录下放置大量单源文件、编译文件、项目文件,再加上多平台和多编译器支持,文件几乎又多了一倍,而且还是都混到一起,直接就让人望而却步。毕竟Crypto是个功能完整,且经过大量用户使用考验的开源库。所以,皱眉学习汇总一下,遂成此文。

本文测试环境:Windows7 SP1+VC6,测试工程名为Test。用VC打开CryptoPP工程文件,会发现有四个子工程:

cryptdll - 生成cryptopp.dll动态库

dlltest - 用来测试cryptopp.dll,依赖cryptdll工程

cryptlib - 生成cryptlib.lib静态库

cryptest - 用来测试cryptopp,依赖cryptlib工程

所以,我们有两种使用CryptoPP方法,一种是静态链接,还有一种是动态链接,使用对应的工程编译即可,区别就不说了,我们下文以静态链接为例,介绍几种常用加解密算法使用。

一、编译cryptlib

首先需要编译cryptlib,最后得到cryptlib.lib文件。

先在测试工程Test下创建目录cryptopp\lib和cryptopp\include,并把Project Settings-C/C++-Processor下Include目录增加“cryptopp\include”。

把cryptlib.lib拷贝到Test\cryptopp\lib下。

把cryptoPP根目录下所有的*.h文件都拷贝到Test\cryptopp\include下。当然实际上用不了那么多,后续用到哪个include哪个。

下文开始测试使用CryptoPP,实际使用中,如果功能上逻辑上需要修改,可以参考上文测试工程中的示例程序,以及官方文档。下文编译如果报告XX重复定义等错误,请检查LIB库工程和本测试工程的:Project Setting-C/C++-Code Generation User run-time library是否统一。

二、测试cryptlib

1、测试MD5

#define CRYPTOPP_ENABLE_NAMESPACE_WEAK 1

#include "md5.h"

using namespace CryptoPP;

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

using namespace std;

void main() {

byte message[]="HelloWorld!";

byte mres[16];//MD5 128 bits=16bytes

Weak::MD5 md5;

md5.Update(message,11);//strlen=11

md5.Final(mres);

for(int i=0;i<16;i++)

printf("%02X",mres[i]);

printf("\n");

}

2、测试AES

//For AES encrypt

#include "default.h"

#include "cryptlib.h"

#include "filters.h"

#include "bench.h"

#include "osrng.h"

#include "hex.h"

#include "modes.h"

#include "files.h"

using namespace CryptoPP;

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

using namespace std;

void main() {

unsigned char key[]= {0x01,0x02,0x03,0x04,0x05,0x06,0x07,0x08,0x01,0x02, 0x03,0x04,0x05,0x06,0x07,0x08};//AES::DEFAULT_KEYLENGTH

unsigned char iv[]= {0x01,0x02,0x03,0x03,0x03,0x03,0x03,0x03,0x03,0x03, 0x01,0x02,0x03,0x03,0x03,0x03};

int keysize = 16;

stringmessage = "Hello World!";

stringstrEncTxt;

stringstrDecTxt;

//CBC - PADDING

//AES-CBC Encrypt(ONE_AND_ZEROS_PADDING)

CBC_Mode::Encryption Encryptor1(key,keysize,iv);

StringSource(message,

true,

new StreamTransformationFilter(Encryptor1,

new StringSink( strEncTxt ),

BlockPaddingSchemeDef::BlockPaddingScheme::ONE_AND_ZEROS_PADDING,

true)

);

//AES-CBC Decrypt

CBC_Mode::Decryption Decryptor1(key,keysize,iv);

StringSource(strEncTxt,

true,

new StreamTransformationFilter( Decryptor1,

new StringSink( strDecTxt ),

BlockPaddingSchemeDef::BlockPaddingScheme::ONE_AND_ZEROS_PADDING,

true)

);

//CTR - NO_PADDING

//AES-CTR Encrypt

CTR_Mode::Encryption Encryptor2(key,keysize,iv);

StringSource(message,

true,

new StreamTransformationFilter( Encryptor2,

new StringSink( strEncTxt ),

BlockPaddingSchemeDef::BlockPaddingScheme::NO_PADDING,

true)

);

//AES-CTR Decrypt

CTR_Mode::Decryption Decryptor2(key,keysize,iv);

StringSource(strEncTxt,

true,

new StreamTransformationFilter( Decryptor2,

new StringSink( strDecTxt ),

BlockPaddingSchemeDef::BlockPaddingScheme::NO_PADDING,

true)

);

}

上文是使用StringSource方式加密字符串,还可以使用FileSource方式直接对文件进行加解密操作。示例如下:

SecByteBlock HexDecodeString(const char *hex) {

StringSource ss(hex, true, new HexDecoder);

SecByteBlock result((size_t)ss.MaxRetrievable());

ss.Get(result, result.size());

return result;

}

void AES_CTR_Encrypt(const char *hexKey, const char *hexIV, const char *infile, const char *outfile) {

SecByteBlock key = HexDecodeString(hexKey);

SecByteBlock iv = HexDecodeString(hexIV);

CTR_Mode::Encryption aes(key, key.size(), iv);

FileSource(infile, true, new StreamTransformationFilter(aes, new FileSink(outfile)));

}

直接调用AES_CTR_Encrypt函数即可,CBC函数需对应修改。

四、使用提示

1、StringSource类定义filters.h

//! zero terminated string as source

StringSource(const char *string, bool pumpAll, BufferedTransformation *attachment = NULL)

: SourceTemplate(attachment) {SourceInitialize(pumpAll, MakeParameters("InputBuffer", ConstByteArrayParameter(string)));}

//! binary byte array as source

StringSource(const byte *string, size_t length, bool pumpAll, BufferedTransformation *attachment = NULL)

: SourceTemplate(attachment) {SourceInitialize(pumpAll, MakeParameters("InputBuffer", ConstByteArrayParameter(string, length)));}

//! std::string as source

StringSource(const std::string &string, bool pumpAll, BufferedTransformation *attachment = NULL)

: SourceTemplate(attachment) {SourceInitialize(pumpAll, MakeParameters("InputBuffer", ConstByteArrayParameter(string)));}

2、RSA有关的加解密、签名函数

更多请参考工程cryptest工程下test.cpp文件内函数

void GenerateRSAKey(unsigned int keyLength, const char *privFilename, const char *pubFilename, const char *seed);

string RSAEncryptString(const char *pubFilename, const char *seed, const char *message);

string RSADecryptString(const char *privFilename, const char *ciphertext);

void RSASignFile(const char *privFilename, const char *messageFilename, const char *signatureFilename);

bool RSAVerifyFile(const char *pubFilename, const char *messageFilename, const char *signatureFilename);

相关文章:

  • espritcam后处理教学_MsterCAM9.1常用后处理
  • sit是什么环境_springboot 多环境配置 yml文件版
  • g2 坐标轴从0开始_英雄联盟:号称准备选冠军皮肤的g2,为何惨遭暴打?
  • 十进制度分秒lisp函数_十进制度转换为度分秒
  • 测试用例优先级划分_如何为测试用例分级?
  • php 实现二叉树的最大深度_PHP 如何实现用户二叉树排序需求
  • jq设置checked是否选中_jquery判断checkbox是否选中及改变checkbox状态
  • vue 创建图片坐标点_vue项目中使用高德地图(根据坐标定位点)
  • activiti表字段_activiti数据库表结构剖析(五)
  • 跑带宽度多少合适_有多少人知道跑步机跑带宽度和长度多少合适?
  • mobiledevice什么意思_mobile device
  • python迭代对象是什么意思_python之中的迭代与迭代对象是什么?
  • 旧物手工机器人制作图片_科技小发明手工,DIY电池机器人制作图解教程
  • 概率密度变换公式 雅可比矩阵_【转载】雅克比矩阵与雅克比行列式
  • win10蓝牙已配对连接不上_win10系统蓝牙已配对但未连接的解决方法
  • JavaScript 如何正确处理 Unicode 编码问题!
  • 时间复杂度分析经典问题——最大子序列和
  • 4月23日世界读书日 网络营销论坛推荐《正在爆发的营销革命》
  • C++类的相互关联
  • Date型的使用
  • eclipse的离线汉化
  • httpie使用详解
  • HTTP传输编码增加了传输量,只为解决这一个问题 | 实用 HTTP
  • LeetCode18.四数之和 JavaScript
  • oldjun 检测网站的经验
  • Promise面试题,控制异步流程
  • Python进阶细节
  • 京东美团研发面经
  • 使用docker-compose进行多节点部署
  • 小李飞刀:SQL题目刷起来!
  • linux 淘宝开源监控工具tsar
  • Salesforce和SAP Netweaver里数据库表的元数据设计
  • ​软考-高级-系统架构设计师教程(清华第2版)【第20章 系统架构设计师论文写作要点(P717~728)-思维导图】​
  • #Linux(帮助手册)
  • (04)odoo视图操作
  • (1)虚拟机的安装与使用,linux系统安装
  • (html转换)StringEscapeUtils类的转义与反转义方法
  • (SpringBoot)第二章:Spring创建和使用
  • (zhuan) 一些RL的文献(及笔记)
  • (保姆级教程)Mysql中索引、触发器、存储过程、存储函数的概念、作用,以及如何使用索引、存储过程,代码操作演示
  • (入门自用)--C++--抽象类--多态原理--虚表--1020
  • (十)DDRC架构组成、效率Efficiency及功能实现
  • (五)Python 垃圾回收机制
  • (一)spring cloud微服务分布式云架构 - Spring Cloud简介
  • (转)创业家杂志:UCWEB天使第一步
  • ***php进行支付宝开发中return_url和notify_url的区别分析
  • .bat批处理(十):从路径字符串中截取盘符、文件名、后缀名等信息
  • .dwp和.webpart的区别
  • .NET 3.0 Framework已经被添加到WindowUpdate
  • .NET 8 编写 LiteDB vs SQLite 数据库 CRUD 接口性能测试(准备篇)
  • .NET Framework与.NET Framework SDK有什么不同?
  • .Net Remoting常用部署结构
  • .Net下使用 Geb.Video.FFMPEG 操作视频文件
  • /bin/rm: 参数列表过长"的解决办法
  • /proc/vmstat 详解