加密ic 及 aes256 加密app
以前沒接觸過加密ic,只知道加密ic是通過i2c和mcu通訊,前段時間做的專案算是第一次用上了。
這個專案的要求是通過加密ic 既要能加密我們的韌體 也要能加密配合我們韌體使用的app。mcu和ic之間用i2c通訊,mcu和app之間走usb通道
我們的方案是這樣的:
由加密ic方往加密ic裡面寫入數值不同的16個byte長度的id,拿到這個id後傳送給app,app再對這個id的真偽進行校驗。
如此則涉及到兩次校驗過程
一:加密ic和韌體的校驗
這個加密的原理是由我方指定一個16 Byte的key,用ic方提供的庫函式通過i2c,將key傳遞給ic,ic讀到正確的key值才能通過校驗並將id值返回給我方。
在除錯過程中為了達到ic方指定的通訊波形,大意了,在呼叫這個mcu方案的os提供的i2c讀寫函式時,沒注意到有個值是個無符號整形數,而i2c讀函式讀取失敗時會返回-1,原本讀取失敗應該再次讀取,因為返回值被強轉成了無符號整形數,所以總是大於-1,不會再次讀取,造成波形有問題
二:利用id值對app進行加密
從ic讀取到id之後,對16 Byte的id然後再摻入16 Byte的隨機數,對這32Byte的數值進行aes256加密,加密之後的密文通過usb傳遞給app,app再對密文進行aes256解密,得到16位元組的id,然後app對id進行校驗
這裡面引入aes256加密演算法的原因是,usb通訊資料的內容很容易被第三方監測到,所以不能傳遞id明文,正好aes256利用指定的key可以加解密。在使用過程中發現aes256加密固定資料得出的密文是固定的於是又引入了16Byte的隨機數,這樣加密得到的密文隨機數部分也是隨機的,而aes256的一個特徵是必須要完整密文才能解密出正確的原始資料。
最後貼一下加解密函式:
int mbedtls_aes_test( int verbose , unsigned char *input , unsigned char *output) { int ret = 0, i; unsigned char key[32] ; mbedtls_aes_context ctx; mbedtls_aes_init( &ctx ); memset( iv , 0, 64 ); memset( output, 0, 64 ); //encrypt: ret = mbedtls_aes_setkey_enc( &ctx , key , 256 ); if( ret != 0 ){ mbedtls_printf("\r\n mbedtls_aes_setkey_enc failed:[%d] \r\n" , ret ) ; } ret = mbedtls_aes_crypt_cbc( &ctx , MBEDTLS_AES_ENCRYPT , 64 , iv , input , output ); if( ret != 0 ){ mbedtls_printf("\r\n mbedtls_aes_crypt_cbc failed:[%d] \r\n" , ret ) ; goto exit; } //decrypt: ret = mbedtls_aes_setkey_dec( &ctx , key , 256 ); if( ret != 0 ){ mbedtls_printf("\r\n mbedtls_aes_setkey_dec failed:[%d] \r\n" , ret ) ; goto exit; } memset( iv , 0, 64 ); ret = mbedtls_aes_crypt_cbc( &ctx , MBEDTLS_AES_DECRYPT , 64 , iv, output , tmp ); if( ret != 0 ){ mbedtls_printf("\r\n mbedtls_aes_crypt_cbc failed:[%d] \r\n" , ret ) ; goto exit; } mbedtls_printf("decrypt str :\n") ; for(i=0 ; i<16 ; i++){ mbedtls_printf("0x%02x " , tmp[i]) ; } mbedtls_printf("\r\n\n") ; ret = 0; exit: mbedtls_aes_free( &ctx ); return( ret ); }