【VC++开源代码栏目提醒】:网学会员为需要VC++开源代码的朋友们搜集整理了Crypt++中文详解 - 讲义教程相关资料,希望对各位网友有所帮助!
Crypto入门0 - 安装Crypto是一个 C编写的密码学类库。
读过《过河卒》的朋友还记得作者的那个不愿意去微软工作的儿子吗,就是 Crypto的作者 Wei Dai。
Crypto是一个非常强大的密码学库,在密码学界很受欢迎,最初还是 RivestRSA 的 R门下的一个博士姐姐把这个库介绍给我的。
虽然网络上可以找到很多密码学相关的
代码和库,但是 Crypto有其明显的优点。
主要是功能全,统一性好。
例如椭圆曲线加密算法和 AES 在 而OpenSSL 的 crypto 库中就还没最终完成, 在 Crypto中就支持的比较好。
基本上密码学中需要的主要功能都可以在里面找得到。
Crypto是由标准的 C写成的,学习 C、密码学、网络安全都可以通过阅读 Crypto的源
代码得到启发和提高。
Crypto的安装首先到 www.cryptopp.com 上下载最新版本的源
代码,如果是 windows 版的,会得到一个
VC的项目,直接用
VC 打开就可以编译了。
这里建议大家使用最新版的 C编译器,因为诸如
VC6的编译器是不支持 C的标准的,很多符合 C标准的
代码不能编译通过。
编译的时间比较长,完成后会生成 cryptlib.lib 这个库文件。
可以将 Crypto源文件的目录命名为 cryptopp,拷贝到编译器的 include 目录(例如:C:VS.NETVC7include),将 cryptlib.lib 文件拷贝到编译器的 lib 目录。
这样我们只需要说明链接 cryptlib.lib 即可。
例如在
VC7 中在项目-gt属性-gt链接器-gt命令行-gt附加选项中添加“cryptlib.lib” 。
Hello World现在写一个 hello world 程序看看能不能编译通过。
include ltiostreamgtusing namespace stdinclude ltcryptopp/aes.hgtusing namespace CryptoPPint main cout ltlt quothello cryptoquot ltlt endl cout ltlt quotAes block size is quot ltlt AES::BLOCKSIZE ltlt endl return 0编译运行,一切 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 文件,可以用 WIN32 API 函数 LoadLibrary、GetProcAddress。
事实 我们可以在 Visual C上, 大多情况下会看到 ASCII IDE 中以二进制形式打开 lib 文件,码格式的 C函数或一些重载操作的函数名字。
一般我们最主要的关于 lib 文件的麻烦就是出现 unresolved symble 这类错误,这就是lib 文件连接错误或者没有包含.c、.cpp 文件到工程里,关键是如果在 C工程里用了 C 语言写的 lib 文件,就必需要这样包含: extern quotCquot include quotmyheader.hquot C 这是因为 C 语言写的 lib 文件没有 C所必须的名字破坏, 函数不能被重载,因此连接器会出错 C 语言中有一些函数不需要进行编译,有一些函数也可以在多个文件中使用。
一般来说,这些函数都会执行一些标准任务,如数据库输入/输出操作或屏幕控制等。
可以事先对这些函数进行编译,然后将它们放置在一些特殊的目标
代码文件中,这些目标
代码文件就称为库。
库文件中的函数可以通过连接程序与应用程序进行连接。
这样就不必在每次开发程序时都对这些通用的函数进行编译了。
不同类型的应用程序将会使用不同的函数库。
例如:libdbm 库中组包含了对数据库文件进行访问的 dbm 函数,需要对数据库进行操作的程序就会与该库进行连接。
数学应用程序将使用数学库 libm,X-Windows 应用程序将使用 Xlib 库,libX11。
另外,所有的程序都将使用标准的 C 函数库。
libc,该库中包含了诸好内存管理或输入输出操作的基本函数,这些库都存放在/usr/lib 这些系统公用的目录中,系统中的任何用户都可以利用这些库。
当然用户也可以建立自己专用的库函数,供自己或其它指定的人员使用。
库可以有三种使用的形式:静态、共享和动态。
静态库的
代码在编译时就已连接到开发人员开发的应用程序中,而共享库只是在程序开始运行时才载入,在编译时,只是简单地指定需要使用的库函数。
动态库则是共享库的另一种变化形式。
动态库也是在程序运行时载入,但与共享库不同的是,使用的库函数不是在程序运行开始,而是在程序中的语句需要使用该函数时才载入。
动态库可以在程序运行期间释放动态库所占用的内存,腾出空间供其它程序使用。
由于共享库和动态库并没有在程序中包括库函数的内容,只是包含了对库函数的引用,因此
代码的规模比较小。
Crypto库在 VS 2005 中的使用——RSA 加解密一. 下载 Crypto LibraryCrypto Library 的官方网:http://www.cryptopp.com/二. 建立自己使用的 Crypto Library由于从官方网下载的 Crypto库是
开源的,只有源文件和几个可以生成 lib、dll 的工程,以及一个使用的例子工程,因此希望生成自己建的工程能使用的 SDK。
1. 编译链接生成 cryptlib.lib打开 cryptest.sln,分别在 Debug 模式和 Release 模式下编译链接 cryptlib 工程,成功后会 在 cryptopp54Win32outputdebug 和 cryptopp54Win32outputrelease 下 生 成cryptlib.lib 文件。
作者当时用的是 Crypto 5.4 版本。
Build 时方法是,右击 Solution Explorer 中的 cryptlib 工程,单击 build。
第一次时它会报 错 说 “ d:cryptopp54adler32.cpp3 : fatal error C1033: cannot open programdatabase d:cryptopp54win32cryptlibdebugvc80.idb” ,没关系,按这样再 build一次,就可以 build 成功了。
2. 建立 Crypto SDK 取名 ,在 C:Program Files中新建文件夹, “CryptoPP” 里面新建文件夹 “include”“lib” 、 ,在“lib”中新建文件夹 、“ 。
“debug” release” 将 Crypto库中的所有头文件复制到“include”文件夹中,再将上面生成的两个 cryptlib.lib 分别复制到“debug”和“release”中。
三. RSA 加解密1. 建立空的工程。
在 VS 2005 中新建 Win32 Console Application 工程, 完成后新建文件 main.cpp,里面源码如下:include quotrandpool.hquotinclude quotrsa.hquotinclude quothex.hquotinclude quotfiles.hquotinclude ltiostreamgtusing namespace stdusing namespace CryptoPPpragma commentlib quotcryptlib.libquot//------------------------// 函数声明//------------------------void GenerateRSAKeyunsigned int keyLength const char privFilename const charpubFilename const char seedstring RSAEncryptStringconst char pubFilename const char seed const charmessagestring RSADecryptStringconst char privFilename const char ciphertextRandomPool amp GlobalRNG//------------------------// 主程序//------------------------void main char priKey128 0 char pubKey128 0 char seed1024 0 // 生成 RSA 密钥对 strcpypriKey quotpriquot // 生成的私钥文件 strcpypubKey quotpubquot // 生成的公钥文件 strcpyseed quotseedquot GenerateRSAKey1024 priKey pubKey seed // RSA 加解密 char message1024 0 coutltltquotOrigin Text:tquotltltquotHello Worldquotltltendlltltendl strcpymessage quotHello Worldquot string encryptedText RSAEncryptStringpubKey seed message // RSA 加密 coutltltquotEncrypted Text:tquotltltencryptedTextltltendlltltendl string decryptedText RSADecryptStringpriKey encryptedText.c_str // RSA解密 coutltltquotDecrypted Text:tquotltltdecryptedTextltltendlltltendl//------------------------// 生成 RSA 密钥对//------------------------void GenerateRSAKeyunsigned int keyLength const char privFilename const charpubFilename const char seed RandomPool randPool randPool.Putbyte seed strlenseed RSAES_OAEP_SHA_Decryptor privrandPool keyLength HexEncoder privFilenew FileSinkprivFilename priv.DEREncodeprivFile privFile.MessageEnd RSAES_OAEP_SHA_Encryptor pubpriv HexEncoder pubFilenew FileSinkpubFilename pub.DEREncodepubFile pubFile.MessageEnd//------------------------// RSA 加密//------------------------string RSAEncryptStringconst char pubFilename const char seed const charmessage FileSource pubFilepubFilename true new HexDecoder RSAES_OAEP_SHA_Encryptor pubpubFile RandomPool randPool randPool.Putbyte seed strlenseed string result StringSourcemessage true new PK_EncryptorFilterrandPool pub newHexEncodernew StringSinkresult return result//------------------------// RSA 解密//------------------------string RSADecryptStringconst char privFilename const char ciphertext FileSource privFileprivFilename true new HexDecoder RSAES_OAEP_SHA_Decryptor privprivFile string result StringSourceciphertext true new HexDecodernewPK_DecryptorFilterGlobalRNG priv new StringSinkresult return result//------------------------// 定义全局的随机数池//------------------------RandomPool amp GlobalRNG static RandomPool randomPool return randomPool2. 设置工程属性 :选择工程属性(Alt F7)1“Configuration Properties”→“C/C” →“General” ,右边的 “Additional Include “Directories ” 设 置 为 上 面 建 好 的 Crypto SDK 的 Include 文 件 夹 , C:Program ;FilesCyptoPPinclude” →2 “Configuration Properties” “Linker” → , 边 “General” 右 的 “Additional Library “Directories ” 设 置 为 上 面 建 好 的 Crypto SDK 的 LibDebug 文 件 夹 , C:ProgramFilesCyptoPPlibdebug” ; (Release 模式下对应着 Release 文件夹)3 “Configuration Properties”→“C/C” →“Code Generation”,右边的“Runtime (Release 模式下对应着“Multi-threadedLibrary”设置为 “Multi-threaded Debug /MTd” )/MT”3. 运行程序Ctrl F5正常运行的输出结果为:Origin Text: Hello WorldEncrypted Text: 79C72A482482EF45111F961772456310792AB735ECF72329ECB26292D2B26374824E0E35D24A63CB03B867DD2C70B001FD4B2B33FBC984BD229A5226F284B889901817976A6803229E8351372C5E28E8BEBA2A94E7CF61A8A162F0BA2F3E0C35D26842D92EC4866D25E6BF878743E48184D9F6FF9BA690F953568D017C02D540Decrypted Text: Hello World如果上面的第3步没有设置则会出现以下链接错误:cryptlib.librandpool.obj : error LNK2005: quotpublic: __thiscallstd::basic_stringltcharstruct std::char_traitsltchargtclassstd::allocatorltchargt gt::basic_stringltcharstruct std::char_traitsltchargtclassstd::allocatorltchargt gtchar const quot0basic_stringDUchar_traitsDstdVallocatorD2stdQAEPBDZalready defined in msvcprtd.libMSVCP80D.dll说在 msvcprtd.lib 和 MSVCRTD.lib 中已经定义过。
Crypto使用经验总结Crypto使用经验总结 、数据加密(DES、AES)Crypto是一套关于应用密码学的类库,提供了散列(MD5、SHA) 、数字签名(RSA、椭圆曲线签名算法 ECDSA)等很多有用的算法,算法安全性已经通过 FIPS140-2(http://csrc.nist.gov/cryptval/140-2.htm) 验证。
下面是一些使用中的总结:一、将一个缓冲区编码1.首先声明一个字符串来存放编码的结果string str2. 接 着 声 明 一 个 编 码 器 ( HexEncoder 可 替 换 为 Base64Encoder 等 ) 对 象 , 并 通 过StringSink 类关联两者HexEncoder encodernew StringSinkstr3.将数据放入编码器中byte buf1024...encoder.Putbuf sizeofbufSetDlgItemTextIDC_EDIT_TEST spk.data4.调用 MessageEnd 函数结束编码encoder.MessageEnd 二 、 BufferedTransformation 、 BlockTransformation 、 StreamTransformation 、HashTransformation这几个类都是对输入的缓冲区进行某种运算后输出,但是有一些差别1.BufferedTransformation:是对缓冲区进行某种变换,这种变换式可以还原的2.BlockTransformation:基本与 BufferedTransformation 相同,不同之处在于它是以块为单位3.StreamTransformation:与 BufferedTransformation 差不多相同,不同之处在于是以流式方式,如网络套结字4.HashTransformation:是对缓冲区计算哈希值,这种变换是不可还原的三、Sink 类及其派生类的作用Sink 类及其派生类,以下简称 Sink 类,它们的作用是在真实的数据和缓冲区变换类之间起 但是不能产生任何输入输出,一个连接的作用,Sink 类由 BufferedTransformation 派生,所有对它的操作都是对它所指向的数据的操作。
每个 Sink 类必须与一个正式的数据关联起来。
1.ArraySink:操作字节数据2.StringSink:操作字符串数据3.ArrayXorSink:操作字节数据,但是会对缓冲区进行异或运算4.FileSink:操作文件四、SecByteBlock 和 ByteQueue两个类都描述了一个字节为单位的缓冲区,所不同的是 SecByteBlock 所分配的缓冲区时连续的,而 ByteQueue 则是用链表实现的1.使用 SecBlock 类可以动态分配指定字节数的内容,并在类析构时自动释放,而且可以作为指定类的指针使用,有些方面类似于 auto_ptr五、椭圆曲线加密ECIES、签名ECDSA算法1.ECIES构造方法AutoSeededRandomPool rng// 随机数产生器ECIES::Decryptor cprivrng ASN1::sect193r1// 私钥,自己保留ECIES::Encryptor cpubcpriv// 公钥,提供给用户注意:椭圆曲线加密算法是拥有公钥的人将数据加密后,密文发送给自己,自己来解密,所以不适用于注册码的生成2.ECDSA ,参数可从以下网以下描述一个自定义的椭圆曲线的构造过程(以 GFp上的椭圆曲线为例)址得到 http://www.cryptomathic.dk/labs/ellipticcurvedemo.html//Integer modulusquot3082581144187569quot// a、b 为椭圆曲线参数Integer aquot659942b7261b249174c86bd5e2a65b45fe0737d110hquotInteger bquot3ece7d09473d6660005baef5d4e00e30159d2df49ahquot// 计算基点 G 的两个参数 x、yInteger xquot25dd614c066781abc0fe6c84fefaa3858ca696d0e8hquotInteger yquot4e247705aab0b3497fd62b5e78a5314467296c3fachquotInteger rquot100000000000000000000000000000000000000000000000151quotInteger k2// 私有密钥Integer dquot765729449256706362097909124274939712345quot// 椭圆曲线ECP ecmodulus a b// P 为基点 GECP::Point Px y// 计算基点 GP ec.Multiplyk P// Q 为公开密钥ECP::Point Qec.Multiplyd PECIES::Decryptor cprivec P r dECIES::Encryptor cpubcprivECDSA::Signer sprivcprivECDSA::Verifier spubsprivECDH::Domain ecdhcec P r kECMQV::Domain ecmqvcec P r k3.椭圆曲线上的点的阶Order of point椭圆曲线的签名的长度是由基点 P 的阶的长度决定的,和素数的长度无关。
所以椭圆曲线可以选取素数较大的类型。
4.椭圆曲线的密钥私钥是一个大数,而公钥则是一个点密码类库 Cryptoamp8482 Library 5.1 的研究与应用密码类库 Crypto Library 5.1 的研究与应用摘要引言在计算机被广泛应用的信息时代,信息本身就是时间,就是财富。
大量信息用数据形式存放在计算机系统里。
信息的传输则通过公共信道。
这些计算机系统和公共信道是不设防的,是很脆弱的,容易受到攻击和破坏,信息的丢失不容易被发现,而且后果是极其严重。
如何保护信息的安全已不仅仅是军事和政府部门感兴趣的问题,其他企事业单位也愈感迫切。
因为在网络化的今天,计算机犯罪每年使他们遭受的损失极其巨大,而且还在发展中。
密码是有效而且可行的保护信息安全的办法。
随着计算机网络不断渗透到各个领域,密码学的应用也随着扩大。
数字签名、身份鉴别、等都是由密码学派生出来的新技术和应用。
目前开放源
代码的加密库中, 目前的最高版本为 Crypto Library 5.1, 密码类库 Crypto是比较流行的,它实现了各种公开密钥算法、对称加密算法、数字签名算法、信息摘要算法以及其相关的其 Crypto Library 5.1 几乎包括了目前所有安全算法库,它算法等等, 对密码类库 CryptoLibrary 5.1 的研究与应用对计算机网络安全的研究与发展有重大的实际意义。
(一)Crypto Library 5.1 要求的密码知识Crypto Library 5.1 要求什么样的密码知识基础呢,很多初学者都想知道这个问题。
然而当你提出一个基础的问题在别处找到答案,你会发现这对你没有多大用处,因为越来越多熟练使用这个类库包的人不仅仅是考虑挑战安全问题。
如果你已经达到这一点,该密码库的建立是假设你对密码术语已经有一定的了解的基础上的,你可以进行一些比较基础的研究,到那时你会发现即使在最有利的情况下建立一个安全体系也是很困难的。
如果你可以克服这些困难去研究这方面知识,你可以从一些网站获得比较专业的帮助。
Crypto库包含有大量的算法,但是它们对用户来说并不总是显而易见的,下面推荐一些算法,因为这些算法不但用得很广,而且被公认比较安全的,并且是免费的。
1、 分组密码:DES-EDE3 Blowfish Rijndael2、 序列密码:3、 Hash 函数:SHA14.
上一篇:
qt培训资料
下一篇:
关于大学英语教学