一个简单的使用EVP框架的加密过程

转自 http://blog.csdn.net/njzhujinhua/article/details/6532896

  1.     const EVP_CIPHER *cipher;  
  2.     unsigned char        key[24],iv[8],in[100],out[108],de[100];  
  3.     int          i,len,inl,outl,total=0;  
  4.     
  5.     EVP_CIPHER_CTX             ctx;  
  6. //此init做的仅是将ctx内存 memset为0  
  7.     EVP_CIPHER_CTX_init(&ctx);  
  8.    
  9.     cipher  = EVP_aes_128_ecb();  
  10. //原型为int EVP_EncryptInit_ex(EVP_CIPHER_CTX *ctx,const EVP_CIPHER *cipher, ENGINE *impl, const unsigned char *key, const unsigned char *iv)   
  11. //另外对于ecb电子密码本模式来说,各分组独立加解密,前后没有关系,也用不着iv  
  12.     EVP_EncryptInit_ex(&ctx, cipher, NULL, key, iv);  
  13.    
  14.     inl=50;  
  15.       
  16.     len=0;  
  17.       
  18.     EVP_EncryptUpdate(&ctx,out+len,&outl,in,inl);  
  19. //这个EVP_EncryptUpdate的实现实际就是将in按照inl的长度去加密,实现会取得该cipher的块大小(对aes_128来说是16字节)并将block-size的整数倍去加密。如果输入为50字节,则此处仅加密48字节,outl也为48字节。输入in中的最后两字节拷贝到ctx->buf缓存起来。  
  20. //对于inl为block_size整数倍的情形,且ctx->buf并没有以前遗留的数据时则直接加解密操作,省去很多后续工作。  
  21.     len+=outl;  
  22.       
  23.      EVP_EncryptUpdate(&ctx,out+len,&outl,in+50,inl);  
  24. //同样的函数,但是先检查ctx->buf中有数据,则将in拷贝到buf之后,并进行同样的加解密操作(调用该cipher的do_cipher实现)。  
  25.        
  26.     len+=outl;  
  27.       
  28.     EVP_EncryptFinal_ex(&ctx,out+len,&outl);  
  29.     //对于如本例所述,第一次除了了48字节余两字节,第二次处理了第一次余下的2字节及46字节,余下了输入100字节中的最后4字节。此处进行处理。如果不支持pading,且还有数据的话就出错,否则,将block_size-待处理字节数个数个字节设置为此个数的值,如block_size=16,数据长度为4,则将后面的12字节设置为16-4=12,补齐为一个分组后加密  
  30. 对于前面为整分组时,如输入数据为16字节,最后再调用此Final时,不过是对16个0进行加密,此密文不用即可,也根本用不着调一下这Final。  
  31.     len+=outl;  
  32.       
  33.     EVP_CIPHER_CTX_cleanup(&ctx);  
  34. //ctx上下文清理  

综上仅对16及16字节倍数长度的输入加密时,只要Update就足够了,非要用Final的时候记得输出缓冲区大一点,超过输入长度的输出不用就行...


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值