SMEC98SP加密芯片事例程序说明
本事例程序提供了两部分的代码:
- SMEC98SP加密芯片的代码;
- 外部MCU的代码。
事例提供了MCU借助于加密芯片来保护方案不被外界破解的典型例子。开发者可以根据自己的需求,定义出适合自己的加密方案。
目录
功能说明
1.获取SMEC98SP的UID号
事例程序提供了通过I2C通讯获取SMEC98SP加密芯片的12字节硬件ID号的方法。
利用此ID号,可以拓展一些应用,如:一卡一密等,即每个芯片可以设计成不一样的密钥,而只需一套主密钥。
一卡一密的设计,可借用金融PBOC卡的密钥分散概念来设计,即:利用主密钥,对芯片ID做3DES运算,并将运算结果作为该卡的密钥。
示意图:
2.产生MCU及加密芯片的随机数
SMEC98SP加密芯片具有硬件随机数发生器,本例程提供了获取SMEC98SP随机数的方法。
一般的单片机很少有硬件随机数发生器,所以我们针对不同类型的MCU设计了不同的随机数产生方式:
- 具有A/D数模转换的MCU随机数的产生:
利用ADC悬空引脚(通过读取悬空模拟针脚值)产生随机数种子,再将该随机数种子,与MCU的UID和加密芯片的UID作运算(异或运算), 使得即使相同情况下,使用不同的MCU或加密芯片,其随机数种子也不相同。
PIN码原理:MCU和加密芯片分别存放着相同的PIN码,MCU运行时,可以通过I2C发送PIN码给加密芯片进行验证,如果PIN码相同,且返回结果与预期一致,则认为加密芯片合法,否则认为加密芯片非法,而停止工作。
您可以利用SMEC98SP的UID,将PIN码验证优化一下,如:可以将每个加密芯片的PIN码设计成跟UID相关,MCU先获取SMEC98SP的UID,然后计算出对应的PIN码值,再进行验证,再判断与预期是否一致。
优点:PIN码验证实现简单,不需要添加额外的算法代码。
缺点:PIN码会在I2C线路上传输,容易被攻击者监听并破解。也可被攻击者跳过“真值点”攻击。
安全程度:★★
示意图:
内部认证原理:MCU向SMEC98SP发送8字节随机数, SMEC98SP用内部认证密钥将随机数进行3DES加密后回送给MCU, 由MCU判断回送数据的合法性。
优点:密钥不会在线路上传输,不怕攻击者监听I2C通讯数据。
缺点:密钥值会存放在MCU中,如果攻击者将MCU解密,并仿真调试,有可能找出该密钥。也可被攻击者跳过“真值点”攻击。
安全程度:★★★★
示意图:
外部认证原理:MCU先获取SMEC98SP的8字节随机数, 然后MCU用外部认证密钥对随机数做3DES加密,再将密文送给SMEC98SP,然后由SMEC98SP判断该密文的合法性。
优点:密钥不会在线路上传输,不怕攻击者监听I2C通讯数据。
缺点:密钥值会存放在MCU中,如果攻击者将MCU解密,并仿真调试,有可能找出该密钥。也可被攻击者跳过“真值点”攻击。
安全程度:★★★★
示意图:
6.SHA1哈希算法认证
SHA1哈希算法认证原理:SHA1为一种摘要算法,就是把任意长度的输入,通过散列算法,变换成固定长度(32字节)的输出,该输出就是摘要值。
哈希算法具有单向性,即通过一组输入数据,可以得到一组固定长度的输出(摘要),但通过输出,是不可以还原输入值。
SHA1利用这种特性,可以将输入数据前面的一部分作为密钥值,分别存放于MCU及加密芯片中。MCU在做SHA1算法认证时,只需将部分数据传给加密芯片,由SMEC98SP内部再将“密钥值”+ “输入数据”一起做SHA1运算,并回送“摘要值”,MCU再判断跟预期的值是否一致,实现SHA1算法认证。
优点:密钥不会在线路上传输,不怕攻击者监听I2C通讯数据。密钥长度及每次输入数据长度可以变化
缺点:密钥值会存放在MCU中,如果攻击者将MCU解密,并仿真调试,有可能找出该密钥。也可被攻击者跳过“真值点”攻击。
安全程度:★★★★
示意图:
将 MCU 中的一部分关键代码,放入加密芯片中运行,当需要用到SMEC98SP中的算法时,由MCU 向SMEC98SP 发送指令,SMEC98SP 根据指令,在内部运行,返回结果给MCU。数据在I2C线路上传输,可以使用过程密钥加密的方式传输。
我们例程中写了一个算圆周长的简单示例,具体实现如下:
1. 加密芯片中存储算圆周长关键算法(周长C = 2 *π* R)
2. 由 MCU 发送算圆周长指令:72 00 00 01 03 (R = 03)
3. 加密芯片根据 R 值,利用周长公式,算出周长0x12,返回给MCU。
优点:关键算法在加密芯片中,即使MCU 被破解,并被理解反汇编代码,也无济于事。
缺点:暂无
安全程度:★★★★★
示意图:
针对很多控制类需求,没有"关键算法"可以存放在加密芯片中,例程中构造了一个算法:取PA端口数据2字节,用过程密钥加密后,送给SMEC98SP,再由SMEC98SP解密后取反,再由过程密钥加密回送给MCU。这样就“构造”出一个算法。
如PA = 0x0000, 用过程密钥加密送给SMEC98SP, SMEC98SP解密后得到0x0000, 取反后为0xFFFF, 再用过程密钥加密给MCU,主控MCU解密后得到0xFFFF。这样, 判断IO口数据方式,只要跟之前相反就可以. 比如说PA0 高电平才做的动作, 调用了这个函数后,则判断PA0为低电平去做。
由于每次上电,过程密钥是临时产生的, 并且是变化的,这样即使PA口数据相同,在线路上通讯的数据也是不同的,而MCU程序又是基于"运算结果"而工作的,从而增加了破解难度,可以防止"真值点"攻击。
优点:数据被过程密钥加密传出,即使相同数据,每次在线路上传输的内容也不一样。
缺点:毕竟是“构造”出来的算法,算法复杂度不高。攻击者拿到MCU的汇编代码后,仿真调试,还是有可能将构造算法逆推。
安全程度:★★★★☆
示意图:
SMEC98SP内部有24K字节程序区及8K字节数据区域。其中8K字节的数据区域可以设计成自由度写,也可以设计成需要一定权限(如验证PIN,内部认证等)才能读写,还可以设计成密文方式读写。
样例中,设计了利用过程密钥密文读取数据方法。由于过程密钥每次是变化的,这样即使是相同的数据,每次读出来,在线路上传输的内容也是不一样的。
优点:数据被过程密钥加密传出,即使相同数据,每次在线路上传输的内容也不一样。
缺点:密钥值会存放在MCU中,如果攻击者将MCU解密,并仿真调试,有可能找出该密钥。
安全程度:★★★★
示意图:
事例程序提供了明文读取SMEC98SP中8K数据区域的方法,样例中数据的起始地址是以字节为单位。开发者可以根据自己的情况,决定是否允许读取数据或者读取数据的相关权限。
事例程序提供了明文写SMEC98SP数据区域的方法,样例中数据的起始地址是以字节为单位。开发者可以根据自己的情况,决定是否允许写入数据或者写入数据的相关权限。
名词解释:
DES算法
DES算法是一种比较传统的加密方式,其加密运算、解密运算使用的是同样的密钥,信息的发送者和信息的接收者在进行信息的传输与处理时,必须共同持有该密码(称为对称密码),是一种对称加密算法。DES是安全性比较高的一种算法,除了穷举外,没有其他方法可破解。DES—密钥长度为8字节,数据为8字节。
3DES算法
3DES是针对DES算法密钥过短、而改进的一个措施,被称为“3DES”。其实是通过执行3次DES来达到增加密钥长度和安全。3DES—密钥长度为16字节,数据为8字节。
过程密钥
过程密钥是一种会话密钥(session key),是在使用过程中,基于主密钥而临时生成的加解密密钥,会话结束后,过程密钥失效。
密钥分散
密钥分散算法简称Diversify,是指将一个双长度的密钥MK,对分散数据(也叫分散因子,如:卡号等)进行处理,推导出一个双长度的密钥DK。
推到DK左半部分的方法是:
1、将分散因子的最右8个字节作为输入数据;
2、将MK作为加密密钥;
3、用MK对输入数据进行3DES运算;
推到DK右半部分的方法是:
1、将分散因子的最右8个字节求反,作为输入数据;
2、将MK作为加密密钥;
3、用MK对输入数据进行3DES运算;
这样MK根据分散因子,可以得到分散密钥DK。但根据DK,却无法得到MK。
附件1 – 例程密钥值
事例程序中,MCU及SMEC98SP加密芯片的各密钥值如下:
内部认证密钥:00 01 02 03 04 05 06 07 08 09 0A 0B 0C 0D 0E 0F
外部认证密钥:10 11 12 13 14 15 16 17 18 19 1A 1B 1C 1D 1E 1F
SHA1哈希算法认证密钥:20 21 22 23 24 25 26 27 28 29 2A 2B 2C 2D 2E 2F
产生过程密钥的主控密钥:30 31 32 33 34 35 36 37 38 39 3A 3B 3C 3D 3E 3F
PIN码:55 66 77 88 99 AA BB CC
声明:本事例程序,只是提供了如何利用SMEC98SP保护方案不被破解的样例,开发者可以根据自己的需求,参照本例程,设计自己的加密保护方案。千万不要使用我们例程同样的密钥值!另外在MCU中,我们建议每组密钥值请打散后分开存放于不同地方,这样即使在攻击者把MCU解密后,也很难拼凑出完整的密钥值。
附件2 – SMEC98SP样例指令
;Pin认证
--> 70 00 00 08 55 66 77 88 99 aa bb cc
<-- 9000
;哈希算法认证
--> 71 00 00 10 00 01 02 03 04 05 06 07 08 09 0A 0B 0C 0D 0E 0F
<-- 9000 3BD683BFC40F33254DE1BD6D0C2650BA1D07A56A
;实现一个简单算法,计算圆周长,外部输入的是半径,计算出周长。C = 2*3.14*R
--> 72 00 00 01 02
<-- 9000 0C
;外部认证,先取随机数,再做认证
--> 84 00 00 08
<-- 9000 D309685B156B398B ;随机数每次不同
--> 82 00 00 08 7fa49dbf221a8751 ;根据随机数,外部认证密钥计算
<-- 9000
;取芯片唯一序列号
--> 83 00 00 0C
<-- 9000 33D60D08844C905016707726 ;每个加密芯片不同ID号
;取随机数
--> 84 00 00 08
<-- 9000 27F5EEDC149FE9FB
;内部认证
--> 88 00 00 08 11 22 33 44 55 66 77 88 ;假设主控芯片随机数1122334455667788
<-- 9000 56BE32F01E736D0D
;产生过程密钥 先取SMEC98SP的随机数, 再送入随机数, 计算出过程密钥
--> A0 00 00 08 11 22 33 44 55 66 77 88 ;假设主控芯片随机数1122334455667788
<-- 9000 2E2AB595F5186905 ;SMEC98SP随机数每次不同
;过程密钥为:fede17ed454baa2e (303132333435363738393A3B3C3D3E3F =>(1122334455667788 ^ 2E2AB595F5186905)3DES加密结果)
;端口数据运算
--> A2 00 00 08 df51daa6c1fdb929 ;假设端口数据为:0000, 过程密钥:fede17ed454baa2e,(传入数据:df51daa6c1fdb929 为过程密钥fede17ed454baa2e 对 0000000000000000(端口数据0000+6字节00填充)做DES加密 )
<-- 9000 C0E7FECFABB13417 ;输出数据C0E7FECFABB13417,用过程密钥解密后为ffffffffffffffff, 即为0000000000000000的取反"算法", 该"算法"可以根据需要修改
;读取FLASH
--> B0 00 00 10
<-- 9000 FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
;密文读取FLASH
--> B1 00 00 10
<-- 9000 C0E7FECFABB13417C0E7FECFABB13417 ;用过程密钥fede17ed454baa2e解密后为FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
;写FLASH
--> D6 00 00 10 0102030405060708090A0B0C0D0E0F10
<-- 9000
转载自原文链接, 如需删除请联系管理员。
原文链接:SMEC98SP加密芯片方案实例,转载请注明来源!