最近的项目需要用c语言实现AES算法,但这里是用Mbedtls库实现的。
1、下载Mbedtls
首先,将Mbedtls代码放入项目中。 相关传送门如下。
官网海外下载很慢,还附上正文中使用的Mbedtls代码。 传送门如下。
2、引入Mbedtls头文件
在本例中,我们将在项目的CMakeLists.txt中引入Mbedtls头文件。 代码如下。
# for debug
#add_compile_options-g ) )
项目设备认证) )
cmake _ minimum _ required 版本3.5 ) )。
INCLUDE_DIRECTORIES
./include/
././src/net/mbedtls/include
././src/smalgo/sms4/include
)
setmy_src_crypto
././src/net/mbed TLS/library/AES.c
././src/net/mbed TLS/library/AES ni.c
././src/net/mbed TLS/library/base64.c
././src/net/mbed TLS/library/RSA.c
././src/net/mbed TLS/library/RSA _ internal.c
././src/net/mbed TLS/library/entropy.c
././src/net/mbed TLS/library/entropy _ poll.c
././src/net/mbed TLS/library/bignum.c
././src/net/mbed TLS/library/sha1.c
././src/net/mbed TLS/library/sha 256.c
././src/net/mbed TLS/library/sha 512.c
././src/net/mbed TLS/library/MD.c
././src/net/mbed TLS/library/MD5.c
././src/net/mbed TLS/library/MD _ wrap.c
././src/net/mbed TLS/library/ripemd160.c
././src/net/mbed TLS/library/platform _ util.c
././src/net/mbed TLS/library/oid.c
././src/net/mbed TLS/library/timing.c
././src/net/mbed TLS/library/net _ sockets.c
././src/smalgo/sms4/cbc128.c
././src/smalgo/sms4/sms4_cbc.c
././src/sm algo/SMS4/SMS4_ common.c
././src/smalgo/sms4/sms4_enc.c
././src/sm algo/SMS4/SMS4_ setkey.c
)
setmy_src_crypto_DBG
././src/net/mbed TLS/library/CTR _ drbg.c
)
setsrc_list_encrypt_bin
oem_porting.c
sdk_porting.c
authref.c
test.c
${my_src_crypto}
${my_src_crypto_dbg}
)
setsrc_list_decrypt_lib
oem_porting.c
sdk_porting.c
authref.c
auth.c
${my_src_crypto}
${my_src_crypto_dbg}
)
#集src _ list _ auth _ dev
# oem_porting.c
# sdk_porting.c
# authref.c
# ${my_src_crypto}
# ${my_src_crypto_dbg}
# )
add_definitions-fpic )。
# add _ library authd静态$ { src _ list _ auth _ dev } )
add _ library authoalstatic $ src _ list _ decrypt _ lib ) ) ) ) )
add _ executable eaidkauth $ { src _ list _ encrypt _ bin } )
工程结构如下。
部署完成后,可以启动AES代码sldbm。
3、AES码sldbm
authref.h头文件中的代码如下:
#ifndef __AUTHREF_H__
#define __AUTHREF_H__
#包含
#包含
#包含
#包含
# undef调试
#define AES_KEY_SIZE 48
#define AES_IV_LEN 16
#ifdef __cplusplus
扩展’ c ‘ {
#endif
//aes加朴素发夹/p //aes_key –最长48字节
//iv –最长16字节
//plaintext –要加密的文本
//ciphertext –加密的文本
//len — len should be 16*N bytes
//return0 forok,else for error
int AES _ CBC _ encr yp uint8_ t * AES _ key,uint8_t *iv,uint8_t *plaintext,uint8_t *ciphertext,uint330
//aes朴素发夹/p //aes_key –最长48字节
//iv –最长16字节
//ciphertext –要解密的文本
//plaintext –解密的文本
//len — len should be 16*N bytes
//return0 forok,else for error
int AES _ CBC _ decryp uint8_ t * AES _ key,uint8_t *iv,uint8_t *ciphertext,uint8_t *plaintext,uint330
#ifdef __cplusplus
}
#endif
#endif //__AUTHREF_H__
authref.c代码如下:
#include ‘authref.h ‘
#include ‘mbedtls/entropy.h ‘
#include ‘mbedtls/ctr_drbg.h ‘
#include ‘mbedtls/aes.h ‘
//len should be 16*N bytes
int AES _ CBC _ encr yp uint8_ t * AES _ key,uint8_t *iv,uint8_t *plaintext,uint8_t *ciphertext,uint330
int i;
intblk=len15 ) 4;
mbedtls_aes_context aes_ctx;
mbedTLS_AES_initAES_CTX;
//setkey_dec
mbedTLS_AES_setkey_encAES_CTX,aes_key,256 );
forI=0; i blk; I ) {
mbedTLS_AES_crypt_CBCAES_CTX,MBEDTLS_AES_ENCRYPT,16,iv,plaintextI*16 ),ciphertext ) I*16
}
mbedTLS_AES_freeAES_CTX );
返回0; //OK
}
//len should be 16*N bytes
int AES _ CBC _ decryp uint8_ t * AES _ key,uint8_t *iv,uint8_t *ciphertext,uint8_t *plaintext,uint330
int i;
intblk=len15 ) 4;
mbedtls_aes_context aes_ctx;
mbedTLS_AES_initAES_CTX;
//setkey_dec
mbedTLS_AES_setkey_decAES_CTX,aes_key,256 );
forI=0; i blk; I ) {
mbedTLS_AES_crypt_CBCAES_CTX,MBEDTLS_AES_DECRYPT,16,iv,ciphertextI*16 ),plaintext ) I*16
}
mbedTLS_AES_freeAES_CTX );
返回0; //OK
}
幽默的铅笔/解密伪代码如下。
ret=AES_CBC_encrypkey,iv,uuid,uint8_t* ) data,64 );
ret=AES_CBC_decrypkey,iv,uuid,uint8_t* ) data,64 );
这个有趣的铅笔解读介绍完成了。