STM32F103C8T6读取加密芯片SMEC98SP(SE98)随机数范例程序源码

加密方案不可避免要用到随机数,一般的加密都需要随机数参与运算。

先在加密芯片SMEC98SP中实现以下程序;

//-----------------------------
//取随机数 CMD = 84 00 00 P3
//-----------------------------
case 0x84:
if(I2C_P1 || I2C_P2)
{
I2C_Buf[0] = 0x6A;
I2C_Buf[1] = 0x86;
return;
}
Tmp_I2C_send_bytes=I2C_P3;
Random_Number_Generator_Get(&I2C_Buf[2], I2C_P3);
memcpy(Random_Number,&I2C_Buf[2],8);
I2C_Buf[0] = 0x90;
I2C_Buf[1] = 0x00;
I2C_send_bytes=Tmp_I2C_send_bytes+2;

break;

在STM32F103中实现以下程序;

//读8字节随机数,返回:90 00 data1 data2.....data8
unsigned char Read_random(unsigned char *random)
{
uchar ret;
uchar iic_addr;
uchar len;
iic_addr = 0x00;
iic_buff[0] = 0x84; //可更改,与加密芯片中程序保持一致
iic_buff[1] = 0x00;
iic_buff[2] = 0x00;
iic_buff[3] = 0x08; //一共是0x08个字节
len = iic_buff[3];
ret = IIC_WriteWithAddr(iic_addr & 0xFE, iic_buff, 4);
if(ret)//出错
{
return 1;
}
// delay_nms(5);
ret = IIC_ReadWithAddr(iic_addr | 0x1, random, (len+2));
if(ret)
{
return 1;
}
return 0; //读取成功

}


这样就可以读出8个字节随机数,开头90 00 属于状态字,后面8个字节是随机数。

对于单片机不能生成真随机数的问题,可以先读取加密芯片SE98的随机数,通过与单片机的ID好,自由密钥参数,通过一些多重算法实现。


你可能感兴趣的:(加密芯片)