加密ic 及 aes256 加密app

来源:互联网 发布:mac版本photoshop破解 编辑:程序博客网 时间:2024/05/17 07:17

以前没接触过加密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 );}


0 0
原创粉丝点击