1. 程式人生 > >加密ic 及 aes256 加密app

加密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 );
}