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 -lcryptoxlzh@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 -lcryptoxlzh@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...