//CBC模式要求是块大小的倍数,末尾可以pad上自己的消息,前面简单置零,所以可以正常写文件
while(!feof(fileCipherText)){ memset(pt,0,sizeof(pt)); memset(ct,0,sizeof(ct));
len = fread(ct,sizeof(ct[0]),16,fileCipherText); if(len < 1)//没有读成功 break; //解密
error = cbc_decrypt(ct,pt,16,&cbcAES); if(error != CRYPT_OK){
printf(_T(“cbc_decrypt error:%s”),error_to_string(error)); break; }
fwrite(pt,sizeof(pt[0]),16,decryptFile); }
//关闭文件
fclose(fileCipherText); fclose(decryptFile); //完成流加解密 cbc_done(&cbcAES); //end 解密流程
//////////////////////////////////////////////////////////////////////// EndOfCrypt:
//注销加解密器
error = unregister_cipher(&aes_desc); if(error != CRYPT_OK){
printf(_T(“unregister_cipher(&aes_desc) error:%s”),error_to_string(error)); return (-1); } return 0; }
最后,aes和rijndael是同义词,在ECB加解密中用哪个都一样,看tomcrypt_cipher.h文件: #define aes_ecb_encrypt rijndael_ecb_encrypt
区别是find_cipher返回这两个名字的索引不一样;另外,用register_cipher函数注册aes_desc时,还有一个aes_enc_desc可能会让人迷惑,其实这个aes_enc_desc如其名,只用于加密,其cipher_descriptor中的解密函数指针是空的,这个在其他加密算法会用到。
我本来想在FreeBSD下也做个编译,但VB一只装不上8.2,下次讲椭圆曲线加解密的时候再弄了。