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


摘自:https://www.xuebuyuan.com/2145079.html

    const EVP_CIPHER *cipher;
    unsigned char        key[24],iv[8],in[100],out[108],de[100];
    int          i,len,inl,outl,total=0;
  
    EVP_CIPHER_CTX             ctx;
//此init做的僅是將ctx內存 memset為0
    EVP_CIPHER_CTX_init(&ctx);
 
    cipher  = EVP_aes_128_ecb();
//原型為int EVP_EncryptInit_ex(EVP_CIPHER_CTX *ctx,const EVP_CIPHER *cipher, ENGINE *impl, const unsigned char *key, const unsigned char *iv) 
//另外對於ecb電子密碼本模式來說,各分組獨立加解密,前后沒有關系,也用不着iv
    EVP_EncryptInit_ex(&ctx, cipher, NULL, key, iv);
 
    inl=50;
    
    len=0;
    
    EVP_EncryptUpdate(&ctx,out+len,&outl,in,inl);
//這個EVP_EncryptUpdate的實現實際就是將in按照inl的長度去加密,實現會取得該cipher的塊大小(對aes_128來說是16字節)並將block-size的整數倍去加密。如果輸入為50字節,則此處僅加密48字節,outl也為48字節。輸入in中的最后兩字節拷貝到ctx->buf緩存起來。
//對於inl為block_size整數倍的情形,且ctx->buf並沒有以前遺留的數據時則直接加解密操作,省去很多后續工作。
    len+=outl;
    
     EVP_EncryptUpdate(&ctx,out+len,&outl,in+50,inl);
//同樣的函數,但是先檢查ctx->buf中有數據,則將in拷貝到buf之后,並進行同樣的加解密操作(調用該cipher的do_cipher實現)。
     
    len+=outl;
    
    EVP_EncryptFinal_ex(&ctx,out+len,&outl);
    //對於如本例所述,第一次除了了48字節余兩字節,第二次處理了第一次余下的2字節及46字節,余下了輸入100字節中的最后4字節。此處進行處理。如果不支持pading,且還有數據的話就出錯,否則,將block_size-待處理字節數個數個字節設置為此個數的值,如block_size=16,數據長度為4,則將后面的12字節設置為16-4=12,補齊為一個分組后加密
對於前面為整分組時,如輸入數據為16字節,最后再調用此Final時,不過是對16個0進行加密,此密文不用即可,也根本用不着調一下這Final。
    len+=outl;
    
    EVP_CIPHER_CTX_cleanup(&ctx);
//ctx上下文清理
 

 

 

 

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

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM