法律状态公告日
法律状态信息
法律状态
2017-10-10
未缴年费专利权终止 IPC(主分类):H04L9/06 授权公告日:20140402 终止日期:20160815 申请日:20110815
专利权的终止
2014-04-02
授权
授权
2012-07-18
实质审查的生效 IPC(主分类):G06F21/00 申请日:20110815
实质审查的生效
2012-04-11
公开
公开
技术领域
本发明属于集成电路设计技术领域,具体涉及到一种适用于嵌入式系统的AES加速器。
背景技术
随着信息技术的飞速发展,计算机技术的突飞猛进使得越来越多的敏感信息将通过公开的媒介进行传播。为了保护敏感信息,各种密码算法被广泛地应用到网络和无线通信领域中。虽然目前有些密码算法通过增加额外的查找表来实现高速运算,但是所需的芯片面积较大,为了解决这个问题,本设计在通用处理器的基础上添加一些特殊指令与专用单元,并且使用cache(高速缓存)的部分资源来实现并行查找表的功能,从而有效地提高了密码算法的运算速度。
分组密码一直是密码学中一种重要的加密技术,在很多的密码系统中都处于核心地位,也可以作为消息认证技术、数据完整性机制以及数字签名中的核心部件。于2001年被美国国家标准和技术协会NIST定为美国政府新的加密标准的AES(Advanced Encryption Standard)算法是一种常见的分组密码算法,其应用场合见于诸多安全领域。AES是以块为单位对数据进行操作,它所允许的数据块和密钥的长度可以是128,192或256位。在AES标准算法中采用的数据块长度为128位,密钥长度可为128,192或256位。
发明内容
本发明的目的在于设计一种能加速AES算法的运算,同时能显著地降低硬件成本的适用于嵌入式系统的AES加速器。
附图1给出了集成了AES加速器嵌入式系统的基本框图,该系统由中央处理器(1)、指令高速缓存(2)、数据高速缓存(7)、缓存控制器(3)、总线接口部件(4)、总线(5)、外围存储器(8)以及AES加密运算单元(6)(即AES加速器)组成。该系统的工作过程如下:中央处理器(1)从指令高速缓存(2)中读取指令,如果指令不在指令高速缓存中,将通过缓存控制器(3)向总线接口部件(4)发出访问外围存储器(8)的请求,并通过总线(5)取回所需的指令,中央处理器(1)在取到指令后继续运行。接着,中央处理器(1)中的译码模块对指令进行译码,如果发现这条指令是AES加速器(6)的特殊指令,则根据该指令执行相应的操作。
本发明通过将查找表导入到4路组相连的cache中,并将查找表的数据锁存,这种方式能够有效地减小芯片的面积,从而降低了硬件成本。因此,本发明使用cache中的部分资源来充当并行查找表。
本发明可以从cache中并行地查找数据,并且完成相关数据的运算,因此能够实现高速的AES加解密运算,从而在有效地降低硬件成本的基础上实现快速的加解密运算。
本发明在中央处理器(1)中引入了8条特殊指令,它们分别是FETCHLOCK,LD_CACHELINE,CONFIG,CACHE_AES0,CACHE_AES1,CACHE_AES2,CACHE_AES3和SW_AES,这8条指令都是原系统指令集中所保留而未使用的指令,它们的指令编码分别为:
FETCHLOCK 011001xx_xxxxxxxx_xxxxxxxx_xxxxxxxx
LD_CACHELINE: 011010xx_xxxxxxxx_xxxxxxxx_xxxxxxxx
CONFIG: 011010xx_xxxxxxxx_xxxxxxxx_xxxxxxxx
SW_AES: 011011xx_xxxxxxxx_xxxxxxxx_xxxxxxxx
CACHE_AES0: 011100xx_xxxxxxxx_xxxxxxxx_xx001000
CACHE_AES1: 011100xx_xxxxxxxx_xxxxxxxx_xx001001
CACHE_AES2: 011100xx_xxxxxxxx_xxxxxxxx_xx001010
CACHE_AES3: 011100xx_xxxxxxxx_xxxxxxxx_xx001011
本发明的AES加速器使用12个32位寄存器以及上述特殊指令的译码逻辑,其中第0寄存器组(由第0寄存器、第1寄存器、第2寄存器、第3寄存器组成)和第1寄存器组(由第4寄存器、第5寄存器、第6寄存器、第7寄存器组成)用于交替存储当前需要进行轮变换的数据,第2寄存器组(由第8寄存器、第9寄存器、第10寄存器、第11寄存器组成)用于存储128bit的轮密钥,根据特殊指令产生控制信号,来控制数据在AES加密运算单元内的运算。
本发明中的AES加密运算单元(6)所采用的数据块长度是实际应用中最常见的128位,其加密轮数为10。其AES算法是一种迭代的算法,每一次迭代可以称为一轮(Round)。 它的加密流程如附图3所示,其主要运算包括行变换(ShiftRow)、字节替换(SubByte)、列混合(MixColumn)和密钥加(AddRoundKey)运算等。第0轮只进行一次密钥加运算,第1至9轮需要顺次经过这四种变换运算,而最后一轮不需要进行列混合变换。AES解密流程则是加密过程的完全逆过程,即第0轮只进行一次密钥加运算,第1至第9轮都要依次进行这四种运算的逆运算,最后一轮没有逆列混合运算,如附图4所示。附图5给出了传统的基于查找表的AES轮函数的实现,查找表操作完成了行变换、字节替换和列混合的运算。对AES,128-bit的轮输入被分成4个字,分别表示为W3i,W2i,W1i,W0i,这4个字的16个字节被标上b0到b15。每个字节用来索引四个具有256*32(比特)查找表中的一个,四个查找表分别用Ta、Tb、Tc、Td来表示。从四个查找表中得到的数据再与轮密钥中的数据进行异或可以得到一个新的字,依次执行四次类似的操作后,可以得到下一轮的输入。
本发明是对传统的基于查找表的创新,采用cache(高速缓存)的部分资源充当并行查找表。集成在通用处理器上的专用AES加速器的执行步骤如下:
首先执行特殊指令FETCHLOCK,将查找表的数据以及初始的轮函数的输入,从外围存储器预取并锁存到高速数据缓存中。接着执行指令LD_CACHELINE,将高速数据缓存中的初始的轮函数的输入和轮密钥分别写到寄存器组0与寄存器组2。然后执行指令CACHE_AES0、CACHE_AES1、CACHE_AES2和CACHE_AES3,这四条指令交替使用寄存器组0和寄存器组1中的内容生成访问查找表原始的索引T0[7:0]、T1[7:0]、T2[7:0]和T3[7:0]。再对原始的索引进行变换,得到访问高速数据缓存所需的索引Ta[11:0]、Tb[11:0]、Tc[11:0]和Td[11:0]。然后从4路组相连的数据高速缓存中,并行的取出4个32-bit的数据和寄存器组2中存储的轮密钥中的字进行异或,经过4次这样的操作后,得到下一轮运算的输入。在进行最后一轮的运算时,需要对Config寄存器进行配置,用于控制产生访问最后一轮所需查找表的索引,接下来产生最终的128-bit的输出。最后,执行指令SW_AES将AES运算的结果写回内存。
本发明的优点是充分利用了嵌入式系统中高速缓存的资源来充当AES并行运算的查找表,采用这种方式实现AES运算的加速只需较小的硬件代价,另一方面,完成10轮的AES的加解密运算的时间约为50个时钟周期,具有较高的加解密的吞吐率。本发明能够较好地应用于手持设备中的嵌入式系统。
附图说明
图1 一种适用于嵌入式系统的基于高速缓存的AES加速器。
图2 基于高速缓存的AES加密单元。
图3 AES加密流程图。
图4 AES解密流程图。
图5 传统的基于并行查找表的AES轮函数。
图中标号:1为中央处理器,2为指令高速缓存,3为高速缓存控制器,4为总线接口部件,5为总线,6为AES运算单元,7为数据高速缓存,8为外围存储器,9为中央处理器产生的地址信号,10为AES运算单元产生的查找表Ta的索引,11为AES运算单元产生的查找表Tb的索引,12为AES运算单元产生的查找表Tc的索引,13为AES运算单元产生的查找表Td的索引,14为第一多路器,15为第二多路器,16为第三多路器,17为第四多路器,18为查找表Ta,19为查找表Tb,20为查找表Tc,21为查找表Td,22为第一比较器,23为第二比较器,24为第三比较器,25为第四比较器,26为第一与门,27为第二与门,28为第三与门,29为第四与门,30为或门,31为第五多路器,32为4个字选多路器,33为异或门,34为替换算法模块。
具体实施方式
本发明中基于cache的AES专用加密单元如附图2所示,下面将以4路组相连,行大小为16字节,容量为16KB高速数据缓存为例,进一步描述本发明。
本发明具有2种工作模式:AES加密和AES解密。指令共有8种:FETCHLOCK,LD_CACHELINE,CONFIG,CACHE_AES0,CACHE_AES1,CACHE_AES2,CACHE_AES3和SW_AES。其中:
当需要执行AES加密运算时,FETCHLOCK指令将加密用的查找表数据和加密用的所有轮密钥,从外围存储器(8)中预取到高速数据缓存(7)中并将导入的数据锁住,通过将cache行的状态锁存位置为有效,并用这状态位去控制支持锁存操作的最近最少使用替换模块(34),使得预取的数据在进行AES加密运算过程中不被替换掉。
当进行第1轮的AES加密时,中央处理器(1)从指令高速缓存中(2)中去取指令LD_CACHELINE,如果指令不在指令高速缓存中,则通过缓存控制器(3)向总线接口部件(4)发出访问外围存储器(8)的请求,中央处理器的流水线将停顿直到取到指令后流水线继续工作。接着中央处理器中的译码模块对LD_CACHELINE指令进行译码,生成访问缓存的地址(9),缓存地址分别去访问高速数据缓存的4路,并将从4路中取出的标记与缓存地址(9)中标记的部分经过第一比较器(22),第二比较器(23),第三比较器(24)和第四比较器(4)找到该缓存地址对应的数据所在的路。并将其结果分别与cache行的有效状态位经过第一与门(26),第二与门(27),第三与门(28)和第四与门(29),得到各路命中的结果并经过一个或门(30)判断是否命中。从4路中取出的数据经过第五多路器(31)将命中的数据提供给中央处理器。执行LD_CACHELINE指令将128-bit的轮函数输入写入到寄存器组0,以及第1轮加密密钥从高速数据缓存中写入到寄存器组2中。
使用CONFIG指令对配置寄存器Config进行编程用于指示将进行加密运算。接着执行指令CACHE_AES0,CACHE_AES1,CACHE_AES2和CACHE_AES3,每条指令均生成访问查找表Ta(18),查找表Tb(19),查找表Tc(20)和查找表Td(21)的索引Ta(10),索引Tb(11),索引Tc(12)和索引Td(13),分别经过第一多路器(14),第二多路器(15),第三多路器(16)和第四多路器(17)得到访问高速数据缓存的索引。每条指令分别从cache中的查找表Ta、查找表Tb,查找表Tc和查找表Td中取出数据并经过字选多路器(32)从128-bit的行中选出相应的32-bit的数据,接着将获得的四个32-bit的数据与轮密钥中的字经过一个异或门(33),生成下一轮输入的一个字。这四条指令执行完成后,得到第2轮加密运算所需的输入数据。
随后进行第2轮的加密运算,LD_CACHELINE指令将第2轮加密密钥从高速缓存中导入到寄存器组2中,同理,执行指令CACHE_AES0,CACHE_AES1,CACHE_AES2和CACHE_AES3并生成第3轮加密的输入。第3-9轮的加密运算与第二轮的操作类似,第9轮加密产生了第10轮加密的输入数据。
接着执行第10轮加密运算,首先执行CONFIG指令,编程配置寄存器Config用于指示要进行最后一轮加密运算。最后一轮的加密运算与前9轮的不同之处是查找表不一样,因此需要控制生成访问另外4张表的索引信号,接着将第10轮的轮密钥导入到寄存器组2中,执行指令CACHE_AES0,CACHE_AES1,CACHE_AES2和CACHE_AES3并生成最终的密文。最后,执行SW_AES指令将加密得到的密文从寄存器组0中写回到内存中。
当需要进行AES解密运算时,FETCHLOCK指令将解密用的查找表数据和解密用的所有轮密钥,从外围存储器(21)中预取到高速数据缓存(22)中,并将查找表所在行的锁存位置成有效,以避免导入cache的查找表的数据被替换掉。
当进行第1轮的AES解密时,LD_CACHELINE指令将128-bit的原始输入,从cache中写入到寄存器组0中,并将第1轮解密密钥从cache中导入到特殊寄存器组2中,并使用CONFIG指令对配置寄存器进行编程用于指示是进行解密运算。接着执行指令CACHE_AES0,CACHE_AES1,CACHE_AES2和CACHE_AES3,得到第2轮解密运算所需的输入数据。
随后进行第2轮的解密运算,LD_CACHELINE指令将第2轮解密密钥,从高速缓存中导入到特殊寄存器组2中,同理,执行指令CACHE_AES0,CACHE_AES1,CACHE_AES2和CACHE_AES3并生成第3轮解密的输入。第3-9轮的解密运算与第2轮的操作类似,第9轮解密产生了第10轮解密的输入数据。
接着执行第10轮解密运算,首先执行CONFIG指令编程配置寄存器Config用于指示要进行最后一轮解密运算,最后一轮的解密运算与前9轮的不同之处使用的查找表不一样,因此需要控制生成访问另外4张表的索引信号,接着将第10轮解密的轮密钥导入到特殊寄存器组2中,执行指令CACHE_AES0,CACHE_AES1,CACHE_AES2和CACHE_AES3并生成最终的明文。最后,执行SW_AES指令将解密得到的明文从寄存器组0中写回到内存中。
本发明所设计的适用于嵌入式系统的AES加速器,输入密钥长度为128位,以较小的硬件代价实现了较高的加解密吞吐率。如采用中芯国际(SMIC)0.13μm标准CMOS工艺进行逻辑综合,最高时钟频率可达到150 MHz,核心电路等效门为6.5K。在将查找表数据和原始的输入导入cache的情况下,一次AES运算的时间约为50个周期,吞吐率达到384Mbps。
附录 AES加解密的程序:
aes_enc:
li $8, 0
CONFIG $8 //复位配置信息
lui $16, 0x9000 //设置轮密钥的基地址
ori $16,$16,0x6500
LD_CACHELINE 0x00,0xb0($16)//将128-bit的输入导入到寄存器组0
LD_CACHELINE 0x02,0x10($16) //将加密的第1轮密钥导入到寄存器组2
CACHE_AES0 $4 //执行第1次查表,将结果写入4号特殊寄存器
CACHE_AES1 $5 //执行第2次查表,将结果写入5号特殊寄存器
CACHE_AES2 $6 //执行第3次查表,将结果写入6号特殊寄存器
CACHE_AES3 $7 //执行第4次查表,将结果写入7号特殊寄存器
LD_CACHELINE 0x02,0x20($16) //将加密的第2轮密钥导入到寄存器组2
CACHE_AES0 $0 //执行第1次查表,将结果写入0号特殊寄存器
CACHE_AES1 $1 //执行第2次查表,将结果写入1号特殊寄存器
CACHE_AES2 $2 //执行第3次查表,将结果写入2号特殊寄存器
CACHE_AES3 $3 //执行第4次查表,将结果写入3号特殊寄存器
LD_CACHELINE 0x02,0x30($16) //将加密的第3轮密钥导入到寄存器组2
CACHE_AES0 $4 //执行第1次查表,将结果写入4号特殊寄存器
CACHE_AES1 $5 //执行第2次查表,将结果写入5号特殊寄存器
CACHE_AES2 $6 //执行第3次查表,将结果写入6号特殊寄存器
CACHE_AES3 $7 //执行第4次查表,将结果写入7号特殊寄存器
LD_CACHELINE 0x02,0x40($16) //将加密的第4轮密钥导入到寄存器组2
CACHE_AES0 $0 //执行第1次查表,将结果写入0号特殊寄存器
CACHE_AES1 $1 //执行第2次查表,将结果写入1号特殊寄存器
CACHE_AES2 $2 //执行第3次查表,将结果写入2号特殊寄存器
CACHE_AES3 $3 //执行第4次查表,将结果写入3号特殊寄存器
LD_CACHELINE 0x02,0x50($16) //将加密的第5轮密钥导入到寄存器组2
CACHE_AES0 $4 //执行第1次查表,将结果写入4号特殊寄存器
CACHE_AES1 $5 //执行第2次查表,将结果写入5号特殊寄存器
CACHE_AES2 $6 //执行第3次查表,将结果写入6号特殊寄存器
CACHE_AES3 $7 //执行第4次查表,将结果写入7号特殊寄存器
LD_CACHELINE 0x02,0x60($16) //将加密的第6轮密钥导入到寄存器组2
CACHE_AES0 $0 //执行第1次查表,将结果写入0号特殊寄存器
CACHE_AES1 $1 //执行第2次查表,将结果写入1号特殊寄存器
CACHE_AES2 $2 //执行第3次查表,将结果写入2号特殊寄存器
CACHE_AES3 $3 //执行第4次查表,将结果写入3号特殊寄存器
LD_CACHELINE 0x02,0x70($16) //将加密的第7轮密钥导入到寄存器组2
CACHE_AES0 $4 //执行第1次查表,将结果写入4号特殊寄存器
CACHE_AES1 $5 //执行第2次查表,将结果写入5号特殊寄存器
CACHE_AES2 $6 //执行第3次查表,将结果写入6号特殊寄存器
CACHE_AES3 $7 //执行第4次查表,将结果写入7号特殊寄存器
LD_CACHELINE 0x02,0x80($16) //将加密的第8轮密钥导入到寄存器组2
CACHE_AES0 $0 //执行第1次查表,将结果写入0号特殊寄存器
CACHE_AES1 $1 //执行第2次查表,将结果写入1号特殊寄存器
CACHE_AES2 $2 //执行第3次查表,将结果写入2号特殊寄存器
CACHE_AES3 $3 //执行第4次查表,将结果写入3号特殊寄存器
LD_CACHELINE 0x02,0x90($16) //将加密的第9轮密钥导入到寄存器组2
CACHE_AES0 $4 //执行第1次查表,将结果写入4号特殊寄存器
CACHE_AES1 $5 //执行第2次查表,将结果写入5号特殊寄存器
CACHE_AES2 $6 //执行第3次查表,将结果写入6号特殊寄存器
CACHE_AES3 $7 //执行第4次查表,将结果写入7号特殊寄存器
ori $8, $8,0x2
CONFIG $8 //指示要进行第10轮加密运算
LD_CACHELINE 0x02,0xa0($16) //将加密的第10轮密钥导入到寄存器组2
CACHE_AES0 $0 //执行第1次查表,将结果写入0号特殊寄存器
CACHE_AES1 $1 //执行第2次查表,将结果写入1号特殊寄存器
CACHE_AES2 $2 //执行第3次查表,将结果写入2号特殊寄存器
CACHE_AES3 $3 //执行第4次查表,将结果写入3号特殊寄存器
SW_AES $0,0xb0($16) //将运算结果写回内存
SW_AES $1,0xb4($16)
SW_AES $2,0xb8($16)
SW_AES $3,0xbc($16)
jr $ra
nop
.end aes_enc
aes_dec:
li $8, 1
CONFIG $8 //进行配置,指示将进行解密运算
lui $16, 0x9000 //设置轮密钥的基地址
ori $16,$16,0x6500
LD_CACHELINE 0x00,0xb0($16)//装载 128-bit密文和第0轮密钥异或后的结果到寄存器组0
LD_CACHELINE 0x02,0x10($16) //装载解密的第1轮密钥到寄存器组2
CACHE_AES0 $4 //执行第1次查表,将结果写入4号特殊寄存器
CACHE_AES1 $5 //执行第2次查表,将结果写入5号特殊寄存器
CACHE_AES2 $6 //执行第3次查表,将结果写入6号特殊寄存器
CACHE_AES3 $7 //执行第4次查表,将结果写入7号特殊寄存器
LD_CACHELINE 0x02,0x20($16) //装载解密的第2轮密钥到寄存器组2
CACHE_AES0 $0 //执行第1次查表,将结果写入0号特殊寄存器
CACHE_AES1 $1 //执行第2次查表,将结果写入1号特殊寄存器
CACHE_AES2 $2 //执行第3次查表,将结果写入2号特殊寄存器
CACHE_AES3 $3 //执行第4次查表,将结果写入3号特殊寄存器
LD_CACHELINE 0x02,0x30($16) //装载解密的第3轮密钥到寄存器组2
CACHE_AES0 $4 //执行第1次查表,将结果写入4号特殊寄存器
CACHE_AES1 $5 //执行第2次查表,将结果写入5号特殊寄存器
CACHE_AES2 $6 //执行第3次查表,将结果写入6号特殊寄存器
CACHE_AES3 $7 //执行第4次查表,将结果写入7号特殊寄存器
LD_CACHELINE 0x02,0x40($16) //装载解密的第4轮密钥到寄存器组2
CACHE_AES0 $0 //执行第1次查表,将结果写入0号特殊寄存器
CACHE_AES1 $1 //执行第2次查表,将结果写入1号特殊寄存器
CACHE_AES2 $2 //执行第3次查表,将结果写入2号特殊寄存器
CACHE_AES3 $3 //执行第4次查表,将结果写入3号特殊寄存器
LD_CACHELINE 0x02,0x50($16) //装载解密的第5轮密钥到寄存器组2
CACHE_AES0 $4 //执行第1次查表,将结果写入4号特殊寄存器
CACHE_AES1 $5 //执行第2次查表,将结果写入5号特殊寄存器
CACHE_AES2 $6 //执行第3次查表,将结果写入6号特殊寄存器
CACHE_AES3 $7 //执行第4次查表,将结果写入7号特殊寄存器
LD_CACHELINE 0x02,0x60($16) //装载解密的第6轮密钥到寄存器组2
CACHE_AES0 $0 //执行第1次查表,将结果写入0号特殊寄存器
CACHE_AES1 $1 //执行第2次查表,将结果写入1号特殊寄存器
CACHE_AES2 $2 //执行第3次查表,将结果写入2号特殊寄存器
CACHE_AES3 $3 //执行第4次查表,将结果写入3号特殊寄存器
LD_CACHELINE 0x02,0x70($16) //装载解密的第7轮密钥到寄存器组2
CACHE_AES0 $4 //执行第1次查表,将结果写入4号特殊寄存器
CACHE_AES1 $5 //执行第2次查表,将结果写入5号特殊寄存器
CACHE_AES2 $6 //执行第3次查表,将结果写入6号特殊寄存器
CACHE_AES3 $7 //执行第4次查表,将结果写入7号特殊寄存器
LD_CACHELINE 0x02,0x80($16) //装载解密的第8轮密钥到寄存器组2
CACHE_AES0 $0 //执行第1次查表,将结果写入0号特殊寄存器
CACHE_AES1 $1 //执行第2次查表,将结果写入1号特殊寄存器
CACHE_AES2 $2 //执行第3次查表,将结果写入2号特殊寄存器
CACHE_AES3 $3 //执行第4次查表,将结果写入3号特殊寄存器
LD_CACHELINE 0x02,0x90($16) //装载解密的第9轮密钥到寄存器组2
CACHE_AES0 $4 //执行第1次查表,将结果写入4号特殊寄存器
CACHE_AES1 $5 //执行第2次查表,将结果写入5号特殊寄存器
CACHE_AES2 $6 //执行第3次查表,将结果写入6号特殊寄存器
CACHE_AES3 $7 //执行第4次查表,将结果写入7号特殊寄存器
ori $8,$8, 0x3
CONFIG $8 //配置信息指示进行第10轮解密运算
LD_CACHELINE 0x02,0xa0($16) //装载解密的第9轮密钥到寄存器组2
CACHE_AES0 $0 //执行第1次查表,将结果写入0号特殊寄存器
CACHE_AES1 $1 //执行第2次查表,将结果写入1号特殊寄存器
CACHE_AES2 $2 //执行第3次查表,将结果写入2号特殊寄存器
CACHE_AES3 $3 //执行第4次查表,将结果写入3号特殊寄存器
SW_AES $0,0xb0($16) //将解密的结果写回内存
SW_AES $1,0xb4($16)
SW_AES $2,0xb8($16)
SW_AES $3,0xbc($16)
jr $ra
nop
.end aes_dec
机译: 适用于CAMELLIA,AES和SM4硬件加速器的可重新配置的Galois Field SBOX单元
机译: 基于存储器可用性和使用情况的加速器高速缓存的系统和方法
机译: 基于负离子的中性原子注入器束,其中包括适合产生负离子束的离子源,加速器和中和器,适用于产生中性原子束C的离子源,加速器和中和器功率约为5 MW。