加密芯片法(一)ATSHA204A 特性理解
加密芯片法
其实简单来说也就是,加密芯片与 MCU 相互认证, 认证通过后再读取程序运行,从而达到保护程序的目的。以 Atmel 公司推出的专用加密芯片 ATSHA204 为例,它采用哈希算法 SHA-256,具有体积小、安全性高等特点。 认证时主机发送一个 256 位的随机摘要信息到 ATSHA204 芯片 , 芯片将摘要信息和存储在芯片内的密钥一起通过 SHA256 算法计算出一个响应, 主机同时通过公钥算法计算该摘要信息的响应 , 两个响应进行对比,竟然说到这里就顺便把更多方法引出来了。
(在讲更多芯片加密法的应用之前,读者还需要明白一些专用名词,对于不接触芯片加密的读者起到知识补充的作用。重要)
下面把常见的几个术语用通俗的语言再解释一下:
质询(Challenge)
就是主机(MCU、手机等)随机生成的一串“问题”或“随机数”。
作用:用来每次“考”芯片,保证每次交互都是新的、不可重放的。
摘要(Digest)
摘要就是把“质询”+“密钥”或其它数据喂给哈希算法(如 SHA‑256)后得到的固定长度输出(通常 32 字节)。
特点:同样的输入总是同样输出,但想从摘要反推出原始数据或密钥几乎不可能。
MAC(消息认证码,Message Authentication Code)
也是一种摘要,但它“带钥匙”——通常指 HMAC‑SHA256:在散列前后加上密钥,安全性更高。
既能防止数据被篡改,也能验证消息的来源。
槽(Slot)/槽数据(Slot Data)
ATSHA204A 内部把 512 B 存储区分成 16 个“槽”,每槽 32 B。
你可以把每槽当成一个“抽屉”,存放不同用途的数据:密钥、校准参数、设备 ID 等。
访问权限(可读/可写)由配置区里的策略决定。
Nonce(随机数/一次性数字)
芯片内部还支持专门生成一个随机数,称为 Nonce。
在计算摘要时把这个 Nonce 一起加进去,进一步防止重放攻击。
GenDig(Generate Digest)命令
意思是“再生成一次摘要”(或多轮摘要),可以把“槽里的其他数据”或“第二把密钥”等一起混合到摘要里。
用途:多层验证、证明多项数据确实都来自芯片而非中间人。
DeriveKey(派生密钥)命令
每用一次,就把“当前密钥”+“系统值”(如计数器、随机数)再算一次 SHA‑256,生成新密钥替换掉旧密钥。
用于密钥滚动、防重放,以及生成仅在特定条件(时间、设备、会话)下有效的新密钥。
CheckMac(校验 MAC)命令
不直接返回完整摘要,而只给一个“对/错”(Yes/No)结果。
用途:保护正确摘要不被暴露,同时能验证输入的密码或消息是否正确。
Encrypted Read/Write(加密读写)
加密读:把读取请求先和摘要做一次异或(XOR),再返回给主机;主机本地再做一次 XOR,就拿到原始数据。
加密写:写入数据时同理,先异或摘要再写,芯片再异或回去。
用途:在普通总线上也能加密保护读写的数据内容。
配置区(Configuration Zone)
芯片内部的一段只在出厂或编程时写入、之后可以锁定的区(88 B)。
存放设备序列号、各槽的访问权限策略等。
OTP 区(One‑Time Programmable)
一次性只写一次、之后不可再改的存储区(64 B)。
常用来保存永久性、不可变更的标志或数据(熔丝记录等)。
到此为止,接下来就是对特性的阐述了,更多是笔者的汇总和应用总结,如下:
下面我把这段较为密集的技术描述,逐条拆开,用更通俗的语言来解释 ATSHA204A 支持的几类“加密操作”——也就是它的命令集和对应的安全特性。
1. 基本质询‑响应(Challenge‑Response)
做什么:主机(比如 MCU 或手机)随机生成一个“质询”数字,发给芯片;芯片把这个数字和它自己内部存的“秘密密钥”一起,跑一遍 SHA‑256(或 HMAC‑SHA256)算法,算出一个“响应”返回给主机。
为什么安全:
监听者只能看到“质询”和“响应”,但不知道密钥,就算截获了也算不出新的响应。
主机也有这把密钥,于是自己算一下、比对结果,就能确认芯片是真正知道密钥的那个“真芯片”。
2. GenDig (生成摘要的延伸,用多槽数据)
作用:在基本质询‑响应只用到一个密钥的基础上,GenDig 允许把芯片里“另一个槽(Slot)”里的数据(比如第二把密钥、设备 ID、计数器……)也一起“揉”进摘要里。
通俗比喻:就像签合同的时候,不仅在合同上签字,还附上身份证扫描件+合同编号一起盖章,外人更难冒充。
好处:
多层验证:多把“钥匙”同时参与,攻击者必须同时知道所有被混合的内容才能伪造响应。
防中间人:即使有人在总线上动手脚、插入假数据,也因为摘要里“包含了真实芯片里数据”,所以伪数据无法通过验证。
3. DeriveKey (密钥滚动/更新)
作用:每次用完一个密钥后,芯片可自动生成一个“新密钥”替换旧密钥。生成方式是把当前密钥和某个“系统值”(如计数器、随机数)一起跑 SHA‑256 算出来。
为什么要滚动:
防重放:即便截获一次密钥或一次响应,下次再用就不是同一把密钥了,旧信息失效。
限时/绑定:可以生成只在某台主机、某段时间、某个系列号下有效的新密钥,增强防盗版或防克隆能力。
例子:就像门禁卡,每刷一次就自动换一把锁芯,偷了旧钥匙也打不开下一次的门。
4. CheckMac (安全的“是/否”校验)
作用:芯片做完挑战‑响应后,不直接给出完整摘要,而只返回一个“OK/FAIL”(1 bit)的结果,让主机知道是否匹配,而不是把正确摘要完全暴露在总线上。
好处:即使你监听到“OK”,也不知道正确的摘要值是多少,进一步保护密钥不被破解。
额外应用:也能用来验证用户输入的密码:用户在外部输入密码发给芯片,芯片把它和存的密钥或参考值做摘要,然后只告诉外部“密码对不对”,密码本身和摘要都不暴露。
5. 加密读/写(Encrypted Read/Write)
Encrypted Read:
把主机准备的“质询+机密摘要”先在芯片里做一次 SHA‑256,然后把这个摘要跟某个数据槽里的内容做异或(XOR),再发回给主机。
主机自己也算出同样的摘要,再异或回来,就能看到原始数据;但监听者只看到“被异或过”的密文,无法直接看出真数据。
Encrypted Write:
主机把要写入的数据先和 SHA‑256 摘要做 XOR,再发给芯片;芯片拿摘要再异或一次,就得到原始数据写入对应槽里。
好处:在普通 I²C 总线上就能保证读写数据本身也被“加密”了一层,不怕别人扒线监视。
6. 防重放(Nonce 随机数)
Nonce 命令:在每次摘要计算中额外引入一个随机临时数(Nonce),保证每次摘要都不一样;即使是同一个质询、同一个密钥,两次响应也不同。
作用:彻底消除重放攻击的可能——监听者即便截获了之前的响应,也无法重复使用。
7. 底层加密算法:SHA‑256 / HMAC‑SHA256
ATSHA204A 全部基于行业标准 SHA‑256(或其 HMAC 扩展),这是当下各大政府和安全专家都认可的高强度哈希算法。
256 位密钥、256 位摘要,暴力破解几乎不可能。
下面给出一个典型的 MCU 端完整“基于 ATSHA204A(或同类 CryptoAuth 芯片)”的加密认证与保护流程。整个流程从上电启动,到最后安全地读写、运行主程序,涵盖了前面提到的所有命令和机制。
ATSHA204A 在芯片内部一共划分了三块 EEPROM 区域,每块用途不同、访问权限也不同:
区域 | 大小与结构 | 作用 | 命名法示例 |
---|---|---|---|
数据区 | 总共 512 B,分成 16 个小“槽(Slot)”,每槽 32 B(256 bit) | 存放密钥、校准参数、设备型号、用户数据等 可单独设置每槽的读/写权限 | Slot<YY> 表示槽编号 YY(0~15) |
配置区 | 88 B(704 bit)EEPROM 保存序列号、设备 ID 以及每个“槽”的访问策略 写入后可通过 LockConfig/LockValue 锁定 | 定义: 1. 芯片序列号和厂测数据 2. 各数据槽的读写权限策略 | SN<a:b> 表示序列号字段的第 a 到 b 字节 |
OTP 区 | 64 B(512 bit)一写即锁的不变区 一旦写入,数据永久不可改 | 存放一次性熔丝信息、出厂测试标志、只读常量等 | OTP<bb> 为第 bb 字节;OTP<aa:bb> 为字节范围 aa 到 bb |
1. 数据区(Data Slots)
为什么有槽(Slot)?
芯片给你 512 B,但往往需要存储多把密钥、校准值、版本号等不同用途的“数据包”,把它们分成 16 个 32 B 的“抽屉”更灵活。
访问策略怎么定?
配置区里为每个槽设定“谁能读/写”。常见做法是:
槽 0:只读主秘钥
槽 1:读/写临时校准参数
槽 2:只读设备型号
……
2. 配置区(Configuration Zone)
干什么用?
器件身份:存芯片的唯一序列号(SN)。
权限管理:告诉芯片“槽 0 只能读、槽 1 既能读又能写、槽 2 只能写”……这组规则写好后,可以通过两个锁(LockConfig, LockValue)彻底生效并不可再修改。
锁定时机:
在写配置区之前,LockConfig 必须保持默认(可写)。
写完后,把 LockConfig 置成 0x55 以外的值,就彻底锁死配置。
同时设置 LockValue,才让这些读写规则在后续访问时真正生效。
3. OTP 区(One‑Time Programmable)
什么是 OTP?
一写就锁死(One‑Time Programmable),写入一次后永久不可再改。
典型用途:
存放出厂时的测试结果、熔丝计数等一旦写入就不应变更的数据。
可看作“硬熔丝”——一旦烧录,后续任何读操作都能看到该值,但写操作不被允许。
在后续阅读芯片手册或 API 文档时,会频繁遇到下面这些术语,理解它们能帮助你快速掌握各命令参数含义。
术语 | 含义 |
---|---|
块(Block) / 槽(Slot) | 在 SHA‑256 的世界里,一个“块”是 256 bit(32 B)的数据输入单元; 在 ATSHA204A 存储划分中,“槽”就是一个块(每槽 32 B)。 |
param<b> | 在命令格式中出现的“参数字节”,b 表示这个参数是第 b 个字节。 |
SRAM | 芯片内部的工作 RAM,用于命令执行时的输入/输出缓冲和临时状态保存,不是持久存储区。 |
“块(Block)”的双重含义
SHA‑256 算法层面:算法每次处理 512 bit 的输入,分两轮 256 bit(32 B)块计算。
存储层面:芯片把存储空间也拆成若干 32 B 块(即“槽”),对应术语可以互换使用。
param<b>
例如命令 Read param<1>=0x02
就意味着:命令字的第 1 个参数字节为 0x02。
SRAM
EEPROM/OTP/配置区都是非易失的持久存储;而 SRAM 完全是临时用的,掉电后数据丢失,用于算法执行或临时数据交换。