Arduino Mega 2560操作加密芯片源代码

Arduino(3) Mega2560和外部设备SPI通信 前言 这篇文章主要讲Arduino串行通信里的SPI通信。SPI(Serial Peripheral Interface,串行外设接口)高速通信接口一般用在于对于数据量要求比较大的设备或者场景里,例如SD卡,网络芯片,而Arduino支持SPI总线,从而可以和一些使用SPI总线的设备通信,一根SPI总线上可以连接多个SPI从设备。 SPI设置 在一个SPI设备中,通常会有4个引脚。SPI总线有主... 阅读详情

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的PWM调整 Arduino PWM调整 阅读详情

相关推荐

Arduino mega 2560 通过I2C驱动LCD1602

之前有幸拿到社区发来的Arduino Mega 2560 和扩展板,一直再酝酿写点儿什么,每次都很踟蹰,不知道写个什么应用好,又要让小白能够容易理解,又不会和其他的人冲突,还要有很好的创意,看着手中的板子,我有点儿迷茫,写个系列? 什么系列呢?arduino 从入门到放弃? 还是定制一款arduino mega 2560 的开源CNC? 这个太烧钱,前不久才去新西兰烧了一下钱袋子,所以现在还是决定低调,低调。 翻箱倒柜找到一块LCD1602, 很久没有看到有人用这么老的设备了,但是其特点是简单,亮度可调,还

电子芯吧客的博客 3846

ARDUINO零基础入门教程【代码编程篇】

从硬件方面着手带您学会ARDUINO的硬件原理和编程。只有懂了硬件原理才能更清楚代码的含义。零基础入门,快速学会ARDUINO,上手做自己的小设计。从小白到大神之间就缺这部视频o(* ̄︶ ̄*)o

arduino mega2560接蓝牙hc-05和继电器

一 逻辑 蓝牙名称1234,密码12345,从模式(使用AT指令完成配置) 通过手机蓝牙控制mega接的继电器的开关状态 二 注意事项 1.mega2560的板子有4组tx rx Serial.begin(19200); //串口0,就是PWM区域里的Pin0和Pin1脚 Serial1.begin(19200); //串口1,即Pin19及Pin18 Serial2.begin(19200); //串口2,即Pin17及Pin16 Serial3.begin(19200); //串口1,即Pin15及Pi

qq_45037925的博客 2536

智能门锁远程开锁有无风险?加密芯片SMEC98SP对智能门锁的安全有没有帮助?

今天看了一篇文章,探讨智能门锁的远程开锁功能是否安全,下图是示意图:安全取决于几个通讯的链路是否加密,手机客户端是否有木马挟持等;数据是否加密,用户是看不出来的,负责任的厂家可能会采用加密措施,加密手段有很多,真加密,伪加密。有人认为只要传输的不是明文就是加密了,这是错误的。伪加密很容易被破解,被黑客破解了你的密码,你的门随时可能被打开。对这个问题,首先是慎用远程开锁功能,第二是选用大品牌智能门锁...

中巨智能的博客 1291

Arduino Mega 2560 vs UNO:如何根据你的项目需求选择合适的开发板?

本文深入对比了Arduino Mega 2560与UNO开发板的硬件架构、引脚资源及典型应用场景,帮助开发者根据项目需求选择合适的嵌入式系统开发板。从内存容量、多串口支持到复杂控制逻辑,详细解析了两者的优劣势,并提供了实用的选型策略和成本效益分析。

melon的博客 1471

arduino笔记22:Aeduino Mega2560

Arduino Mega2560也是采用USB接口的核心电路板,它最大的特点就是具有多达54路数字输入输出,特别适合需要大量IO接口的设计。Mega2560的处理器核心是ATmega2560, 同时具有54路数字输入/输出口(其中16路可作为PWM输出),16路模拟输入,4路UART接口,一个16MHz晶体振荡器,一个USB口,一个电源 插座,一个ICSP header和一个复位按钮。Arduin...

weixin_45755966的博客 2240

Arduino的详细介绍(基于Mega2560)

很早之前入手了一块Arduino Mega Arduino Mega 2560是基于ATmega2560的微控制板,有54路数字输入/输出端口( 其中15个可以作为PWM输出),16路模拟输入端口,4路UART串口,16MHz的晶振 ,USB连接口,电池接口,ICSP头和复位按钮。简单地用USB连接电脑或者用交直 流变压器就能使用。 Mega 2560 是Ardu

一步的专栏 10万+

arduino MEGA2560的交通灯基础实验

交通灯 G Y R GND。循环同时在oled上显示出。

卧龙院士 575

Arduino Mega 2560 Wokwi汇总篇

该课程围绕 Arduino mega 2560 展开,从基础的 LED 控制到复杂的通信协议、传感器应用以及执行器控制等多方面进行教学。课程发展历程丰富,早期涉及基础说明,后续逐步推出详细的课程大纲和实践指导书,不断完善和拓展教学内容,为学习者提供了较为全面的 Arduino 编程与硬件控制知识体系。不过,目前课程部分内容仍有待完善,后续将进行补充。

zhangrelay的专栏 2039

Arduino 系列:Arduino Mega 系列 (基于 ATmega2560)_(3).Arduino Mega 2560 引脚配置

Arduino Mega 2560 提供了丰富的引脚配置选项,包括数字 I/O 引脚、模拟输入引脚、电源引脚、专用引脚、外部中断、PWM 输出、SPI 通信、I2C 通信和 UART 通信。通过合理配置这些引脚,可以实现各种复杂的功能,满足不同的开发需求。希望本文档能帮助你更好地理解和使用 Arduino Mega 2560 的引脚配置。

2401_87715305的博客 2303

sha1.zip 在线安装的库可能不能直接用,懒得改了,用这个吧

配合我的blog : arduino + mysql , 在线安装的库可能不能直接用,懒得改了,用这个吧

MEGA2560 arduino烧录USB 芯片flash以及bootloader记录

一、相关硬件说明 1、自制MEGA2560板子一块 该板子是仿制了arduino的MEGA2560的板子,USB接口的实现是通过单片机ATMEGA16U2来实现,ATMEGA16U2和MEGA2560通过串口实现通信。ICSP接口1是对芯片ATMEGA16U2,ICSP接口2是对芯片ATMEGA2560. 2、USBtiny烧录器一个 红色线对应的有三角标识的是ICSP接口的...

hanxuCOCO的博客 9004

通达信指标公式源码2560战法主图.doc

通达信指标公式源码2560战法主图.doc

Arduino案例实操 -- Arduino SD卡读写(Mega2560)

写这篇博客的主要原因是踩坑了,而且还是官方的坑,网上能找到的有营养的资源少, 在这记录顺便分享一下。(Mega2560 以下简称 2560) 索引SD卡官方例程库强行在2560上进行示例测试正确解决方法总结 SD卡官方例程库 用过Arduino的人都基本知道Arduino IDE有针对SD卡文件操作的相关的库,即SD库,默认已经安装在IDE中,可以在示例中打开SD库的demo SD库ReadWrite示例代码如下,这看起来好像也没什么毛病,通过SPI总线对SD卡进行操作 #include <SPI

General_s 1万+

基于STM32F407ZGT6与INMP441的I2S音频采集系统:从配置到实时波形显示

本文详细介绍了基于STM32F407ZGT6与INMP441麦克风模块的I2S音频采集系统设计与实现。从硬件选型、CubeMX配置到音频数据处理和上位机波形显示,全面解析了系统架构、DMA传输优化及常见问题解决方案,帮助开发者快速构建高精度音频采集系统。

weixin_33743661的博客 403

Java:使用Java调用打印机进行打印(JPG、PDF和Word三种文件格式)

目录 一、Java的打印简介 二、Java打印实现 2.1 JPG图片文件格式打印实现 2.2 PDF文件格式打印实现 2.3 Word文件格式打印实现 2.3.1 Word文件采用jacob插件进行打印实现。 2.3.2 先将word转化为pdf文件,然后打印pdf(lz使用) 三、总结 一、Java的打印简介 在我们的实际工作中,经常需要实现打印功能。但由于历史原因,Jav...

vatxiongxiaohui的专栏 8万+

Arduino Mega2560 作为烧录器烧写Mega2560的bootloader

发表这篇文章只是单纯的想帮助Arduino mega2560烧录失败的学习者学习。之前我烧录失败的原因是没有修改引脚配置,因为Arduino UNO和Mega2560的io口定义是不一样的,所有需要修改,spi里的引脚设置,11改为51,12改为50,13改为52,4改为10。

white5201314的博客 4009

SAP STO流程实战:如何配置外向交货单PGI后自动生成内向交货单(附避坑指南)

本文详细解析了SAP STO流程中,如何配置实现外向交货单发货过账(PGI)后自动生成内向交货单。通过分步指南,重点阐述了SPED输出类型、输出条件记录、收货点及确认控制码等关键配置,并提供了针对“No goods receipt possible”等常见错误的避坑指南,助力实现跨公司物料转移流程的自动化与高效衔接。

weixin_28327051的博客 395

用arduino mega2560通过isp给 arduino uno烧录程序

一直想通过最基本的方式来烧录arduino程序,没有bootloader,不使用arduino IDE,基于avr-libc库来写程序,再用avrdude来烧录。我的系统是arch linux,我的用户目录为 /home/suah,截取的log的第一行就是烧录的命令,后续我们自己修改目标文件,就可以随时烧录自己的程序了。就想着用mega来做isp工具,来给uno烧录程序,就有了以下过程。直接烧录,如下log:(注意,提前安装好所需的工具链,如 :make,avr-gcc等 )mega做成isp烧录工具。

huaply123的博客 3550

微信图片.dat文件解密实战:用Python一键转PNG(附完整代码)

本文详细介绍了如何通过Python解密微信图片.dat文件并转换为PNG格式的完整教程。文章深入解析了微信.dat文件的异或加密原理,提供了自动检测密钥的Python脚本,并分享了批量解密和性能优化的实用技巧,帮助用户轻松恢复和整理微信聊天图片。

weixin_29096377的博客 465

51单片机——LCD12864驱动函数深度解析与实战优化

本文深入解析了51单片机驱动LCD12864液晶屏的核心驱动函数,从底层时序、关键延时到地址计算进行逐行剖析,并针对常见显示问题提供系统性的调试技巧与实战优化方案。重点探讨了如何将基础代码优化为稳定高效的驱动,涵盖延时精准化、批量写入及显示缓冲区等高级技巧,旨在帮助开发者从“点亮”屏幕进阶到“精通”驱动,确保显示稳定可靠。

weixin_29190169的博客 85
上一篇: STM32操作加密芯片源代码
下一篇: 8051操作加密芯片源代码
中巨伟业
博客等级 码龄8年 69粉丝 14原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值