我最早接觸這個庫的時候,是因為手頭上有項目需要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