AES加密是美國聯(lián)邦政府采用的一種塊加密標準,如今已經(jīng)被全世界廣為使用。嵌入式開發(fā)中我們也經(jīng)常會用到加密解密算法,如果沒有硬件模塊來實現(xiàn),就需要用到C代碼軟件實現(xiàn)。下面介紹調(diào)用mbedTLS中的AES加密解密函數(shù)實現(xiàn)AES算法。
mbedTLS是一個開源TLS協(xié)議棧,主要用于嵌入式開發(fā),其源代碼網(wǎng)址為https://tls.mbed.org/aes-source-code。在該頁面上點擊downloadmbedTLS即可下載最新的協(xié)議棧,解壓該壓縮包就可以得到協(xié)議棧源代碼。協(xié)議棧中的各種算法都獨立封裝在C文件中,彼此耦合度較低,目的是便于調(diào)用。我這里下的是2.2.1版本,解壓后可以看到mbedtls-2.2.1\include\mbedtls路徑下有許多header文件,將其添加到IDE的頭文件中。在mbedtls-2.2.1\library下有許多c文件,我們只添加需要用到的aes.c。
這里使用Visual Studio2013 C/C++環(huán)境進行編譯演示。新建控制臺應(yīng)用,空工程。在Header Files文件夾下添加頭文件,注意連文件夾一起添加,因為C文件中的include是包含路徑的。然后把aes.c添加到source文件夾里。此時直接編譯就能通過啦!
接下來就是在主函數(shù)里調(diào)用函數(shù)。這里調(diào)用了ECB模式和CBC模式兩種。源代碼如下:
#include<stdio.h>
#include "mbedtls/aes.h"
#include "mbedtls/compat-1.3.h"#define AES_ECB 0
#define AES_CBC 1
#define AES_CFB 2
#define AES_CTR 3
#define MODE AES_ECBunsigned char key[16] = { 0x22, 0x22, 0x22, 0x22, 0x22, 0x22, 0x22, 0x22, 0x22, 0x22, 0x22, 0x22, 0x22, 0x22, 0x22, 0x22 };
unsigned char plain[32] = { 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11 };
unsigned char plain_decrypt[32] = { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 };
unsigned char IV[16];
unsigned char cypher[32];
int i = 0;
mbedtls_aes_context aes;void SetIV()
{int i;for (i = 0; i < 16; i++){?IV[i] = 0x55;}}
int main()
{if (MODE == AES_ECB){mbedtls_aes_setkey_enc(&aes, key, 128);// ?set encrypt key?? ??? ??? ?mbedtls_aes_crypt_ecb(&aes, AES_ENCRYPT, plain, cypher);mbedtls_aes_setkey_dec(&aes, key, 128);// ?set decrypt keymbedtls_aes_crypt_ecb(&aes, AES_DECRYPT, cypher, plain_decrypt);i++;?? ??? ??? ?}if (MODE == AES_CBC){mbedtls_aes_setkey_enc(&aes, key, 128);// ?set encrypt keySetIV();mbedtls_aes_crypt_cbc(&aes, AES_ENCRYPT, 32, IV, plain, cypher);mbedtls_aes_setkey_dec(&aes, key, 128);// ?set decrypt keySetIV();mbedtls_aes_crypt_cbc(&aes, AES_DECRYPT, 32, IV, cypher, plain_decrypt);i++;?? ??? ??? ?}
}
單步運行,在 debug 窗口中可以觀察到 cypher 數(shù)組的值改變,變?yōu)榧用芎蟮闹?#xff0c;以及 plain _decrypt 數(shù)組中的值變?yōu)榻饷芎蟮闹?#xff0c;也就是和 plain 數(shù)組中一樣。J~
?
總結(jié)
以上是生活随笔為你收集整理的C语言实现AES加密解密的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
如果覺得生活随笔網(wǎng)站內(nèi)容還不錯,歡迎將生活随笔推薦給好友。