摘自: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的時候記得輸出緩沖區大一點,超過輸入長度的輸出不用就行...