openssl AES加密演算法API的使用示例

2022-05-12 22:00:08 字數 3068 閱讀 8405

openssl為使用者提供了豐富的指令,同時也提供了供程式設計呼叫的api,本文以使用128位aes演算法的ecb模式進行加密和解密驗證,如下所示

第一種方法,直接使用aes演算法提供的api進行呼叫,**如下

#include #include 

#include

#include

int main(void

)

/*設定解密key及金鑰長度*/    

aes_set_decrypt_key(userkey, aes_block_size*8, &key);

len = 0

; /*迴圈解密*/

while(len < aes_block_size*3

)

/*解密後與原資料是否一致*/

if(!memcmp(plain, date, aes_block_size*3

))else

printf(

"encrypt: ");

int i = 0

;

for(i = 0; i < aes_block_size*3 + 4; i++)

}printf("\n

");

return0;

}

編譯執行結果如下

xlzh@cmos:~/cmos/openssl-code/aes$ gcc aes.c -o aes.out -lssl -lcrypto

xlzh@cmos:~/cmos/openssl-code/aes$ ./aes.out

test success

encrypt:

08 a9 74 4d b0 66

57 1b 57 fe 60 3d 91 e4 ed 53

08 a9 74 4d b0 66

57 1b 57 fe 60 3d 91 e4 ed 53

08 a9 74 4d b0 66

57 1b 57 fe 60 3d 91 e4 ed 53

0000

0000

xlzh@cmos:~/cmos/openssl-code/aes$

第二種方法,使用evp框架,示例如下

#include #include 

#include

#include

#include

int main(void

)

/*禁用padding功能*/

evp_cipher_ctx_set_padding(&ctx, 0

); /*進行加密操作*/

ret = evp_encryptupdate(&ctx, encrypt, &mlen, date, aes_block_size*3

);

if(ret != 1

) /*結束加密操作*/

ret = evp_encryptfinal_ex(&ctx, encrypt+mlen, &flen);

if(ret != 1

) tlen = mlen +flen;

tlen = 0

; mlen = 0

; flen = 0

; evp_cipher_ctx_cleanup(&ctx);

evp_cipher_ctx_init(&ctx);

ret = evp_decryptinit_ex(&ctx, evp_aes_128_ecb(), null, userkey, iv);

if(ret != 1

)

evp_cipher_ctx_set_padding(&ctx, 0

); ret = evp_decryptupdate(&ctx, plain, &mlen, encrypt, aes_block_size*3

);

if(ret != 1

) ret = evp_decryptfinal_ex(&ctx, plain+mlen, &flen);

if(ret != 1

)

/*對比解密後與原資料是否一致*/

if(!memcmp(plain, date, aes_block_size*3

))

else

printf(

"encrypt: ");

inti;

for(i = 0; i < aes_block_size*3+4; i ++)

}printf("\n

");return0;

}

編譯執行結果如下:

xlzh@cmos:~/cmos/openssl-code/aes$ gcc evp.c -o evp.out -lssl -lcrypto

xlzh@cmos:~/cmos/openssl-code/aes$ ./evp.out

test success

encrypt:

08 a9 74 4d b0 66

57 1b 57 fe 60 3d 91 e4 ed 53

08 a9 74 4d b0 66

57 1b 57 fe 60 3d 91 e4 ed 53

08 a9 74 4d b0 66

57 1b 57 fe 60 3d 91 e4 ed 53

0000

0000

xlzh@cmos:~/cmos/openssl-code/aes$

evp框架是對openssl提供的所有演算法進行了封裝,在使用工程中只需要修改少量的**就可以選擇不同的加密演算法,在工作中通常採用這種方式。

在上述兩個示例中,直接使用api提供的介面,沒有使用padding,在evp中同樣需要宣告不可以使用padding方式,否則即使要加密的資料長度是aes_block_size的整數倍,evp預設也會對原始資料進行追加,導致結果不同,所以在試驗中通過evp_cipher_ctx_set_padding(&ctx, 0

)函式關閉的evp的padding功能,同樣在解密的時候也需要進行關閉。

OpenSSL AES對稱加密演算法使用詳解

演算法 aes加密演算法是根據 s盒 如下圖所示 來對明文進行位元組替換的,這一點也就是說對於aes演算法來說其加密明文和密文大小是一樣的,對於具體的s盒的構造方法和aes演算法理論 手寫加密演算法 後面有時間再進行整理,這裡先解決專案的當務之急吧。2.openssl api講解 設定加密解密key...

對稱加密演算法 DES加密演算法

一 對稱加密演算法 對稱加密也稱為常規加密 私鑰或單鑰加密。乙個對稱加密由5部分組成 明文 plaintext 這是原始資訊或資料,作為演算法的輸入。加密演算法 encryption algorithm 加密演算法對明文進行各種替換和轉換。金鑰 secret key 金鑰也是演算法的輸入。演算法進行...

gentry同態加密演算法 同態加密演算法

本文對同態加密演算法進行學習。參考文章同態加密演算法。定義同態加密演算法保證對聯合密文的解密結果等價於聯合明文。若存在同態加密演算法f,針對明文a和b,加密後分別得到a f a b f b 將其和a b 解密後得到a b,則同態加密演算法f被成為加法同態加密演算法。加法同態演算法的加密和解密分別用e...