Crypto++使用RSA加解密Word格式文档下载.docx
《Crypto++使用RSA加解密Word格式文档下载.docx》由会员分享,可在线阅读,更多相关《Crypto++使用RSA加解密Word格式文档下载.docx(10页珍藏版)》请在冰点文库上搜索。
现在写一个helloworld程序看看能不能编译通过。
#include<
iostream>
usingnamespacestd;
cryptopp/aes.h>
usingnamespaceCryptoPP;
intmain()
{
cout<
<
"
hellocrypto++"
<
endl;
Aesblocksizeis"
AES:
:
BLOCKSIZE<
return0;
}
编译运行,一切OK,哈哈:
D,可以用了。
lib和dll文件的区别和联系
.dll是在你的程序运行的时候才连接的文件,因此它是一种比较小的可执行文件格式,.dll还有其他的文件格式如.ocx等,所有的.dll文件都是可执行。
.lib是在你的程序编译连接的时候就连接的文件,因此你必须告知编译器连接的lib文件在那里。
一般来说,与动态连接文件相对比,lib文件也被称为是静态连接库。
当你把代码编译成这几种格式的文件时,在以后他们就不可能再被更改。
如果你想使用lib文件,就必须:
1包含一个对应的头文件告知编译器lib文件里面的具体内容
2设置lib文件允许编译器去查找已经编译好的二进制代码
如果你想从你的代码分离一个dll文件出来代替静态连接库,仍然需要一个lib文件。
这个lib文件将被连接到程序告诉操作系统在运行的时候你想用到什么dll文件,一般情况下,lib文件里有相应的dll文件的名字和一个指明dll输出函数入口的顺序表。
如果不想用lib文件或者是没有lib文件,可以用WIN32API函数LoadLibrary、GetProcAddress。
事实上,我们可以在VisualC++IDE中以二进制形式打开lib文件,大多情况下会看到ASCII码格式的C++函数或一些重载操作的函数名字。
一般我们最主要的关于lib文件的麻烦就是出现unresolvedsymble这类错误,这就是lib文件连接错误或者没有包含.c、.cpp文件到工程里,关键是如果在C++工程里用了C语言写的lib文件,就必需要这样包含:
extern"
C"
{
#include"
myheader.h"
}
这是因为C语言写的lib文件没有C++所必须的名字破坏,C函数不能被重载,因此连接器会出错
C语言中有一些函数不需要进行编译,有一些函数也可以在多个文件中使用。
一般来说,这些函数都会执行一些标准任务,如数据库输入/输出操作或屏幕控制等。
可以事先对这些函数进行编译,然后将它们放置在一些特殊的目标代码文件中,这些目标代码文件就称为库。
库文件中的函数可以通过连接程序与应用程序进行连接。
这样就不必在每次开发程序时都对这些通用的函数进行编译了。
不同类型的应用程序将会使用不同的函数库。
例如:
libdbm库中组包含了对数据库文件进行访问的dbm函数,需要对数据库进行操作的程序就会与该库进行连接。
数学应用程序将使用数学库libm,X-Windows应用程序将使用Xlib库,libX11。
另外,所有的程序都将使用标准的C函数库。
libc,该库中包含了诸好内存管理或输入输出操作的基本函数,这些库都存放在/usr/lib这些系统公用的目录中,系统中的任何用户都可以利用这些库。
当然用户也可以建立自己专用的库函数,供自己或其它指定的人员使用。
库可以有三种使用的形式:
静态、共享和动态。
静态库的代码在编译时就已连接到开发人员开发的应用程序中,而共享库只是在程序开始运行时才载入,在编译时,只是简单地指定需要使用的库函数。
动态库则是共享库的另一种变化形式。
动态库也是在程序运行时载入,但与共享库不同的是,使用的库函数不是在程序运行开始,而是在程序中的语句需要使用该函数时才载入。
动态库可以在程序运行期间释放动态库所占用的内存,腾出空间供其它程序使用。
由于共享库和动态库并没有在程序中包括库函数的内容,只是包含了对库函数的引用,因此代码的规模比较小。
Crypto++库在VS2010中的使用——RSA加解密
一.下载Crypto++Library
Crypto++Library的官方网:
二.建立自己使用的Crypto++Library
由于从官方网下载的Crypto++库是开源的,只有源文件和几个可以生成lib、dll的工程,以及一个使用的例子工程,因此希望生成自己建的工程能使用的SDK。
1.编译链接生成cryptlib.lib
打开cryptest.sln,分别在Debug模式和Release模式(Release称为发布版本,它往往是进行了各种优化,使得程序在代码大小和运行速度上都是最优的,以便用户很好地使用。
)下编译链接cryptlib工程,成功后会在cryptopp54\Win32\output\debug和cryptopp54\Win32\output\release下生成cryptlib.lib文件。
我现在用的是Crypto++5.6.2版本。
Build时方法是,右击SolutionExplorer中的cryptlib工程,单击build。
第一次时它会报错说“d:
\cryptopp54\adler32.cpp(3):
fatalerrorC1033:
cannotopenprogramdatabase'
d:
\cryptopp54\win32\cryptlib\debug\vc80.idb'
”,没关系,按这样再build一次,就可以build成功了。
2.建立Crypto++SDK
在D:
\ProgramFiles\visual_studio\visual_studio-2010中新建文件夹,取名“CryptoPP”,里面新建文件夹“include”、“lib”,在“lib”中新建文件夹“debug”、“release”。
将Crypto++库中的所有头文件复制到“include”文件夹中,再将上面生成的两个cryptlib.lib分别复制到“debug”和“release”中。
三.RSA加解密
1.
在VS2010中新建Win32ConsoleApplication工程,建立空的工程。
完成后新建文件main.cpp,里面源码如下:
//RSATest.cpp:
定义控制台应用程序的入口点。
//
#include"
stdafx.h"
randpool.h"
#include"
rsa.h"
hex.h"
files.h"
stdlib.h"
#include<
//这个是我们刚才建立Crypto++SDK
//这个是我们刚才编译链接生成cryptlib.lib
#pragmacomment(lib,"
cryptlib.lib"
)
//------------------------
//函数声明
//生成RSA密钥对的函数声明
voidGenerateRSAKey(unsignedintkeyLength,constchar*privFilename,constchar*pubFilename,constchar*seed);
//RSA加密函数
stringRSAEncryptString(constchar*pubFilename,constchar*seed,constchar*message);
//RSA解密函数
stringRSADecryptString(constchar*privFilename,constchar*ciphertext);
//全局随机数池
RandomPool&
GlobalRNG();
//主程序
voidmain()
charpriKey[128]={0};
charpubKey[128]={0};
charseed[1024]={0};
//生成RSA密钥对
strcpy(priKey,"
pri"
);
//生成的私钥文件
strcpy(pubKey,"
pub"
//生成的公钥文件
strcpy(seed,"
seed"
//生成种子文件
GenerateRSAKey(1024,priKey,pubKey,seed);
//RSA加解密
charmessage[1024]={0};
cout<
"
OriginText(原文):
\t"
HelloCrypto++!
endl<
endl;
strcpy(message,"
stringencryptedText=RSAEncryptString(pubKey,seed,message);
//RSA加密
EncryptedText(密文):
encryptedText<
stringdecryptedText=RSADecryptString(priKey,encryptedText.c_str());
//RSA解密
DecryptedText(解密后文本):
decryptedText<
//防止dos对话框立即自动关闭
system("
pause"
//生成RSA密钥对
voidGenerateRSAKey(unsignedintkeyLength,constchar*privFilename,constchar*pubFilename,constchar*seed)
RandomPoolrandPool;
randPool.Put((byte*)seed,strlen(seed));
RSAES_OAEP_SHA_Decryptorpriv(randPool,keyLength);
HexEncoderprivFile(newFileSink(privFilename));
priv.DEREncode(privFile);
privFile.MessageEnd();
RSAES_OAEP_SHA_Encryptorpub(priv);
HexEncoderpubFile(newFileSink(pubFilename));
pub.DEREncode(pubFile);
pubFile.MessageEnd();
//RSA加密
stringRSAEncryptString(constchar*pubFilename,constchar*seed,constchar*message)
FileSourcepubFile(pubFilename,true,newHexDecoder);
RSAES_OAEP_SHA_Encryptorpub(pubFile);
/*strlen所作的仅仅是一个计数器的工作,它从内存的某个位置(可以是字符串开头,
中间某个位置,甚至是某个不确定的内存区域)开始扫描,直到碰到第一个字符串结束符'
\0'
为止,然后返回计数器值。
*/
//1.首先声明一个字符串来存放编码的结果
stringresult;
//2.接着声明一个编码器对象,并通过StringSink类关联两者
StringSource(message,true,newPK_EncryptorFilter(randPool,pub,newHexEncoder(newStringSink(result))));
returnresult;
//RSA解密
stringRSADecryptString(constchar*privFilename,constchar*ciphertext)
FileSourceprivFile(privFilename,true,newHexDecoder);
RSAES_OAEP_SHA_Decryptorpriv(privFile);
StringSource(ciphertext,true,newHexDecoder(newPK_DecryptorFilter(GlobalRNG(),priv,newStringSink(result))));
//定义全局的随机数池
GlobalRNG()
staticRandomPoolrandomPool;
returnrandomPool;
2.设置工程属性
选择工程属性(Alt+F7):
(1)“ConfigurationProperties”→“C/C++”→“General”,右边的“AdditionalIncludeDirectories”设置为上面建好的Crypto++SDK的Include文件夹,“C:
\ProgramFiles\CyptoPP\include”;
(2)“ConfigurationProperties”→“Linker”→“General”,右边的“AdditionalLibraryDirectories”设置为上面建好的Crypto++SDK的Lib\Debug文件夹,“C:
\ProgramFiles\CyptoPP\lib\debug”(Release模式下对应着Release文件夹);
(3)“ConfigurationProperties”→“C/C++”→“CodeGeneration”(代码生成),右边的“RuntimeLibrary”设置为“Multi-threadedDebug(/MTd)”(Release模式下对应着“Multi-threaded(/MT)”)
3.运行程序(Ctrl+F5)
正常运行的输出结果为:
如果上面的第(3)步没有设置则会出现以下链接错误:
cryptlib.lib(randpool.obj):
errorLNK2005:
public:
__thiscallstd:
basic_string<
char,structstd:
char_traits<
char>
classstd:
allocator<
>
(charconst*)"
(?
?
0?
$basic_string@DU?
$char_traits@D@std@@V?
$allocator@D@2@@std@@QAE@PBD@Z)alreadydefinedinmsvcprtd.lib(MSVCP80D.dll)
说在msvcprtd.lib和MSVCRTD.lib中已经定义过。
Crypto++使用经验总结:
Crypto++是一套关于应用密码学的类库,提供了散列(MD5、SHA)、数据加密(DES、AES)、数字签名(RSA、椭圆曲线签名算法ECDSA)等很多有用的算法,算法安全性已经通过FIPS140-2(http:
//csrc.nist.gov/cryptval/140-2.htm)验证。