一個簡單的使用EVP框架的加密過程
阿新 • • 發佈:2019-01-27
- 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的時候記得輸出緩衝區大一點,超過輸入長度的輸出不用就行...