Arduino Mega 2560操作SMEC98SP加密芯片的事例代码,如果需要完整代码(包括加密芯片代码),请到中巨伟业 http://www.sinormous.com/download.html下载

#include “smec98sp.h”
#include “iic_smec98sp.h”
void PrintHex(unsigned char *str,unsigned int len)
{
unsigned int i;
for(i=0;i<len;i++)
{
Serial.print(*str++,HEX);
}
Serial.print("\r\n");

}

/*
1.获取SMEC98SP的UID号, 获取STM32的ID, 获取STM32随机数
2.验证PIN
3.内外部认证
4.SHA1=>前置数据^随机数
5.密文读
6.读数据
7.写数据
8.构造算法(PA口数据->密文送加密芯片, 密文返回)

如果直接引用,请将print的调试信息去除
*/
void SMEC_Test(void)
{
/*各种密钥,不会在I2C线路上传输,可以使用同一组.应该将密钥分散存储,防止主控芯片被破解后,被攻击者在二进制码中找到密钥 */
unsigned char InternalKey[16] = {
0x00,0x01,0x02,0x03,0x04,0x05,0x06,0x07,0x08,0x09,0x0A,0x0B,0x0C,0x0D,0x0E,0x0F };//内部认证密钥,必须和SMEC98SP一致
unsigned char ExternalKey[16] = {
0x10,0x11,0x12,0x13,0x14,0x15,0x16,0x17,0x18,0x19,0x1A,0x1B,0x1C,0x1D,0x1E,0x1F };//外部认证密钥,必须和SMEC98SP一致
unsigned char SHA1_Key[16] = {
0x20,0x21,0x22,0x23,0x24,0x25,0x26,0x27,0x28,0x29,0x2A,0x2B,0x2C,0x2D,0x2E,0x2F }; //哈希算法认证密钥,必须和SMEC98SP一致
unsigned char MKey[16] = {
0x30,0x31,0x32,0x33,0x34,0x35,0x36,0x37,0x38,0x39,0x3A,0x3B,0x3C,0x3D,0x3E,0x3F }; //主控密钥,用于产生过程密钥,必须和SMEC98SP一致

unsigned char Pin[8] = {
0x55,0x66,0x77,0x88,0x99,0xaa,0xbb,0xcc }; //Pin认证密钥,必须和SMEC98SP一致

unsigned char bSmec98spUid[12] = {
0 }; //存放SMEC98SP的UID
unsigned short RandomSeek = 0; //随机数种子
unsigned char bRandom[8] = {
0 }; //存放随机数
unsigned char bSessionKey[8] = {
0 }; //存放过程密钥,过程密钥为临时产生的密钥
unsigned char bDataBuf[64] = {
0 };
unsigned char ret, bLen;
unsigned short i, j;

/获取SMEC98SP的UID/
ret = SMEC_GetUid(bSmec98spUid);
if(ret)
{
Serial.print(“SMEC_GetUid -> Error !\r\n”);
while(1);
}
Serial.print("SMEC_GetUid: ");
PrintHex(bSmec98spUid,12);

/取加密芯片的随机数,作为MCU的RandomSeek因子,也可以用其他外部因素,如按键等待时间等/
if(SMEC_GetRandom(bDataBuf))//获取8字节随机数
{
Serial.print(“SMEC_GetRandom -> Error !\r\n”);
while(1);
}
for(i = 0; i < 4; i += 2)
{
/使RandomSeek与加密芯片随机数有关/
j = (bDataBuf[i] << 8) + bDataBuf[i + 1];
RandomSeek ^= j;
}
for(i = 0; i < 6; i += 2)
{
/使RandomSeek与SMEC98SP的UID相关,使得即使相同状况下,不同的加密芯片,RandomSeek值也不一样/
j = (bSmec98spUid[i] << 8) + bSmec98spUid[i + 1];
RandomSeek ^= j;
}
srand(RandomSeek);
Serial.print(“RandomSeek:”);
PrintHex((unsigned char *)&RandomSeek, 2);

/PIN码验证/
ret = SMEC_CheckPin(Pin, (unsigned char)sizeof(Pin));
if(ret)
{
Serial.print(“SMEC_CheckPin -> Error !\r\n”);
while(1);
}
Serial.print(“SMEC_CheckPin OK !\r\n”);

/内部认证, 主控芯片对SMEC98SP加密芯片合法性判断/
for(i = 0; i < 8; i ++)
{
bRandom[i] = (unsigned char) rand();
}
ret = SMEC_IntrAuth(InternalKey, bRandom);
if(ret)
{
Serial.print(“SMEC_IntrAuth -> Error !\r\n”);
while(1);
}
Serial.print(“SMEC_IntrAuth OK !\r\n”);

/外部认证, SMEC98SP加密芯片对主控芯片合法性判断/
ret = SMEC_ExtrAuth(ExternalKey);
if(ret)
{
Serial.print(“SMEC_ExtrAuth -> Error !\r\n”);
while(1);
}
Serial.print(“SMEC_ExtrAuth OK !\r\n”);

/SHA1摘要算法认证, 数据长度可自己设定/
for(i = 0; i < 16; i ++)
{
bDataBuf[i] = (unsigned char) rand();
}
ret = SMEC_Sha1Auth(SHA1_Key, (unsigned char)sizeof(SHA1_Key), bDataBuf, 16);
if(ret)
{
Serial.print(“SMEC_Sha1Auth -> Error !\r\n”);
while(1);
}
Serial.print(“SMEC_Sha1Auth OK !\r\n”);

/调用加密芯片内部计算圆周长算法/
bDataBuf[0] = 0x02;
ret = SMEC_CircleAlg(bDataBuf, 1, bDataBuf, &bLen);
if(ret)
{
Serial.print(“SMEC_CircleAlg -> Error !\r\n”);
while(1);
}
Serial.print("SMEC_CircleAlg OK, C = ");
PrintHex(bDataBuf, 1);

/产生过程密钥,用于后续的Flash数据加密读,及构造的"端口数据运算"/
for(i = 0; i < 8; i ++)
{
bRandom[i] = (unsigned char) rand();
}
ret = SMEC_GenSessionKey(MKey, bRandom, bSessionKey);
if(ret)
{
Serial.print(“SMEC_GenSessionKey -> Error !\r\n”);
while(1);
}
Serial.print(“SMEC_GenSessionKey OK !\r\n”);

/密文读取Flash数据/
ret = SMEC_CryptReadFlash(bSessionKey, 0x0000, bDataBuf, 16);
if(ret)
{
Serial.print(“SMEC_CryptReadFlash -> Error !\r\n”);
while(1);
}
Serial.print(“SMEC_CryptReadFlash OK:\r\n”);
PrintHex(bDataBuf, 16);

/读取Flash数据/
ret = SMEC_ReadFlash(0x0000, bDataBuf, 16);
if(ret)
{
Serial.print(“SMEC_ReadFlash -> Error !\r\n”);
while(1);
}
Serial.print(“SMEC_ReadFlash OK:\r\n”);
PrintHex(bDataBuf, 16);

/写Flash数据/
for(i = 0; i < 16; i ++)
{
bDataBuf[i] = (unsigned char) i;
}
ret = SMEC_WriteFlash(0x0000, bDataBuf, 16);
if(ret)
{
Serial.print(“SMEC_WriteFlash -> Error !\r\n”);
while(1);
}
Serial.print(“SMEC_WriteFlash OK!\r\n”);

/构造"端口数据运算", 可以用实际的PA~PC端口数据/
bDataBuf[0] = 0x00;
bDataBuf[1] = 0x00;
ret = SMEC_GpioAlg(bSessionKey, bDataBuf,2, bDataBuf);
if(ret)
{
Serial.print(“SMEC_GpioAlg -> Error !\r\n”);
while(1);
}
Serial.print(“SMEC_GpioAlg OK:\r\n”);
PrintHex(bDataBuf, 2);

/调用加密芯片内部计算圆周长算法,并密文在线路上传输/
bDataBuf[0] = 0x02;
ret = SMEC_CircleAlgCrypt(bSessionKey, bDataBuf, 1, bDataBuf, &bLen);
if(ret)
{
Serial.print(“SMEC_CircleAlgCrypt -> Error !\r\n”);
while(1);
}
Serial.print("SMEC_CircleAlgCrypt OK, C = ");
PrintHex(bDataBuf, 1);
}

void setup() {
Serial.begin(115200);
SMEC_I2cInit();
}

void loop() {
SMEC_Test();
delay(200);
}

Arduino Mega 2560操作加密芯片源代码相关推荐

  1. Arduino MEGA 2560找不到驱动怎么办

    刚买了Arduino MEGA 2560(比Arduino UNO稍微高级一点的板子),按照视频一步一步操作(似乎插板子也不太一样,不管他,能插上去就完事了),但是到了代码烧录的时候,点击Tools- ...

  2. PCB 零件尺寸图:Arduino Mega 2560 尺寸

    Arduino Mega 2560 尺寸图

  3. 【电机控制】Arduino mega 2560控制42步进电机接线

    Arduino mega 2560控制42步进电机接线图 ****TB6600驱动器与42步进电机接线图**** 接线: 12V电源适配器正负极分别接驱动器VCC和GND 步进电机黑绿红蓝线分别接驱动 ...

  4. Arduino mega 2560 上传项目总是出错最全解决方案以及串口测试教程

    一:串口识别和驱动安装需要保证准确无误 1.运行arduino mega 2560 首先需要安装串口驱动,这样我们用USB将板子和我们计算机连接的时候,使得我们的计算机能够识别连接的串口并且能够连接上 ...

  5. 手把手教你用Arduino MEGA 2560+AS608指纹模块+舵机实现指纹锁,超详细,不要错过哦!

    相信很多小伙伴都想制作一个属于自己的指纹锁吧,看完这一篇博文就够了 (一)材料准备 主要材料: 其它材料: (二)库文件.软件下载 (三)指纹的录入 指纹与TTL转接口接线: 用软件录入指纹 (四)模 ...

  6. 使用Arduino mega 2560读取PS2无线手柄信号并控制小车运动

    使用Arduino mega 2560读取PS2无线手柄信号并控制小车运动 文章目录 使用Arduino mega 2560读取PS2无线手柄信号并控制小车运动 1 前言 2 硬件连接 2.1 硬件构 ...

  7. 树莓派3B+与Arduino Mega 2560蓝牙通讯

    树莓派3B+与Arduino Mega 2560蓝牙通讯 提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档 文章目录 树莓派3B+与Arduino Mega 2560蓝牙通讯 前言 一 ...

  8. STM32操作加密芯片源代码

    STM32操作SMEC98SP加密芯片的事例代码,如果需要完整代码(包括加密芯片代码),请到中巨伟业 http://www.sinormous.com/download.html下载 #include ...

  9. arduino mega 2560 针脚说明

    简介 Arduino Mega2560也是采用USB接口的核心电路板,它最大的特点就是具有多达54路数字输入输出,特别适合需要大量IO接口的设计.Mega2560的处理器核心是ATmega2560,同 ...

最新文章

  1. c# lock (obj) 与 lock (this) 区别
  2. I00031 Look-and-say sequence
  3. 基于Hadoop的数据分析平台搭建
  4. 对mysql的各种sql语句如何对表加锁的实验
  5. posix自己搭建消息队列_蘑菇街消息系统上云实践
  6. centos usb转网口_centOS安装与配置minicom(串口转USB)
  7. 20190228 搭建Hadoop基础环境
  8. 服务器2008系统提权工具,提权教程:winserver2008R2溢出提权
  9. 广数系统加工中心编程_图解数控铣及加工中心加工工艺与编程——(FANUC系统)/(SIEMENS系统)...
  10. BT5 U盘制作方法
  11. 声音场景分类问题探讨
  12. 嵌入式三级知识点整理
  13. 新体育杂志新体育杂志社新体育杂志社新体育编辑部2022年第8期目录
  14. 综合布线施工工艺--
  15. 软件测试工程师面试套路和暗语灵魂解密(面试官看到一定会打我)
  16. 杨振宁追求的物理美学,居然在这里实现,物理学史上颜值最高的组合,看完后跪了……
  17. somachine V4.1如何注册
  18. docker flannel网络部署和路由走向分析
  19. JAVA文法bnf,Mini Java编译器(二)——语法(BNF)-JSP教程,Java技巧及代码
  20. pageHelp分页插件

热门文章

  1. 7.MPLS VP恩 后门链路shamlink
  2. 记录一个子串在整串种出现的次数(JAVA)
  3. 如何为博客增加打赏功能
  4. 免费语音识别成文字_免费在线语音识别成文字_语音识别文字免费软件 - 云+社区 - 腾讯云...
  5. 经纬度画美国地图代码
  6. [FATAL] [1612519163.722674]: No corners could be extracted for camera /left! ***
  7. matlab 极坐标 二维,matlab笔记二维绘图(极坐标隐函数等)008.docx
  8. 快速用Discuz搭建论坛网站教程
  9. STM32F103VET6利用片内FLASH虚拟U盘,使用文件复制方式实现IAP
  10. 2021再看Deno