分类: C/C++
2008-08-24 11:53:10
Crypto++首页上提供了Crypto++ User Guide这个入门指南的链接,这本指南属于一定要看的资料,不过可惜的是这也是找到的唯一一本指南了:(。User Guide上面的有一些例子,其中对AES用法的说明不太直接,而AES之类对称加密算法又比较常用,所以我这里写了一个AES的例子。
例子是直接用AES加密一个块,AES的数据块大小为128位,密钥长度可选择128位、192位或256位。直接用AES加密一个块很少用,因为我们平常都是加密任意长度的数据,需要选择CFB等加密模式。但是直接的块加密是对称加密的基础。
#include #include int main() //AES中使用的固定参数是以类AES中定义的enum数据类型出现的,而不是成员函数或变量 cout << "AES Parameters: " << endl; //Crypto++库中一般用字节数来表示长度,而不是常用的字节数 //AES中只包含一些固定的数据,而加密解密的功能由AESEncryption和AESDecryption来完成
unsigned char aesKey[AES::DEFAULT_KEYLENGTH]; //密钥 unsigned char inBlock[AES::BLOCKSIZE] = "123456789"; //要加密的数据块 unsigned char outBlock[AES::BLOCKSIZE]; //加密后的密文块 unsigned char xorBlock[AES::BLOCKSIZE]; //必须设定为全零 memset( xorBlock, 0, AES::BLOCKSIZE ); //置零
aesEncryptor.SetKey( aesKey, AES::DEFAULT_KEYLENGTH ); //设定加密密钥 aesEncryptor.ProcessAndXorBlock( inBlock, xorBlock, outBlock ); //加密
//以16进制显示加密后的数据 for( int i=0; i<16; i++ ) { cout << hex << (int)outBlock[i] << " "; } cout << endl;
//解密 AESDecryption aesDecryptor; unsigned char plainText[AES::BLOCKSIZE]; aesDecryptor.SetKey( aesKey, AES::DEFAULT_KEYLENGTH ); aesDecryptor.ProcessAndXorBlock( outBlock, xorBlock, plainText );
for( int i=0; i<16; i++ ) { cout << plainText[i]; } |
这里面有几个地方要注意一下:
AES并不是一个类,而是类Rijndael的一个typedef。
Rijndael虽然是一个类,但是其用法和namespace很像,本身没有什么成员函数和成员变量,只是在类体里面定义了一系列的类和数据类型(enum),真正能够进行加密解密的AESEncryption和AESDecryption都是定义在这个类内部的类。
AESEncryption和AESDecryption除了可以用SetKey()这个函数设置密钥,在构造函数中也能设置密钥,参数和SetKey()是一样的。
ProcessAndXorBlock()可能会让人比较疑惑,函数名的意思是ProcessBlock and XorBlock,ProcessBlock就是对块进行加密或解密,XorBlock在各种加密模式中有用,这里我们不需要应用模式,因此把用来Xor操作的xorBlock置为0,那么Xor操作就不起作用了。
发表于 @ 2004年09月26日 22:34:00|评论(6 )|编辑
评论
如果有的话,能否给我发一份,我的email:huanghongbo@gmail.com
多谢了
CryptDLLTest.exe 中的 0x77e8bc3f 处未处理的异常: Microsoft C++ exception: CryptoPP::SelfTestFailure @ 0x0012f250 。