前言
去年换工作的时候,看到FPGA可能用到加密解密策略,查找了一些FPGA加密案例资料:AES128、AES256、SM3、SM4。其中AES加密解密的数据不能流水式连续进行;SM3只能加密不能解密;SM4加密和解密的数据可以流水式连续进行,但是处理时间相对较长。
伪随机序列,虽然具有周期性;如果在FPGA中随机时间去获取伪随机序列值,该值具有随机性,在工程中可结合上位机交互生成密钥。
本文分享之前空闲时间获取的SM4资料和代码。有需要代码的请留言/私信。
目录
关于AES128:
基于FPGA的AES128加密解密实现
一、密钥产生
1.1 、伪随机数据
常用的伪随机数据产生方法:线性反馈移位寄存器、线性同余生成器。这类方法实现简单,成本低,伪随机。
1.2 、真随机数(上位机参与)
如果FPGA与上位机有通信接口,键盘输入的数据具有真随机性,不可预测,可以下发到FPGA作为密钥,或者获取系统时间进行处理,也可作为密钥使用。这种方法成本也低,需要人机交互。
1.3 、真随机数(器件)
一些芯片可以产生噪声数据,这些数据也具有真随机性。这种方案需要额外器件成本。
1.4 、生产环境
在实际应用场景中,密钥的生成大都需要人为操作。上述方案混合着使用,比如LFSR、上位机交互混合着使用,产生的数据具有真随机性,成本也较低。
二、SM4加密
SM4是一种128位分组对称密码算法,包括密钥扩展和加解密两部分。采用32轮非线性迭代,涉及到异或、合成置换、非线性迭代、反序变换、循环移位以及S盒变换等操作。解密仅需加密密钥反序使用。
SM4适用于大数据流处理,处理结果延时200 clk周期左右。
2.1 、加密流程
SM4加密流程如下:32轮迭代处理
2.2 、加密过程
SM4输入数据128bit分成4个32bit数据X0、X1、X2、X3;
第一轮迭代:
X1、X2、X3异或,结果与rk0(下小结阐述计算)异或;
上述异或值32为分成4个8bit,分别进行S盒变换(非线性变换),变换结果组成32bit;
上述结果分别循环左移2位、10位、0位、18位、24位,并进行异或处理;
上述结果与X0异或后得到X4。
经过32轮迭代后,可获得X4、X5、......、X34、X35,将X35、X34、X33、X32这128bit作为加密结果。
2.3 、轮密钥rk
轮密钥rk(i) = K(i+4),其生成流程如下,需要32轮迭代
其中系统参数FK(k)为128bit的固定值,固定参数CK(i)也为32个固定的32bit数据。
数据输入为128bit的密钥KEY,分为4组32bit MK0、MK1、MK2、MK3;初始密钥KEY与系统参数FK进行异或;结果值为128bit,分为4组K0、K1、K2、K3;
第一轮迭代:
K1、K2、K3异或,再与CK0异或;
上述结果分为4组8bit,分别进行S盒变换,组成32bit数据;
上述32bit分别进行循环左移13位、0位、23位,并进行异或;
上述结果与K0进行异或,得到K4即rk0。
经过32轮迭代后,可获得K4、K5、......K34、K35即rk0、rk1、......rk30、rk31。
2.4 、S盒变换
S盒变换是SM4算法中唯一的非线性变换,查找表方法:输入为8 bit,其中,高4bit为查找表的行信息,后4bit为查找表的列信息。行列都从0开始。
以16进制表示,每个S盒元素8bit,每行共有16个8bit S盒元素,共有16列。例如当输入的8bit数据为0x12时,S盒变化输出为0x9A(1行2列所在元素)
2.5 、系统参数FK、固定参数CK
系统参数FK0、FK1、FK2、FK3分别为32'hA3B1BAC6 32'h56AA3350 32'h677D9197 32'hB27022DC。
固定参数CK0~CK31分别为:
00070E15 1C232A31 383F464D 545B6269
70777E85 8C939AA1 A8AFB6BD C4CBD2D9
E0E7EEF5 FC030A11 181F262D 343B4249
50575E65 6C737A81 888F969D A4ABB2B9
C0C7CED5 DCE3EAF1 F8FF060D 141B2229
30373E45 4C535A61 686F767D 848B9299
A0A7AEB5 BCC3CAD1 D8DFE6ED F4FB0209
10171E25 2C333A41 484F565D 646B7279
三 、 测试
分别进行仿真和上板测试,为了测试简便,密钥通过多个伪随机数据拼接而成,初始化向量IV不启用。
3.1 、仿真测试
伪随机数据产生密钥:503d0115a7589321a8bd30f2c9473dc1
待加密数据为6个连续数据:00000001000000010000000100000001~00000006000000060000000600000006
整个仿真流程:
加密结果:
解密结果:能正确解密
根据仿真结果整理如下:
待加密数据 | 加密结果 |
00000001000000010000000100000001 | b16c5c7e18de0e14680bcd788e3d030d |
00000002000000020000000200000002 | c5b4f5552a1fd62eac5c00171ad75fb3 |
00000003000000030000000300000003 | a768d3ce3d9acec3ba1b4f3db98ea501 |
00000004000000040000000400000004 | 177fe2858687078d34f30a10c84de70c |
00000005000000050000000500000005 | f7c0dd9690e4cbb1b55d39e432d7d5c1 |
00000006000000060000000600000006 | 6e8d44b06f9141ea3eb2c2951c3c03a8 |
根据在线网站验证加密、解密结果:
加密验证:在线验证结果与仿真一致
解密验证:仿真解密与在线网站解密结果相同。
3.2 、上板测试
上板时钟为250MHz。
VIO设置取样密钥:
密钥结果为:4c6321d4d57d30a4fe41e498aa274e1f
待加密数据同样为6个连续数据:
00000001000000010000000100000001~00000006000000060000000600000006
VIO设置加密开始:
加密结果为:
整理如下:
待加密数据 | 加密结果 |
00000001000000010000000100000001 | 1af0a55e0ac847a67fa4ce38bbb0439b |
00000002000000020000000200000002 | 78400bff16757ea6de7e79ba09575c47 |
00000003000000030000000300000003 | 8c8114680dce6f3f9f24d82d6aec4c19 |
00000004000000040000000400000004 | fa06b6ad8323095212dfc2652763190a |
00000005000000050000000500000005 | 09d8e39ee1ea59ac3020ee8b842bfcbe |
00000006000000060000000600000006 | 7ec094347f00ec1428342261f31b4b1a |
解密结果能正常还原:
用在线网站进行对比验证:
加密结果验证:
解密结果验证: