我最早接触这个库的时候,是因为手头上有项目需要AES-256,而搜索可以使用的AES-256的类搜的我头昏脑涨。最后在国外网站上面看到有Crypto++这样的一个密码算法库, 但限于当时水平有限,下载下来并不会使用。不过过了一段时间之后,通过自己琢磨和CSDN上的文章(http://blog.csdn.net /pepper/article/details/117514)的帮助,我终于明白了如何使用这个库。在使用过程中我也解决了一些问题,一并在这里写出 来供大家参考。
什么是Crypto++
Crypto++是一个强大的密码学库,使用C++语言编写,而且使用起来是免费的。Crypto++官网为http://www.cryptopp.com/,截止至本文写作时,最新版的为5.62版。
5.62版本支持的密码学算法如下(摘自其官网):
algorithm type |
name |
authenticated encryption schemes |
GCM, CCM, EAX |
high speed stream ciphers |
Panama, Sosemanuk, Salsa20, XSalsa20 |
AES and AES candidates |
AES (Rijndael), RC6, MARS, Twofish, Serpent, CAST-256 |
other block ciphers |
IDEA, Triple-DES (DES-EDE2 and DES-EDE3), Camellia, SEED, RC5, Blowfish, TEA, XTEA, Skipjack, SHACAL-2 |
block cipher modes of operation |
ECB, CBC, CBC ciphertext stealing (CTS), CFB, OFB, counter mode (CTR) |
message authentication codes |
VMAC, HMAC, GMAC (GCM), CMAC, CBC-MAC, DMAC, Two-Track-MAC |
hash functions |
SHA-1, SHA-2 (SHA-224, SHA-256, SHA-384, and SHA-512), SHA-3, Tiger, WHIRLPOOL, RIPEMD-128, RIPEMD-256, RIPEMD-160, RIPEMD-320 |
public-key cryptography |
RSA, DSA, ElGamal, Nyberg-Rueppel (NR), Rabin-Williams (RW), LUC, LUCELG, DLIES (variants of DHAES), ESIGN |
padding schemes for public-key systems |
PKCS#1 v2.0, OAEP, PSS, PSSR, IEEE P1363 EMSA2 and EMSA5 |
key agreement schemes |
Diffie-Hellman (DH), Unified Diffie-Hellman (DH2), Menezes-Qu-Vanstone (MQV), LUCDIF, XTR-DH |
elliptic curve cryptography |
ECDSA, ECNR, ECIES, ECDH, ECMQV |
insecure or obsolescent algorithms retained for backwards compatibility and historical value |
MD2, MD4, MD5, Panama Hash, DES, ARC4, SEAL 3.0, WAKE-OFB, DESX (DES-XEX3), RC2, SAFER, 3-WAY, GOST, SHARK, CAST-128, Square |
Crypto++ 5.62下载地址为:http://www.cryptopp.com/cryptopp562.zip。
为什么选择Crypto++
著名的密码学算法库还有OpenSSL(http://www.openssl.org)。OpenSSL为网络通信提供安全及数据完整性的一种安 全协议,囊括了主要的密码算法、常用的密钥和证书封装管理功能以及SSL协议,并提供了丰富的应用程序供测试或其它目的使用。值得注意的 是,OpenSSL采用C语言作为开发语言。下面将其支持的密码算法列举如下:
来源http://www.openssl.org/docs/crypto/crypto.html
algorithm type |
name |
SYMMETRIC CIPHERS | blowfish, cast, des, idea, rc2, rc4, rc5 |
PUBLIC KEY CRYPTOGRAPHY AND KEY AGREEMENT | dsa, dh, rsa |
CERTIFICATES |
x509, x509v3 |
AUTHENTICATION CODES, HASH FUNCTIONS | hmac, md2, md4, md5, mdc2, ripemd, sha |
AUXILIARY FUNCTIONS |
err, threads, rand, OPENSSL_VERSION_NUMBER |
INPUT/OUTPUT, DATA ENCODING | asn1, bio, evp, pem, pkcs7, pkcs12 |
INTERNAL FUNCTIONS |
bn, buffer, lhash, objects, stack, txt_db |
通过对比可以发现,OpenSSL支持的东西较Crypto++相对较少(但我估计上表不全,因为能够查到用OpenSSL写AES的程序,而上表 中没有列出。作者注)。对于一些算法,比如MD5和SHA-1,已经被王小云教授破解。2004年8月17日的美国加州圣巴巴拉的国际密码学会议 (Crypto’2004)上,来自中国山东大学的王小云教授做了破译MD5、HAVAL-128、 MD4和RIPEMD算法的报告,公布了MD系列算法的破解结果。2005年2月,王小云教授又破解了另一国际密码SHA-1。换句话说,王小云的研究成 果表明了从理论上讲电子签名可以伪造,必须及时添加限制条件,或者重新选用更为安全的密码标准,以保证电子商务的安全。2009年,冯登国、谢涛二人利用 差分攻击,将MD5的碰撞算法复杂度从王小云的2^42进一步降低到2^21,极端情况下甚至可以降低至2^10。仅仅2^21的复杂度意味着即便是在 2008年的计算机上,也只要几秒便可以找到一对碰撞。(作者曾经与王教授有过短暂交流,当时的心情是相当激动的。)
据此,我们在实际使用过程中,尽量不要去使用MD5和SHA-1,而是过渡到SHA-2之上,因为这个在理论上面还是安全的。作为学习信息安全的我们,应该有这样的意识。
通过上述分析,我在平时的软件开发之中选择了Crypto++。
Crypto++对使用者有什么要求
在我看来,Crypto++的使用者,应该具有基础的密码学知识,并且对其想要实现的算法做过了解,明白算法大体上是什么样的。在语言方面, Crypto++的使用者应该对C++有着一定的了解,因为这个库是按着C++标准来开发的,有一些模板等知识需要掌握。如果对后一条标准,想要提出一个 大概的水平划分,我想应该是使用者能够独立编写较为复杂的Win32控制台程序或者MFC程序。
转自:http://blog.csdn.net/interwish/article/details/8741303