1. 程式人生 > >一個簡單的使用EVP框架的加密過程

一個簡單的使用EVP框架的加密過程

  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.     EVP_CIPHER_CTX             ctx;  
  5. //此init做的僅是將ctx記憶體 memset為0
  6.     EVP_CIPHER_CTX_init(&ctx);  
  7.     cipher  = EVP_aes_128_ecb();  
  8. //原型為int EVP_EncryptInit_ex(EVP_CIPHER_CTX *ctx,const EVP_CIPHER *cipher, ENGINE *impl, const unsigned char *key, const unsigned char *iv) 
  9. //另外對於ecb電子密碼本模式來說,各分組獨立加解密,前後沒有關係,也用不著iv
  10.     EVP_EncryptInit_ex(&ctx, cipher, NULL, key, iv);  
  11.     inl=50;  
  12.     len=0;  
  13.     EVP_EncryptUpdate(&ctx,out+len,&outl,in,inl);  
  14. //這個EVP_EncryptUpdate的實現實際就是將in按照inl的長度去加密,實現會取得該cipher的塊大小(對aes_128來說是16位元組)並將block-size的整數倍去加密。如果輸入為50位元組,則此處僅加密48位元組,outl也為48位元組。輸入in中的最後兩位元組拷貝到ctx->buf快取起來。
  15. //對於inl為block_size整數倍的情形,且ctx->buf並沒有以前遺留的資料時則直接加解密操作,省去很多後續工作。
  16.     len+=outl;  
  17.      EVP_EncryptUpdate(&ctx,out+len,&outl,in+50,inl);  
  18. //同樣的函式,但是先檢查ctx->buf中有資料,則將in拷貝到buf之後,並進行同樣的加解密操作(呼叫該cipher的do_cipher實現)。
  19.     len+=outl;  
  20.     EVP_EncryptFinal_ex(&ctx,out+len,&outl);  
  21.     //對於如本例所述,第一次除了了48字節餘兩位元組,第二次處理了第一次餘下的2位元組及46位元組,餘下了輸入100位元組中的最後4位元組。此處進行處理。如果不支援pading,且還有資料的話就出錯,否則,將block_size-待處理位元組數個數個位元組設定為此個數的值,如block_size=16,資料長度為4,則將後面的12位元組設定為16-4=12,補齊為一個分組後加密
  22. 對於前面為整分組時,如輸入資料為16位元組,最後再呼叫此Final時,不過是對16個0進行加密,此密文不用即可,也根本用不著調一下這Final。  
  23.     len+=outl;  
  24.     EVP_CIPHER_CTX_cleanup(&ctx);  
  25. //ctx上下文清理

綜上僅對16及16位元組倍數長度的輸入加密時,只要Update就足夠了,非要用Final的時候記得輸出緩衝區大一點,超過輸入長度的輸出不用就行...