ATSHA204A在OBD产品中的防克隆应用

ATSHA204A使用笔记 使用芯片:ATSHA204A(8脚S0IC封装)目的:使用ATSHA204A的认证功能,防抄板前提:了解IIC通信原理 资料:1.网上对于使用ATSHA204A的参考资料大概有三四个,很容易找到        2.ATSHA204A的datasheet    3.atmel官网下载的库代码或者代理商也应该会提供一些参考代码或者网上也可以下载到。代理商给我的参考代码把操作都封装好了,只需要修改一个底 阅读详情

ATSHA204A在OBD产品中的防克隆应用

随着行业的技术发展和需求,车载OBD产品中有部分会增加蓝牙BLE和手机APP联系。兼于总体成本和成熟度的综合因素,目前市面上的OBD产品大都使用Microchip的PIC18F25K80。

基本框图如下所示:
在这里插入图片描述
PIC18F25K80是Microchip高性能的8位MCU,内置了ECAN模块,支持超低功耗模式。集成了常用的UART, SPI, I2C等接口,用于和外围器件通信。
详见如下链接:
https://www.microchip.com/wwwproducts/en/PIC18F25K80

由于目前国内对知识产权保护方面仍然不够完善,各个公司之间都是互相借鉴甚至直接克隆软硬件,使真正投入资源开发这类产品的公司遭受了巨大的损失。
我们知道,单纯依靠MCU本身的Flash锁定位来防止别人读出Flash中的内容已不足以防止别人的抄袭,此时只能依靠外部增加硬件的安全芯片来保护自己的设计不被非法克隆。
Microchip的ATSHA204A可以满足些类需求,详细资料可以在下面的链接中找到。
https://www.microchip.com/wwwproducts/en/ATSHA204A
ATSHA204A是支持硬件保护的安全芯片,能提供安全的存贮区域来保护用户的密钥和其它重要数据,并且支持SHA256的硬件加速引擎来完成身份验证等功能。是实现软硬件防克隆,IP保护,配件耗材管控的理想方案。
为了方便客户的硬件设计,ATSHA204A提供了丰富的封装选项,从最通用的SOIC8到最小尺寸的UDFN8(2*3mm)。
UDFN8, SOIC8, TSSOP8, SOT323, 3 PADS contact
在这里插入图片描述
和MCU的接口支持通用的I2C接口或单总线接口,占用MCU的脚位非常少。
ATSHA204A支持很宽的工作电压范围,2.0V~5.5V,和MCU的接口电压从1.8V到5.5V。可以非常方便地适配到大部分的系统中。

ATSHA204A内部有16个Slot可以存放数据,每个Slot都可以根据需要做不同的配置。由于这里只是演示简单的身份验证过程,只需要用一个Slot来保存密钥。可以使用ACES和CK101来对204做Provision,Slot 0用来保存密钥,所以需要设置成不可读,不可写。配置如下,
在这里插入图片描述
其它的Slot可以配置成可读可写的,这样就可以当作E2PROM来保存用户数据。

把配置区锁定后,就可以向Slot0中写入密钥。之后再把数据区锁定。
只有配置和数据区都锁定以后才能正常执行验证的完整过程。

AN_8834 - ATSHA204 Authentication Modes 中可以了解使用SHA256做身份验证的基本过程
在这里插入图片描述
上图是可以把Alice理解成MCU,Bob理解成外加的ATSHA204A安全芯片。
预先会在SHA204A中写入密钥,如上图中的Shared Key;
在现场验证时,MCU会产生一个随机数,将随机数发给ATSHA204A做Crypto Hash运算(实际上就是对密钥和随机数来做了SHA256的运算,产生一个HASH值);
同时MCU也会用代码做同样的运算(对密钥和随机数执行软件的SHA256运算,也会产生一个HASH值)
MCU等待一段时间后读取SHA204A的运算结果,和自己的结果做对比;
如果一致就可以认为外部的SHA204A是合法的,程序可以正常运行。否则就不运行。
所以,这里有两点需留意:

  1. MCU中需要保存密钥
  2. MCU中需要用软件来实现SHA256的算法

由于MCU中有保存密钥,所以密钥最好不要以明文形式存在,可以打散放置或做一些转化,如用位或非操作等。在需要验证前现场恢复密钥。
如果MCU中没有好的随机数生成器,可以用SHA204A来生成随机数Rm。为防止重复质询攻击,MCU需要对随机数Rm做一些处理,增加一些随机因子。比如用ADC来采样的数据替换Rm中的某些字节。再做一次SHA256运算得到Hm,用结果Hm来发起质询验证。

客户这个案子使用的是SOT23封装的单总线接口的ATSHA204A, 所以大部分的工作都是在实现MCU和SHA204A的单总线通信。
单总线的时序需求非常严格,逻辑位0和逻辑位1是通过不同的脉冲来区分的。如果开发过红外遥控的编解码程序应该对这种不会陌生。
在这里插入图片描述
在这里插入图片描述

MCU中实现单总线有两种方式:

  1. 使用7位UART, 230400bps 来模拟单总线时序。这种方式需要MCU支持7位数据模式,PIC18系列刚好不支持。当时花了很长时间验证,发现只能从MCU发送到204A, 204A发给MCU的数据不能正常接收。后来就改用I/O口模拟的方式。(实际上UART也是可以正常接收的,需要将接收时的波特率提高到300000bps以上,稳定性待验证)
    在这里插入图片描述
  2. I/O口模拟。MCU的发送很简单,使用Nop延时即可。难的是接收部分,后面再详细讲。

MCU使用4MHz外部晶振,通过PLL倍频到16MHz。为了提高检测脉冲宽度的精度,使用TMR1来对SWI的脉宽测量,最小宽度63nS, 最大测试宽度为4ms,可以满足要求。
在这里插入图片描述

和时序相关的延时函数如下,都是通过等待TMR1的超时中断位来实现的:

void delay(uint16_t delay)
{
    // Clearing IF flag.
    PIR1bits.TMR1IF = 0;
    TMR1H = (delay >> 8);
    TMR1L = delay & 0xFF;
    T1CONbits.TMR1ON = 1;
    while(!PIR1bits.TMR1IF);
    PIR1bits.TMR1IF = 0;
    T1CONbits.TMR1ON = 0;    
}

void delay_ms(uint16_t ms)
{
    while(ms --)
    {
        // Clearing IF flag.
        PIR1bits.TMR1IF = 0;
        TMR1H = 0xC1;
        TMR1L = 0xA0;
        T1CONbits.TMR1ON = 1;
        while(!PIR1bits.TMR1IF);
    }

    T1CONbits.TMR1ON = 0;
    PIR1bits.TMR1IF = 0;
}

204A在每次操作之前都必须唤醒Wake,具体做法是将数据线拉低超过60uS即可,直接调用delay来实现。由于TMR1为累加到0xFFFF时就会产生溢出中断,所以实际延时周期是0xFFFF-X:

void swi_wake_token()
{
    SDA_OUTPUT();
    SDA_LOW();
    delay(0xFFFF - 1000);
    SDA_HIGH();
}

由于时序的要求,发送数据中途不能被中断打扰,所以必须关掉全局中断。MCU发送数据串的函数如下:

void swi_send_bytes(uint8_t count, uint8_t *buffer)
{
    uint8_t i, bit_mask;

    INTERRUPT_GlobalInterruptDisable();

    for(i = 0; i < count; i++)
    {
        for(bit_mask = 1; bit_mask > 0; bit_mask <<= 1)
        {
            if(bit_mask & buffer[i])    //!< Send Logic 1 (7F)
            {
                SDA_LOW();
                delay(0xFFFF - 2);
                SDA_HIGH();
                delay(0xFFFF - 410);    //310
            }
            else     //!< Send Logic 0 (7D)
            {
                SDA_LOW();
                delay(0xFFFF - 2);
                SDA_HIGH();
                delay(0xFFFF - 2);
                SDA_LOW();
                delay(0xFFFF - 2);
                SDA_HIGH();
                delay(0xFFFF - 310);    //225
            }
        }
    }
    INTERRUPT_GlobalInterruptEnable();
}

MCU接收部分就比较复杂,每检测到SDA脚上有电平变化时就开始TMR1计时,等到下次变化时对计时做出有效性判断。为了提高容错性,可以对判断的范围适当放宽一点。如果产生了超时中断,则说明收到逻辑1或者超时出错了:

ATCA_STATUS swi_receive_bytes(uint8_t *buffer, uint8_t length)
{
    ATCA_STATUS status = ATCA_SUCCESS;
    uint8_t i;
    uint8_t bit_mask;
    uint8_t pulse_count;
    uint16_t pulse_length;

    SDA_INPUT();
    INTERRUPT_GlobalInterruptDisable();

    PIR1bits.TMR1IF = 0; 
    TMR1H = 0;
    TMR1L = 0;
    T1CONbits.TMR1ON = 1;       

    //! Receive bits and store in buffer.
    for(i = 0; i < length; i ++)
    {
        buffer[i] = 0;
        for(bit_mask = 1; bit_mask > 0; bit_mask <<= 1)
        {
            pulse_count = 0;

            //! Wait for falling edge.            
            while(SDA_STATE() && !TMR1IF);

            TMR1H = 0;
            TMR1L = 0;
            if(PIR1bits.TMR1IF)
            {
                PIR1bits.TMR1IF = 0;
                status = ATCA_RX_TIMEOUT;
                break;
            }

            //! Wait for rising edge.
            while(!SDA_STATE() && !PIR1bits.TMR1IF);
    
            pulse_length = ((uint16_t)TMR1H << 8) | TMR1L;
            TMR1H = 0xFF;
            TMR1L = (0xFF-0x90);
            if(PIR1bits.TMR1IF)
            {
                PIR1bits.TMR1IF = 0;
                status = ATCA_RX_TIMEOUT;
                break;
            }

            if( pulse_length > (0x70-0x18) && pulse_length < (0x70+0x18))
            {
                pulse_count = 1;
            }

            //! Wait for falling edge.
            while(SDA_STATE() && !PIR1bits.TMR1IF);

            pulse_length = ((uint16_t)TMR1H << 8) | TMR1L;
            TMR1H = 0;
            TMR1L = 0;
            if(PIR1bits.TMR1IF)
            {
                PIR1bits.TMR1IF = 0;
                if(pulse_count == 1)
                    //! received "one" bit
                    buffer[i] |= bit_mask;
            }
            else
            {
                if( pulse_length > (0xFFC5-0x18) && pulse_length < (0xFFC5+0x18))
                {
                    //! Wait for rising edge.
                    while(!SDA_STATE() && !PIR1bits.TMR1IF);
                    pulse_length = ((uint16_t)TMR1H << 8) | TMR1L;
                    TMR1H = 0;
                    TMR1L = 0;                    
                    if(PIR1bits.TMR1IF)
                    {
                        PIR1bits.TMR1IF = 0;
                        status = ATCA_RX_TIMEOUT;
                        break;
                    }
                }
            }
        }
        
        if(i == 0)
        {
            length = buffer[0];
        }
    }
    
    INTERRUPT_GlobalInterruptEnable();

    SDA_OUTPUT();
    delay_us(TX_DELAY); //forcing tTURNAROUND (To CryptoAuthentication)

    return status;
}

如果MCU不是工作在16MHz下,pulse_length 的判断需要重新调整。

以上完成之后,需要实现几个HAL层的函数:

/**
 * \brief Send byte(s) via SWI.
 * \param[in] txdata    pointer to bytes to send
 * \param[in] txlength  number of bytes to send
 * \return ATCA_STATUS
 */
void hal_swi_send(uint8_t *txdata, int txlength)
{
    //! Send Command Flag
    swi_send_byte(SWI_FLAG_CMD);

    //! Send the remaining bytes
    swi_send_bytes(txlength, txdata);
}

/**
 * \brief Receive byte(s) via SWI.
 * \param[in] rxdata    pointer to where bytes will be received
 * \param[in] rxlength  pointer to expected number of receive bytes to
 *                      request
 * \return ATCA_STATUS
 */
ATCA_STATUS hal_swi_receive(uint8_t *rxdata, uint16_t rxlength)
{
    ATCA_STATUS status = ATCA_RX_TIMEOUT;
    int retries = 8;

    while(retries-- > 0 && status != ATCA_SUCCESS)
    {
        swi_send_byte(SWI_FLAG_TX);

        status = swi_receive_bytes(rxdata, rxlength);
        if(status == ATCA_SUCCESS)
            return ATCA_SUCCESS;
        
        delay_ms(2);
    }

    return status;
}

/**
 * \brief Send Wake flag via SWI.
 * \return ATCA_STATUS
 */
ATCA_STATUS hal_swi_wake()
{
    ATCA_STATUS status = ATCA_WAKE_FAILED;
    uint8_t response[4] = { 0x00, 0x00, 0x00, 0x00 };
    uint8_t expected_response[4] = { 0x04, 0x11, 0x33, 0x43 };

    swi_wake_token();

    delay_ms(3);

    status = hal_swi_receive(response, 4);
    if(status == ATCA_SUCCESS)
    {
        //! Compare response with expected_response
        if(memcmp(response, expected_response, 4) != 0)
            status = ATCA_WAKE_FAILED;
    }

    return status;
}

/**
 * \brief Send Idle flag via SWI.
 * \return ATCA_STATUS
 */
void hal_swi_idle()
{    
    swi_send_byte(SWI_FLAG_IDLE);
}

/**
 * \brief Send Sleep flag via SWI.
 * \return ATCA_STATUS
 */
void hal_swi_sleep()
{
    swi_send_byte(SWI_FLAG_SLEEP);
}

对于ATSHA204A常用的几个API 函数已经封装在atca_basic.c中,主要有:

void atCalcCrc()	// 计算发送数据包中crc的值
uint8_t atCheckCrc(const uint8_t *response)	// 检测收到的数据包中crc值中否正确
ATCA_STATUS atcab_read_serial_number(uint8_t* serial_number) //读序列号
ATCA_STATUS atcab_nonce(uint8_t *rand_out)	//执行Nonce命令取得随机数
ATCA_STATUS atcab_mac(uint8_t *challenge, uint8_t *digest) //执行Mac指令取得信息摘要

因为身份验证时MCU也需要执行SHA256的算法,所以需要在代码中实现这个功能。具体参考sha2_routines.c

身份验证的过程可以参考以下代码,

ATCA_STATUS SHA204_MAC(void)
{    
    osc_init();
    timer1_init();

    if(atcab_random(challenge) == ATCA_SUCCESS)
    {
        challenge[30] = challenge[30] ^ challenge[31];
        challenge[31] = challenge[31] ^ TMR1L;
        if(atcab_mac(challenge, digest_sha204) == ATCA_SUCCESS)
        {
            memset(MAC, 0x00, 88);
            memcpy(MAC, securit_key, 32);
            memcpy(MAC+32, challenge, 32);
            MAC[64] = 0x08;
            MAC[79] = 0xEE;
            MAC[84] = 0x01;
            MAC[85] = 0x23;
            sw_sha256(MAC, 88, digest_sw_sha);
            
            if(memcmp(digest_sha204, digest_sw_sha, 32) == 0)
                return ATCA_SUCCESS;
        }
    }    
    return ATCA_FUNC_FAIL;
}

其中用软件计算SHA256时的输入数据必须按下面的内容填充,要不然就得不到和SHA204A计算一样的结果。参考上面的代码中对MAC数组赋值的部分:
在这里插入图片描述

由于客户工程师软件开发能力有限,只会使用汇编语言,他们希望调用一个函数就可以实现了,所以这个函数中把MCU的初始化也加进去了。

主程序中直接调用SHA204_MAC函数即可完成一次验证过程,判断返回值为零时表示验证通过:

int main(void)
{        
    TRISB7 = 0;
    LATB7 = 1;
    
    while (1)
    {
        if(SHA204_MAC() == ATCA_SUCCESS)
            LATB7 = !LATB7;
        
        delay_ms(500);
    }
}

为了提高别人破解的难度,在不影响正常功能的前提下,可以在代码中很多位置调用这个函数来验证。如果验证通不过,就不执行程序。

编译成功后,Flash代码接近6KB,Data接近1KB。
在这里插入图片描述
实际完成一次验证过程,对16MHz的PIC18,只需要130mS。

好的工具可以让调试事半功倍,这里请出神器Saleae Logic。配合最新版本的软件,可以分析Atmel SWI接口,能按位,字节和包的形式显示出采集的数据,并且可以显示数据包中的数据结构如指令和CheckSum等:
在这里插入图片描述
Tokens:
在这里插入图片描述
Bytes:
在这里插入图片描述
Packets:
在这里插入图片描述

附件工程有两个编译选项,可以选择编译成库或完整应用:
源码下载. 使用MPLAB XIDE V5.xx

Atsha204a使用心得 最近公司要用到Atsha204a做软件和硬件的绑定加密,于是就调了它的驱动,将使用过程中遇到的坑整理下,也好让各位同仁少加点班;废话少说,直接入正题。 0.加密原理: 主控端和Atsha204a端有相同的16组密码,生成一组随机数,主控端用约定的一组密码使用sha256()加密算法生成Hash值(32 byte),同时主控将它用的随机数传给Atsha204a端,用与主控约定的一... 阅读详情

相关推荐

ATSHA204的C语言代码

这是单片机驱动ASHA204的C语言代码代码。在SAMD21单片机上测试可用。

atsh204a加密芯片i2c通讯介绍

两年前写了套加密芯片程序,现在有新需求. 一看代码,通讯细节一脸懵逼.特记录笔记如下: i2C通讯: 接收包结构: byte Name meaning 0 count 包的长度 1 to N-2 Date-Packet 协议包内容,每个命令的协议包内容组成都有差异 N-1 N checksum 两个字节的校验和 发...

hecong129的专栏 3502

atsha204 加密芯片驱动 全志平台

完整的atsha204 c 驱动,带烧写代码

USB TO I2C(上海同旺电子)调试器调试ATSHA204A--step6-读配置区地址0x15检查是否锁定

step6-读配置区地址0x15检查是否锁定1。step6-读配置区地址0x15检查是否锁定2。step6-读配置区地址0x15检查是否锁定3。返回数据:(ATSHA204A芯片已锁定)

weixin_69665239的博客 246

2025年数学建模美赛(MCM)C题阅读与思考

2025年数学建模美赛(MCM)C题阅读与思考

carefreekid123的博客 7339

超全!!snowboy语音唤醒(树莓派4b)

通过snowboy进行树莓派的语音唤醒

crimaster1024的博客 8734

ATSHA204A(五)——唤醒,休眠

1. 数据包 在 I2C 写数据包期间,ATSHA204A 会将发送的第二个字节解释为字地址,表示数据包功能,如下表所述。 2.唤醒 当器件唤醒时,它将遵循下列条件: 0:如果 SDA 为低电平且保持稳定,而 SCL 由低电平变为高电平再变为低电平,则将在总线上传输一个 0 位。当 SCL 为低电平时,SDA 可发生变化。 1:如果 SDA 为高电平且保持稳定,而 SCL 由低电平变为高...

口袋里的跳跳糖 1977

Cursor+Apifox MCP Server实战:5分钟搞定API自动化测试用例生成

本文详细介绍了如何利用Cursor IDE与Apifox MCP Server,在5分钟内将API文档自动转化为高质量的自动化测试用例。通过配置MCP Server建立数据桥梁,开发者可直接用自然语言指令,让AI基于真实接口规范生成可立即执行的pytest测试代码,大幅提升接口测试效率,特别适合快节奏的SaaS项目。

ooo22的博客 533

ATSHA204A加密芯片攻略——使用篇

ATSHA204A加密芯片是ATMEL公司研发的一款高安全性的,功能丰富的加密IC,使用SHA-256算法进行加密操作,内置16*32字节的slot(EEPROM)可以存储用户数据和秘钥,唯一的9字节序列号用于区分其他芯片,还有512bits的OTP区用于保存一些固定信息。芯片对外有2中通信方式,分别是单bus和i2c方式,本文所演示的全部使用I2C方式,但所有功能使用单bus方式也可以实现。 ...

a5882230的专栏 5万+

k8s集群部署私有镜像仓库

本文介绍了在Kubernetes集群中部署私有镜像仓库的完整方案。使用registry:2镜像创建Deployment,通过NodePort(30500)暴露服务,并采用hostPath(/data/registry)实现数据持久化。部署过程包括节点标记、YAML配置、资源创建及验证步骤,同时提供了Docker和Containerd两种环境下的详细使用方法,包括配置不信任私有仓库、镜像推送/拉取操作指南。该方案特别适合开发测试环境,为团队提供便捷的本地镜像管理能力。

weixin_42728286的博客 893

【深度学习】脸部修复,CodeFormer,论文,实战

Blind face restoration是一个高度 ill-posed 的问题,通常需要辅助引导来 1) 改善从降级输入到期望输出的映射,或者 2) 补充在输入中丢失的高质量细节。在本文中,我们展示了在一个小的代理空间中学到的离散码本先验可以通过将盲目的面部恢复建模为 a code prediction task来大大减少恢复映射的不确定性和模糊性,同时为生成高质量面部提供丰富的视觉元素。

q742971636的博客 2993

ATSHA204芯片手册阅读笔记

阅读ATSHA204英文文档过程记录的笔记

qq_40993639的博客 8880

“华为杯”研究生数学建模竞赛2016年-【华为杯】A题:多无人机协同任务规划

题分别求解,保证了攻击方无人机滞留在防御方雷达有效探测范围内的时间总和最小,接着,通过提出巡检待命无人机的设想,型无人机携带炸弹的具体清单和攻击的目标清单),保证攻击方的无人机滞留防御方雷。在使用基于贪心算法的覆盖法时,覆盖的目标点中必须首先不含配备雷达站的目标点。步优化保证攻击方的无人机滞留防御方雷达有效探测范围内的时间总和最小,需首先。的“灵巧”炸弹,采用抛投方式对地攻击,即投放后炸弹以飞机投弹时的速度作抛物。运动,当炸弹接近目标后,可主动寻的攻击待打击的目标,因此炸弹落点位于目标中。

getusushu的博客 1034

ATSHA204A加密芯片之--MAC校验代码

本文实现ATSHA204A 32字节随机数+16选1随机秘钥的MAC秘钥校验,如下是demo代码

hecong129的专栏 5641

10、现代统计方法:趋势面分析、薄板样条与广义线性模型

本文系统介绍了空间预测建模中的三种现代统计方法:趋势面分析(TSA)、薄板样条(TPS)和广义线性模型(GLM)。详细阐述了每种方法的原理、实现步骤、参数优化与预测评估,并结合R语言代码示例展示了在实际数据中的应用。文章还提供了方法对比流程图与土壤湿度预测案例,帮助读者根据数据特征选择合适模型,提升空间预测的准确性与可靠性。

play7的博客 157

vmvare kali如何配置桥接模式进行上网

注意点:虚拟机可以PING通物理机,但是PING不通其他的网站。经过收集资料,得知由于是校园网连接,所以DHCP只能分配一个授权的IP地址给连接的主机,由于KALI是桥接物理机,物理机已经获得了这个授权的IP,所以导致桥接的虚拟机无法上网。所以不是因为配置的有问题,而是网络的安全设置导致了桥接失败。如果你是使用校园网,可以换个网络试试,使用校园网的时候,可能会遇到桥接失败。

猿小白的博客 1409

atsha204a加密芯片使用攻略——配置篇

大家好,这是接上一篇使用篇的博客,本篇文章主讲atsha204a加密芯片的配置方式,前面讲到,atsha204a加密芯片内部rom分三个区域,一个是config zone,一个是slot zone,还有一个是OTP zone,本篇不只讲解config zone的配置,还讲解slot 和 OTP区域的配置方法,并且结合官方的库来演示一下代码。 首先约定一下,本文所有的通信接口均使用I2C协议,但所...

a5882230的专栏 3万+

WINCC7.3破解文件

WINCC7.3硬件够破解文件,有需要的下载!WINCC7.3硬件够破解文件,有需要的下载!

【加密芯片】加密芯片——ATSHA204A的使用

闲扯一下 好久没写博客了,技术之路在于坚持,长期写博客,总结,是对自己一个不错的锻炼,希望看到的博友能够坚持下去,一起互勉。 前言 最近由于公司产品需要,加班加点完成了这个项目的预研。加密芯片的目的,哪里都可搜索的到,这里就不多说,主要谈一些自己在接触中的一些心得,以及技术备注,以便以后查阅和使用。 资料参考列表: ATSHA204A加密芯片攻略——使用篇 atsha204a加密芯片...

it 2708

华为的C语言编程规范.pdf

华为技术有限公司内部技术规范。本规范制定了编写C语言程序的基本原则、规则和建议。从代码的清晰、简洁、可测试、安全、程序效率、可移植各个方面对C语言编程作出了具体指导。

SIMATIC S7-1200, S7-1500 PID 控制[手册]

SIMATIC S7-1200, S7-1500 PID 控制[手册]

加密芯片ATSHA204读序列号(Serial Number)

        近段时间一个项目使用了atsha204,硬件电路设计好后,需要设计一个程序来测试芯片是否正常工作,于是写了一个读Serial Number的程序。        本文参考了博文《atsha204a加密芯片使用攻略——配置篇》,该博文比较详细地说明了芯片该如何使用,更详细的芯片使用可以参考该文,这里不赘述了。        但是我也发现文章中的一些问题,以下内容都是我测试过可行的。 ...

lijunyan797的博客 9864

大中型超市收银系统(可直接运行)

光步前台收银系统系统功能:商品销售、商品退货、挂单、收银员权限、会员销售、单品取消、整单取消、商品查询、脱机销售、脱机数据上传,基本资料下载,开钱箱、小票打印、收款结算,支持多币种付款方式(现金、储值卡、礼券、微信等),支持多种促销。运行环境:.net 4.0登陆信息用户名:1001 密码:123456内置商品信息,商品编码可输入00001000 - 00010000,测试效果相关功能键F5 结算 F9挂单 F11商品查询 F8退货 Insert单品取消 Del整单取消 F12开钱箱F2 会员 Ctrl+Z退出系统 Home 锁屏 相关源码待公开

ATSHA204加密芯片介绍

1、认证流程:(1)主机(Host)生成256位摘要(挑战),发送给ATSHA204芯片(Client),进行挑战;(2)ATSHA204芯片使用HASH算法将摘要信息和自己的密钥进行计算,得到响应1;(3)同时,主机使用HASH算法将该摘要信息和自己的密钥进行计算,得到响应2;(4)主机将响应1和响应2进行比较,如果匹配,则认证成功。 2、RAM:存储输入命令和输出结果; EEPROM:包括数...

weixin_30673715的博客 408

加密芯片ATSHA204之使用

https://blog.youkuaiyun.com/a5882230/article/details/52214845 https://github.com/nsood/sha204

feitingfj的博客 5463

加密芯片法(一)ATSHA204A 特性理解

作用:在基本质询‑响应只用到一个密钥的基础上,GenDig 允许把芯片里“另一个槽(Slot)”里的数据(比如第二把密钥、设备 ID、计数器……)也一起“揉”进摘要里。通俗比喻:就像签合同的时候,不仅在合同上签字,还附上身份证扫描件+合同编号一起盖章,外人更难冒充。好处多层验证:多把“钥匙”同时参与,攻击者必须同时知道所有被混合的内容才能伪造响应。防中间人:即使有人在总线上动手脚、插入假数据,也因为摘要里“包含了真实芯片里数据”,所以伪数据无法通过验证。

你要拥有一个你喜欢并且热爱的人生 1万+

ATSHA204

主要特性: 1,SHA-256 Hash算法 2,有保证的唯一的72-bit序列号; DS28CN01 64-bit    不仅有软件加密,内部还有高质量硬件加密。 3,16个槽口的4kbits EEPROM:  4Kbits / 8 = 512Bytes 每个槽口32bytes 4,I2C接口, 单线接口 5, 和Atmel AT88SA102S,AT88SA10HS 6, i2c

sannik的专栏 8555

ATSHA204A加密认证防止设备仿冒风险

ATSHA204A通过挑战-响应机制和HMAC-SHA256算法实现硬件级设备身份认证,防止配件仿冒。其密钥不外泄、支持动态验证、具备物理防护能力,适用于医疗设备、打印机等高安全需求场景。

weixin_42452924的博客 1086

MICROCHIP微芯 ATSHA204A-MAHDA-T UDFN8 加密芯片

安全对称认证设备主机和客户端操作高级SHA-256哈希算法,具有消息认证码(MAC)和基于哈希的消息认证码(HMAC)选项。8引脚SOIC,8引脚TSSOP(2),3引脚SOT23,8焊盘UDFN和3引脚接触封装。内部高质量随机数生成器(RNG)4.5千字节的EEPROM用于密钥和数据。同类最佳的256位密钥长度;固定信息的 512位 OTP(一次性可编程)比特多种I/0选项。具有受保护的硬件基密钥存储的加密元素。2.0V到5.5V电源电压范围。1.8V至5.5V通信电压范围。<150纳安睡眠电流。

icgogo的博客 305
下一篇: 使用Python来操作Microchip安全芯片
FlyerInk
博客等级 码龄10年 187粉丝 8原创
评论 3
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值