CryptoPP使用介绍

转载 2016年05月31日 09:54:06

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

官方网址:http://www.cryptopp.com/

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

  • cryptdll - 生成cryptopp.dll动态库
  • dlltest - 用来测试cryptopp.dll,依赖cryptdll工程
  • cryptlib - 生成cryptlib.lib静态库
  • cryptest - 用来测试cryptopp,依赖cryptlib工程

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

一、编译cryptlib

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

  1. 先在测试工程Test下创建目录cryptopp\lib和cryptopp\include,并把Project Settings-C/C++-Processor下Include目录增加“cryptopp\include”。
  2. 把cryptlib.lib拷贝到Test\cryptopp\lib下。
  3. 把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;

	string	message = "Hello World!";
	string	strEncTxt;
	string	strDecTxt;
	
	//CBC - PADDING
	//AES-CBC Encrypt(ONE_AND_ZEROS_PADDING)
	CBC_Mode<AES>::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<AES>::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<AES>::Encryption  Encryptor2(key,keysize,iv); 
	StringSource(	message, 
					true,
					new StreamTransformationFilter( Encryptor2,
						new StringSink( strEncTxt ),
						BlockPaddingSchemeDef::BlockPaddingScheme::NO_PADDING,
						true)
			); 
	
	//AES-CTR Decrypt
	CTR_Mode<AES>::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<AES>::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<StringStore>(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<StringStore>(attachment) {SourceInitialize(pumpAll, MakeParameters("InputBuffer", ConstByteArrayParameter(string, length)));}
	//! std::string as source
	StringSource(const std::string &string, bool pumpAll, BufferedTransformation *attachment = NULL)
		: SourceTemplate<StringStore>(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

本文链接:http://www.metsky.com/archives/584.html

版权声明:天缘原创博客,转载和使用请遵守署名、非商业用途和保持一致,转载请注明出处: 天缘博客

Crypto++(CryptoPP)库初始化以及使用注意事项

开篇提示:本文为本人原创,本文欢迎转载,但必须注明本文出处,例如。 “该文引用自 CruiseYoung的:Visual Studio 2013编译libiconv-1.14 http://blog...
  • fksec
  • fksec
  • 2014年11月11日 16:09
  • 4511

应用Cryptopp库实现AES加密【转】

应用Cryptopp库实现AES加密 在win32的操作系统下用vc6++来编译Crypto++? Library 5.1 的源代码,在对应的目录下会产生文件夹Debug,在文件夹Debug里...
  • vingstar
  • vingstar
  • 2013年08月29日 20:54
  • 1821

基于Crypto++/Cryptopp的rsa密钥生成,rsa加密、解密,rsa签名、验签12

4.生成rsa公钥、私钥,经过base64编码后保存到文件 需要导入一些头文件: #include "iterhash.h" #include "files.h" #include "rsa.h" #...
  • u011676589
  • u011676589
  • 2015年01月29日 10:57
  • 2150

Cryptopp使用

头文件清单 #pragma once /* 本模块功能: AES加解密,SHA256生成内容文摘,RSA非对称加解密。 測試環境: [1]VS2008 SP1 [2]WinXP...
  • lee353086
  • lee353086
  • 2012年05月23日 12:20
  • 9208

CryptoPP DES 加解密

DesUtil.h [cpp] view plaincopy #ifndef DESUTIL_H_   #define DESUTIL_H_      ...
  • qq476907900
  • qq476907900
  • 2014年08月01日 22:12
  • 200

基于cryptopp -- A Password Manager密码管理系统

系统设计安全目标 私密性(confidentiality):消息内容不让其他人看到消息:只有该看的人才能看 完整性(integrity):消息不被其他人篡改或者篡改之后可以被发现:看到的消息是正确的 ...
  • u012253191
  • u012253191
  • 2016年04月14日 11:09
  • 444

CryptoPP 使用方法

Crypto++ 使用方法 ——长时间以来,没增加新文章!凡所增加,必属原创。2007-7-24 0 引言为阅读本文,读者需要具备密码学最基本的知识,如:对称加密和非对称加密、数字签名等。还好,准备这...
  • cheungmine
  • cheungmine
  • 2007年07月24日 11:42
  • 9406

Cryptopp安装说明

Cryptopp安装说明:源文件:cryptopp552.zip目标机:mipsel-linux0、在进行crypto安装时,要检查其是非大小端配置完好!在mipsel-linux目标机环境下,要在c...
  • appletreesujie
  • appletreesujie
  • 2009年03月21日 16:39
  • 3095

探索Crypto++(一)下载、编译和部署

Crypto++是一个开源的C++加密算法库,它包括密码、消息认证码,单向散列函数,公钥密码机制,关键协议方案,缩小压缩等加密算法。本文将介绍Crypto++库从下载到项目应用的基本步骤。(本人目前的...
  • Sagittarius_Warrior
  • Sagittarius_Warrior
  • 2016年11月30日 16:31
  • 2094

Cryptopp使用

 http://blog.csdn.net/lee353086/article/details/7594165 #pragma once /* 本模块功能: AES加解密,SHA2...
  • MaxWoods
  • MaxWoods
  • 2014年10月27日 18:24
  • 1579
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:CryptoPP使用介绍
举报原因:
原因补充:

(最多只允许输入30个字)