苗旭東鄭秀林李艷俊
SSE2與AES-NI在密碼算法中的應(yīng)用*
苗旭東2**鄭秀林1,2李艷俊1
1.北京電子科技學(xué)院信息安全系,北京 100070; 2.西安電子科技大學(xué)通信工程學(xué)院,西安 710071
密碼算法的實(shí)現(xiàn)效率是衡量一個(gè)密碼算法好壞的重要指標(biāo)。傳統(tǒng)密碼算法是基于比特(A5算法)、字節(jié)(AES算法)、32位字(IDEA)設(shè)計(jì)的,軟件實(shí)現(xiàn)速度相對(duì)較慢,而在最近的CAESAR競賽中,基于快速指令集設(shè)計(jì)的一些算法,例如MORUS、AEGIS,它們的軟件實(shí)現(xiàn)速度是非??斓?。本文選擇了兩種非常有代表性的指令集SSE2與AES-NI進(jìn)行研究,研究這兩種指令集在密碼算法中的使用方法,以及這些指令集應(yīng)用到密碼算法中會(huì)提升效率,通過對(duì)這兩種指令集的研究,指出了使用指令集在密碼算法中的優(yōu)勢(shì)。
SSE2;AES-NI;指令集
本文的討論范圍是基于軟件實(shí)現(xiàn)的密碼算法,目標(biāo)實(shí)現(xiàn)平臺(tái)是當(dāng)前的CPU處理器。設(shè)計(jì)密碼算法時(shí),一般都會(huì)考慮密碼算法的實(shí)現(xiàn)效率問題,密碼算法如何設(shè)計(jì)才能實(shí)現(xiàn)起來更快、占用內(nèi)存資源更少?這需要考慮目標(biāo)實(shí)現(xiàn)平臺(tái)所擅長執(zhí)行的操作。傳統(tǒng)的對(duì)稱密碼是基于比特(A5算法)、字節(jié)(AES算法)或32位字(IDEA算法)設(shè)計(jì)的,一般來說,基于字節(jié)設(shè)計(jì)的密碼算法要比基于比特設(shè)計(jì)的密碼算法軟件實(shí)現(xiàn)更有效,而基于字設(shè)計(jì)的密碼算法要比基于字節(jié)設(shè)計(jì)的密碼算法軟件實(shí)現(xiàn)更有效,而目前的CPU處理器上集成有很多處理更長數(shù)據(jù)塊的操作指令,如SSE2指令集(可處理128位的數(shù)據(jù))、AVX2指令集(可處理256位的數(shù)據(jù))和AES新指令集AES-NI(處理128位的數(shù)據(jù)),這些指令集可以用到密碼算法的設(shè)計(jì)和實(shí)現(xiàn)中,例如,目前正在進(jìn)行的CAESAR競賽[1]中基于SSE2指令集設(shè)計(jì)的MORUS-640算法[2]的軟件實(shí)現(xiàn)效率可達(dá)1.11cycle/byte,基于AVX2指令集設(shè)計(jì)的MORUS-1280算法[2]的軟件實(shí)現(xiàn)效率可達(dá)0.69cycle/byte,基于 AES-NI實(shí)現(xiàn)的 AEGIS-128算法[3]的軟件實(shí)現(xiàn)效率可達(dá) 0.61cycle/ byte??梢钥闯觯褂弥噶罴O(shè)計(jì)的密碼算法實(shí)現(xiàn)效率很高,這可能是未來幾年設(shè)計(jì)密碼算法的一個(gè)趨勢(shì)。本文以SSE2指令集和AES-NI為例,介紹這兩種指令集的功能和使用方法,測(cè)試它們的實(shí)現(xiàn)效率,并分析了在密碼算法中使用這兩種指令后可提升的效率。
SSE2指令集[4]是在2000年出現(xiàn)的奔騰4處理器、至強(qiáng)處理器中引入的,目前的CPU處理器中幾乎都集成有SSE2指令集,它主要利用的是SIMD(single-instruction multiple-data)模型以提升數(shù)據(jù)操作的速度,即執(zhí)行一條指令并行處理多組數(shù)據(jù)。SSE2指令最大可操作128位的整數(shù),在密碼算法中,通常都是對(duì)整數(shù)的操作,這也是本文研究SSE2指令集的原因。
1.1 幾條典型SSE2指令的功能與使用
在對(duì)稱密碼算法中,通常選擇運(yùn)算速度快、擴(kuò)散效果好、混亂性好的操作,比較常用的幾種操作是:異或操作、移位操作、邏輯與操作、模加運(yùn)算。本文會(huì)從SSE2指令集中選擇一些與這幾種操作相關(guān)的指令,并對(duì)它們的實(shí)現(xiàn)性能進(jìn)行研究。
表1列出了4條非常具有代表性的SSE2指令,并列出了每條指令的名稱,大致描述了每條指令實(shí)現(xiàn)的功能,同時(shí)給出了每條指令對(duì)應(yīng)的C語言函數(shù)[5]。
表1 SSE2指令
其中,PXOR指令是對(duì)128位的整數(shù)a與b做異或操作、PAND指令是對(duì)128位的整數(shù)a與b做邏輯與操作,PSLLDQ指令是對(duì)128位的整數(shù)a左移8×imm8位,PADDD指令是將128位的整數(shù)a與b分別分成4個(gè)32位的字,對(duì)應(yīng)字分別做模232加法運(yùn)算。
1.2 SSE2指令集的實(shí)現(xiàn)效率
了解這4條SSE2指令的實(shí)現(xiàn)功能后,下面的實(shí)驗(yàn)將測(cè)試這4條SSE2指令的實(shí)現(xiàn)效率,為了與普通指令的實(shí)現(xiàn)效率做對(duì)比,在相同平臺(tái)下也測(cè)試了與SSE2指令對(duì)應(yīng)的普通指令的實(shí)現(xiàn)速度。
實(shí)驗(yàn)環(huán)境:在Intel(R)Core(TM)2 Duo E8400@3.0GHz的處理器上執(zhí)行,32位Windows7操作系統(tǒng),編譯器為vs2010。未使用任何加速技術(shù),編程用標(biāo)準(zhǔn)C語言實(shí)現(xiàn)。C語言測(cè)試 SSE2指令需要加頭文件#include" emmintrin.h"。
表2列出了測(cè)試所得數(shù)據(jù),表中給出執(zhí)行一條SSE2指令平均需要的時(shí)鐘周期數(shù),并且在緊接著SSE2指令測(cè)試數(shù)據(jù)的下一行給出了與之相應(yīng)普通指令的耗時(shí),第三列對(duì)比了SSE2指令與普通指令的實(shí)現(xiàn)效率。效率比較時(shí),需要注意的是,一條SSE2指令共操作128位的數(shù)據(jù),與之相應(yīng)的普通指令只操作32位的數(shù),相當(dāng)于,一條SSE2指令執(zhí)行的操作至少需要普通指令執(zhí)行4次才能完成,因此,普通指令的耗時(shí)需要乘以4再與SSE2指令的實(shí)現(xiàn)效率相比較。
表2 SSE2指令與普通指令耗時(shí)比較
從上表中的測(cè)試數(shù)據(jù)可知,使用SSE2指令會(huì)比使用普通指令快一倍多,在密碼算法的設(shè)計(jì)中,提升一倍的效率是相當(dāng)可觀的。因此,在密碼算法的設(shè)計(jì)過程中,在不降低安全性的前提條件下,考慮使用SSE2指令集來提升密碼算法的效率還是很有必要的。
高級(jí)加密標(biāo)準(zhǔn)(AES)是美國聯(lián)邦政府采用的對(duì)稱加密標(biāo)準(zhǔn),從安全性與實(shí)現(xiàn)效率來看,AES被廣泛認(rèn)為是安全高效的。因此被眾多政府、企業(yè)等作為加密標(biāo)準(zhǔn)。并且,有很多密碼算法是基于AES設(shè)計(jì)的,如消息認(rèn)證碼CMAC、PMAC,隨機(jī)數(shù)生成算法CTR-DRBG,以及認(rèn)證加密算法AES-GCM與OCB。在最近的CAESAR競賽中很多設(shè)計(jì)者提交的算法都是基于AES設(shè)計(jì)的認(rèn)證加密算法。因此,研究如何提升AES算法的執(zhí)行速度尤為重要。
2.1 AES-NI功能與使用
AES新指令集簡稱AES-NI[6],從2010年起,英特爾推出32納米微體系結(jié)構(gòu)、代號(hào)為westmere的處理器中集成有AES新指令集。AES-NI共有六條指令,四條指令用來加解密(AESENC,AESENCLAST,AESDEC,AESDELAST),兩條指令用來擴(kuò)展密鑰(AESIMC,AESKEYGENASSIST)。表3列出了AES-NI的6條指令,并描述了每條指令實(shí)現(xiàn)的功能。
表3 AES-NI對(duì)應(yīng)的功能
軟件實(shí)現(xiàn)密碼算法時(shí),通常使用C語言編寫,表4列出了6條指令對(duì)應(yīng)的C函數(shù)[2],需要說明的是,若不考慮AES的密鑰擴(kuò)展,表4中列出的前四條指令就可實(shí)現(xiàn)AES的加解密,而AES的密鑰擴(kuò)展算法,需要用到后兩條指令,文獻(xiàn)[6]中介紹了使用后兩條指令擴(kuò)展密鑰的具體方法。
表4 AES-NI對(duì)應(yīng)的C函數(shù)
從以上6條指令中可以看出,AES-NI可以實(shí)現(xiàn)密鑰長度為(128位、192位和256位)的AES加解密,并且也支持不同模式的AES加解密,如ECB、CBC和CTR模式。
2.2 AES-NI的實(shí)現(xiàn)效率
了解了這6條AES指令的功能與用法后,下面將測(cè)試使用AES-NI的AES實(shí)現(xiàn)速度,并且與未使用AES-NI實(shí)現(xiàn)的AES實(shí)現(xiàn)速度做對(duì)比。
測(cè)試環(huán)境:intel i7-4770 3.4GHZ的處理器,64位Windows7操作系統(tǒng),編譯器為vs2010。未使用任何加速技術(shù),編程用標(biāo)準(zhǔn)C語言實(shí)現(xiàn)。需要注意的是,在使用AES-NI前需要檢查目標(biāo)CPU處理上是否集成有AES-NI,具有AES-NI的處理器才能做進(jìn)一步的測(cè)試。C語言使用AES-NI時(shí)需要加頭文件#include"wmmintrin.h"。
本節(jié)測(cè)試了使用AES-NI實(shí)現(xiàn)的AES-128加密與解密的實(shí)現(xiàn)速度,如表5所示。需要注意的是,對(duì)加密與解密的測(cè)試是在已經(jīng)生成10輪子密鑰的條件下進(jìn)行的。為了與普通指令實(shí)現(xiàn)AES的效率做對(duì)比,在相同平臺(tái)下也測(cè)試了用普通指令實(shí)現(xiàn)AES的速度。對(duì)應(yīng)的也列在了表5中。
表5 AES-NI實(shí)現(xiàn)AES加解密的效率
另外,對(duì)AES-NI的密鑰擴(kuò)展效率也進(jìn)行了測(cè)試,分別測(cè)試了使用AES-NI生成10輪子密鑰的耗時(shí),AES-NI擴(kuò)展一輪子密鑰的耗時(shí),以及執(zhí)行一條AESENC指令的耗時(shí),即運(yùn)行一輪AES的速度。同時(shí),也給出了用普通指令實(shí)現(xiàn)它們的速度,測(cè)試數(shù)據(jù)如表6所示。
表6 AES-NI實(shí)現(xiàn)密鑰擴(kuò)展與單輪AES加密速度
從表5和表6中的測(cè)試數(shù)據(jù)可以看出,使用AES-NI可以極大地提高AES相關(guān)算法的實(shí)現(xiàn)效率。在密碼算法的設(shè)計(jì)中,若考慮將AES的輪函數(shù)或密鑰擴(kuò)展函數(shù)用在密碼算法中,就可以極大地提高密碼算法的實(shí)現(xiàn)效率。
本文介紹了SSE2指令集和AES-NI的功能與使用方式。并測(cè)試了這兩種指令集的實(shí)現(xiàn)效率。由此發(fā)現(xiàn)在密碼算法的設(shè)計(jì)中,若刻意使用這兩種指令集,會(huì)極大地提高密碼算法的實(shí)現(xiàn)速度。
[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
(責(zé)任編輯:張卷美)
中央高?;究蒲袠I(yè)務(wù)費(fèi)資助(項(xiàng)目編號(hào):328201531)
** 作者簡介:苗旭東(1989-),男,漢族,碩士研究生,主要從事密碼學(xué)領(lǐng)域的研究。