SSE2与AES-NI在密码算法中的应用*

2016-02-24 08:34苗旭东郑秀林李艳俊
北京电子科技学院学报 2016年2期
关键词:指令集密钥指令

苗旭东郑秀林李艳俊

SSE2与AES-NI在密码算法中的应用*

苗旭东2**郑秀林1,2李艳俊1

1.北京电子科技学院信息安全系,北京 100070; 2.西安电子科技大学通信工程学院,西安 710071

密码算法的实现效率是衡量一个密码算法好坏的重要指标。传统密码算法是基于比特(A5算法)、字节(AES算法)、32位字(IDEA)设计的,软件实现速度相对较慢,而在最近的CAESAR竞赛中,基于快速指令集设计的一些算法,例如MORUS、AEGIS,它们的软件实现速度是非常快的。本文选择了两种非常有代表性的指令集SSE2与AES-NI进行研究,研究这两种指令集在密码算法中的使用方法,以及这些指令集应用到密码算法中会提升效率,通过对这两种指令集的研究,指出了使用指令集在密码算法中的优势。

SSE2;AES-NI;指令集

引言

本文的讨论范围是基于软件实现的密码算法,目标实现平台是当前的CPU处理器。设计密码算法时,一般都会考虑密码算法的实现效率问题,密码算法如何设计才能实现起来更快、占用内存资源更少?这需要考虑目标实现平台所擅长执行的操作。传统的对称密码是基于比特(A5算法)、字节(AES算法)或32位字(IDEA算法)设计的,一般来说,基于字节设计的密码算法要比基于比特设计的密码算法软件实现更有效,而基于字设计的密码算法要比基于字节设计的密码算法软件实现更有效,而目前的CPU处理器上集成有很多处理更长数据块的操作指令,如SSE2指令集(可处理128位的数据)、AVX2指令集(可处理256位的数据)和AES新指令集AES-NI(处理128位的数据),这些指令集可以用到密码算法的设计和实现中,例如,目前正在进行的CAESAR竞赛[1]中基于SSE2指令集设计的MORUS-640算法[2]的软件实现效率可达1.11cycle/byte,基于AVX2指令集设计的MORUS-1280算法[2]的软件实现效率可达0.69cycle/byte,基于 AES-NI实现的 AEGIS-128算法[3]的软件实现效率可达 0.61cycle/ byte。可以看出,使用指令集设计的密码算法实现效率很高,这可能是未来几年设计密码算法的一个趋势。本文以SSE2指令集和AES-NI为例,介绍这两种指令集的功能和使用方法,测试它们的实现效率,并分析了在密码算法中使用这两种指令后可提升的效率。

1 SSE2指令集

SSE2指令集[4]是在2000年出现的奔腾4处理器、至强处理器中引入的,目前的CPU处理器中几乎都集成有SSE2指令集,它主要利用的是SIMD(single-instruction multiple-data)模型以提升数据操作的速度,即执行一条指令并行处理多组数据。SSE2指令最大可操作128位的整数,在密码算法中,通常都是对整数的操作,这也是本文研究SSE2指令集的原因。

1.1 几条典型SSE2指令的功能与使用

在对称密码算法中,通常选择运算速度快、扩散效果好、混乱性好的操作,比较常用的几种操作是:异或操作、移位操作、逻辑与操作、模加运算。本文会从SSE2指令集中选择一些与这几种操作相关的指令,并对它们的实现性能进行研究。

表1列出了4条非常具有代表性的SSE2指令,并列出了每条指令的名称,大致描述了每条指令实现的功能,同时给出了每条指令对应的C语言函数[5]。

表1 SSE2指令

其中,PXOR指令是对128位的整数a与b做异或操作、PAND指令是对128位的整数a与b做逻辑与操作,PSLLDQ指令是对128位的整数a左移8×imm8位,PADDD指令是将128位的整数a与b分别分成4个32位的字,对应字分别做模232加法运算。

1.2 SSE2指令集的实现效率

了解这4条SSE2指令的实现功能后,下面的实验将测试这4条SSE2指令的实现效率,为了与普通指令的实现效率做对比,在相同平台下也测试了与SSE2指令对应的普通指令的实现速度。

实验环境:在Intel(R)Core(TM)2 Duo E8400@3.0GHz的处理器上执行,32位Windows7操作系统,编译器为vs2010。未使用任何加速技术,编程用标准C语言实现。C语言测试 SSE2指令需要加头文件#include" emmintrin.h"。

表2列出了测试所得数据,表中给出执行一条SSE2指令平均需要的时钟周期数,并且在紧接着SSE2指令测试数据的下一行给出了与之相应普通指令的耗时,第三列对比了SSE2指令与普通指令的实现效率。效率比较时,需要注意的是,一条SSE2指令共操作128位的数据,与之相应的普通指令只操作32位的数,相当于,一条SSE2指令执行的操作至少需要普通指令执行4次才能完成,因此,普通指令的耗时需要乘以4再与SSE2指令的实现效率相比较。

表2 SSE2指令与普通指令耗时比较

从上表中的测试数据可知,使用SSE2指令会比使用普通指令快一倍多,在密码算法的设计中,提升一倍的效率是相当可观的。因此,在密码算法的设计过程中,在不降低安全性的前提条件下,考虑使用SSE2指令集来提升密码算法的效率还是很有必要的。

2 AES新指令集AES-NI

高级加密标准(AES)是美国联邦政府采用的对称加密标准,从安全性与实现效率来看,AES被广泛认为是安全高效的。因此被众多政府、企业等作为加密标准。并且,有很多密码算法是基于AES设计的,如消息认证码CMAC、PMAC,随机数生成算法CTR-DRBG,以及认证加密算法AES-GCM与OCB。在最近的CAESAR竞赛中很多设计者提交的算法都是基于AES设计的认证加密算法。因此,研究如何提升AES算法的执行速度尤为重要。

2.1 AES-NI功能与使用

AES新指令集简称AES-NI[6],从2010年起,英特尔推出32纳米微体系结构、代号为westmere的处理器中集成有AES新指令集。AES-NI共有六条指令,四条指令用来加解密(AESENC,AESENCLAST,AESDEC,AESDELAST),两条指令用来扩展密钥(AESIMC,AESKEYGENASSIST)。表3列出了AES-NI的6条指令,并描述了每条指令实现的功能。

表3 AES-NI对应的功能

软件实现密码算法时,通常使用C语言编写,表4列出了6条指令对应的C函数[2],需要说明的是,若不考虑AES的密钥扩展,表4中列出的前四条指令就可实现AES的加解密,而AES的密钥扩展算法,需要用到后两条指令,文献[6]中介绍了使用后两条指令扩展密钥的具体方法。

表4 AES-NI对应的C函数

从以上6条指令中可以看出,AES-NI可以实现密钥长度为(128位、192位和256位)的AES加解密,并且也支持不同模式的AES加解密,如ECB、CBC和CTR模式。

2.2 AES-NI的实现效率

了解了这6条AES指令的功能与用法后,下面将测试使用AES-NI的AES实现速度,并且与未使用AES-NI实现的AES实现速度做对比。

测试环境:intel i7-4770 3.4GHZ的处理器,64位Windows7操作系统,编译器为vs2010。未使用任何加速技术,编程用标准C语言实现。需要注意的是,在使用AES-NI前需要检查目标CPU处理上是否集成有AES-NI,具有AES-NI的处理器才能做进一步的测试。C语言使用AES-NI时需要加头文件#include"wmmintrin.h"。

本节测试了使用AES-NI实现的AES-128加密与解密的实现速度,如表5所示。需要注意的是,对加密与解密的测试是在已经生成10轮子密钥的条件下进行的。为了与普通指令实现AES的效率做对比,在相同平台下也测试了用普通指令实现AES的速度。对应的也列在了表5中。

表5 AES-NI实现AES加解密的效率

另外,对AES-NI的密钥扩展效率也进行了测试,分别测试了使用AES-NI生成10轮子密钥的耗时,AES-NI扩展一轮子密钥的耗时,以及执行一条AESENC指令的耗时,即运行一轮AES的速度。同时,也给出了用普通指令实现它们的速度,测试数据如表6所示。

表6 AES-NI实现密钥扩展与单轮AES加密速度

从表5和表6中的测试数据可以看出,使用AES-NI可以极大地提高AES相关算法的实现效率。在密码算法的设计中,若考虑将AES的轮函数或密钥扩展函数用在密码算法中,就可以极大地提高密码算法的实现效率。

3 结束语

本文介绍了SSE2指令集和AES-NI的功能与使用方式。并测试了这两种指令集的实现效率。由此发现在密码算法的设计中,若刻意使用这两种指令集,会极大地提高密码算法的实现速度。

[1]CAESAR.Cryptographic competitions.[OL].http://competitions.cr.yp.to/ caesar.html.2015.

[2]Wu H,Huang T.The Authenticated Cipher MORUS.[EB].http://competitions.cr. yp.to/round1/morusv1.pdf.2014.

[3]Wu H,Preneel B.AEGIS:A Fast Authenticated Encryption Algorithm.[EB].http://competitions.cr.yp.to/round1/aegisv1.pdf.2014.

[4]Intel.Intel®64 and IA-32 Architectures Software Developer’s Manual.[EB].http:// www.intel.com/content/www/us/en/processors/architectures-software-developer-manuals.html.2015.

[5]Intel.Intrinsics Guide.[OL].https://software.intel.com/sites/landingpage/Intrinsics-Guide/.2013.

[6]Intel.Intel© Advanced Encryption Standard (AES)New Instructions Set.[EB].http:// www.intel.co.jp/content/dam/doc/white-paper/advanced-encryption-standard-new-instructions-set-paper.pdf.2010

Applications of SSE2 and AES-NI on Cryptographic Algorithm

Miao Xudong2Zheng Xiulin1,2Li Yanjun1
1.College of Communication Engineering,Xi’dian University,Xian Shaanxi7100071,China 2.Beijing Electronic Science and Technology Institute,Beijing 100070,China

The performance of the cryptographic algorithm is an important standard of measuring an algorithm.The design of traditional cryptographic algorithm is based on the bit(A5),byte(AES)or word(IDEA).Their software performance is relatively slowly.However,in the recent CAESAR competition,some cipher was designed based on fast instruction set,just like MORUS and AEGIS.Their performance was very fast.In this paper,we choose two typical instruction sets SSE2 and AESNI.Studied the methods of two instruction set used of cryptographic algorithm,and the performance of the instruction sets.Through the study of these two kinds of instruction sets,points out the advantage of the instruction sets used in cryptographic algorithm.

SSE2;AES-NI;instruction set

TN918.1

A

1672-464X(2016)2-12-05

(责任编辑:张卷美)

中央高校基本科研业务费资助(项目编号:328201531)

** 作者简介:苗旭东(1989-),男,汉族,硕士研究生,主要从事密码学领域的研究。

猜你喜欢
指令集密钥指令
基于Kubernetes的RISC-V异构集群云任务调度系统①
幻中邂逅之金色密钥
幻中邂逅之金色密钥
3DNow指令集被Linux淘汰
密码系统中密钥的状态与保护*
《单一形状固定循环指令G90车外圆仿真》教案设计
关于ARM+FPGA组建PLC高速指令控制器的研究
基于Qt和OpenDDS的船舶电力模拟训练系统指令处理方法
Android密钥库简析
基于Dais—CMX模型机的斐波那契数列指令集设计