Crypto++ 入门(1) 安装

来源:互联网 发布:搞笑的网络剧 编辑:程序博客网 时间:2024/06/05 00:30

这篇文章主要介绍的是如何安装Crypto++。

以下所有文章基于的软件环境为:

Windows 7 64位

Visual Studio 2010

我们首先需要去下载Crypto++,其官网为www.cryptopp.com,从这上面可以下载最新版Crypto++,版本号为5.62。

下载之后在本地解压缩,得到一个文件夹,打开这个文件夹的cryptest.sln,即\cryptopp562\cryptest.sln.打开之后VS2010要先对解决方案进行转换,点击“下一步”,选择是否备份,之后点击完成即可。在解决方案资源管理器中我们可以看到如下画面:

由于我主要开发基于MFC的程序,所以需要对这几个项目的属性进行一下设置,不然在之后的开发中会出现一个问题,这个问题在本文最后会介绍给大家。我们需要对每个项目的属性进行一下设置。点开每个项目的配置属性(Alt + F7)->C/C++->代码生成->运行库改为/MDd(DEBUG)或者/MD(RELEASE)。每个项目都这样设置完成之后,我们点击“启动调试”即可。之后VS2010会报一个错,如下图所示,我们先不管他。

PS:这里要在DEBUG和RELEASE模式之下都进行一次调试,以便编译出供我们在这两个模式之下使用的lib文件。

在两种模式之下都进行编译之后,我们可以在\cryptopp562\Win32\Output\Debug中找到cryptlib.lib(RELEASE版的在\cryptopp562\Win32\Output\Release中)。接下来我们可以在C:\ProgramFiles\中建立CryptoPP文件夹,在这个文件夹中建立include和lib两个子文件夹,将\cryptopp562文件夹之下的所有文件(不包括子文件夹)复制到C:\Program Files\CryptoPP\include中。在C:\ProgramFiles\CryptoPP\lib中建立debug和release两个文件夹,分别将上面所说的两个cryptlib.lib复制到相应文件夹下。

在完成上面的步骤之后,每次我们新建项目,如果想要使用Crypto++库,只要在项目的配置属性中完成以下设置即可:

配置属性(Alt + F7)->C/C++->常规->附加包含目录,添加C:\ProgramFiles\CryptoPP\include(DEBUG和RELEASE均如此)

配置属性(Alt + F7)->链接器->常规->附加库目录,添加C:\ProgramFiles\CryptoPP\lib\debug(RELEASE下添加C:\Program Files\CryptoPP\lib\release)

这样新建的项目之中就可以使用Crypto++库了。

 

下面让我们完成第一个使用Crypto++库的程序。

让我们在VS2010中建立一个VisualC++的Win32控制台应用程序,完成上面所说的对项目的配置之后,开始写以下程序。(部分代码参考网络,地址已忘记,在此向原作者提出感谢!)

 


 

// aestest.cpp : 定义控制台应用程序的入口点。//#include "stdafx.h"#include <aes.h>#include <cryptopp/Hex.h>      // StreamTransformationFilter#include <cryptopp/modes.h>    // CFB_Mode#include <iostream>  //std:cerr  #include <sstream>  //std::stringstream  #include <string>using namespace std;using namespace CryptoPP;#pragma comment( lib, "cryptlib.lib" )std::string CFB_AESEncryptStr(std::string sKey, std::string sIV, const char *plainText){    std::string outstr;          //填key      SecByteBlock key(AES::MAX_KEYLENGTH);      memset(key,0x30,key.size() );      sKey.size()<=AES::MAX_KEYLENGTH?memcpy(key,sKey.c_str(),sKey.size()):memcpy(key,sKey.c_str(),AES::MAX_KEYLENGTH);                //填iv      byte iv[AES::BLOCKSIZE];      memset(iv,0x30,AES::BLOCKSIZE); sIV.size()<=AES::BLOCKSIZE?memcpy(iv,sIV.c_str(),sIV.size()):memcpy(iv,sIV.c_str(),AES::BLOCKSIZE);          AES::Encryption aesEncryption((byte *)key, AES::MAX_KEYLENGTH);            CFB_Mode_ExternalCipher::Encryption cfbEncryption(aesEncryption, iv);            StreamTransformationFilter cfbEncryptor(cfbEncryption, new HexEncoder(new StringSink(outstr)));      cfbEncryptor.Put((byte *)plainText, strlen(plainText));      cfbEncryptor.MessageEnd();            return outstr;  }  std::string CFB_AESDecryptStr(std::string sKey, std::string sIV, const char *cipherText)  {      std::string outstr;            //填key      SecByteBlock key(AES::MAX_KEYLENGTH);      memset(key,0x30,key.size() );      sKey.size()<=AES::MAX_KEYLENGTH?memcpy(key,sKey.c_str(),sKey.size()):memcpy(key,sKey.c_str(),AES::MAX_KEYLENGTH);                //填iv      byte iv[AES::BLOCKSIZE];      memset(iv,0x30,AES::BLOCKSIZE);  sIV.size()<=AES::BLOCKSIZE?memcpy(iv,sIV.c_str(),sIV.size()):memcpy(iv,sIV.c_str(),AES::BLOCKSIZE);    CFB_Mode<AES >::Decryption cfbDecryption((byte *)key, AES::MAX_KEYLENGTH, iv);                HexDecoder decryptor(new StreamTransformationFilter(cfbDecryption, new StringSink(outstr)));      decryptor.Put((byte *)cipherText, strlen(cipherText));      decryptor.MessageEnd();            return outstr;  }  int _tmain(int argc, _TCHAR* argv[]){string plainText = "Hello Crypto++! This is my first Crypto++ program.";string aesKey = "0123456789ABCDEF0123456789ABCDEF";//256bits, also can be 128 bits or 192bitsstring aesIV = "ABCDEF0123456789";//128 bitsstring cipherText,decryptedText;cipherText = CFB_AESEncryptStr(aesKey, aesIV, plainText.c_str());//加密¨¹decryptedText = CFB_AESDecryptStr(aesKey, aesIV, cipherText.c_str());//解密¨¹cout << "Crypto++ AES-256 CFB模式加密测试?"<< endl;cout << "加密用密钥:" <<aesKey << endl;cout << "密钥长度:" <<AES::MAX_KEYLENGTH*8 <<"bits" << endl;cout << "CFB模式所需的IV:" << aesIV << endl;cout << endl;cout << "原文:" << plainText << endl;cout << "密文:" << cipherText <<endl;cout << "恢复明文:" << decryptedText <<endl;getchar();return 0;}

 

以下是运行结果:

 

好了,到现在位置,我们已经完成了一个可以使用的AES-256 CFB模式加解密软件。

 

 

 fatal error C1189: #error :  Please use the /MD switch for _AFXDLL builds解决方法

当我们在MFC程序中使用Crypto++的时候,如果按照Crypto++默认的方式编译出cryptlib.lib,当MFC开始编译的时候,就会提示类似以下的信息:

cryptlib.lib(randpool.obj) :error LNK2005: "public: __thiscall std::basic_string<char,struct std::char_traits<char>,classstd::allocator<char> >::basic_string<char,structstd::char_traits<char>,class std::allocator<char> >(char const*)"(??0?$basic_string@DU?$char_traits@D@std@@V?$allocator@D@2@@std@@QAE@PBD@Z)already defined in msvcprtd.lib(MSVCP80D.dll)

这种方式网上给出的解决方案是将项目的配置属性(Alt + F7)->C/C++->代码生成->运行库改为/MTd(DEBUG)或者/MT(RELEASE)。可是对于MFC程序,当这样改之后,就会报出以下错误:

fatal error C1189: #error : Please use the /MD switch for _AFXDLL builds

想要解决这种局面,方法就是按本文上面所说的,将Crypto++每个项目的配置属性(Alt + F7)->C/C++->代码生成->运行库改为/MDd(DEBUG)或者/MD(RELEASE),再进行编译,获得cryptlib.lib,这样就可以在MFC中以/MDd(DEBUG)或者/MD(RELEASE)编译程序而不出问题。

原创粉丝点击