亚洲免费av电影一区二区三区,日韩爱爱视频,51精品视频一区二区三区,91视频爱爱,日韩欧美在线播放视频,中文字幕少妇AV,亚洲电影中文字幕,久久久久亚洲av成人网址,久久综合视频网站,国产在线不卡免费播放

        ?

        ZUC-256 算法的快速軟件實(shí)現(xiàn)

        2021-07-22 01:58:02賈文義朱桂楨
        密碼學(xué)報 2021年3期
        關(guān)鍵詞:字節(jié)比特密鑰

        白 亮, 賈文義, 朱桂楨

        興唐通信科技有限公司, 北京 100191

        1 引言

        祖沖之序列密碼算法(即ZUC 算法, 為了和ZUC-256 算法區(qū)分, 下文中我們將其稱為ZUC-128算法) 使用128 比特密鑰, 能夠提供數(shù)據(jù)的機(jī)密性和完整性保護(hù)功能. 2011 年9 月在日本福岡召開的第三代合作伙伴計劃(3GPP)[1]系統(tǒng)架構(gòu)組(SA) 會議上, ZUC-128 算法被批準(zhǔn)寫入3GPP 長期演進(jìn)(LTE) 系統(tǒng)標(biāo)準(zhǔn)規(guī)范[2], 用于LTE 空口數(shù)據(jù)傳輸保護(hù), 是我國首個成為國際標(biāo)準(zhǔn)的密碼算法. 3GPP 基于ZUC-128 算法, 結(jié)合LTE 系統(tǒng)實(shí)際工作輸入輸出需要, 制定了機(jī)密性保護(hù)算法(128-EEA3) 使用規(guī)范和完整性保護(hù)算法(128-EIA3) 使用規(guī)范. 在5G R15 版本標(biāo)準(zhǔn)制定過程中, 3GPP 中國參會企業(yè)代表與ETSI SAGE、GSMA 等共同對128-EEA3/EIA3 標(biāo)準(zhǔn)進(jìn)行了修訂, 將ZUC-128 算法作為5G 空口機(jī)密性和完整性保護(hù)算法(128-NEA3/NIA3) 推進(jìn)成為了5G 標(biāo)準(zhǔn). 隨著量子計算不斷發(fā)展, 在2017 年3GPP 安全組(SA3) 的會議上, 多個企業(yè)提出了5G 中使用256 比特對稱密碼算法的需求. 為此, 3GPP SA3 專門開展研究項目, 探討256 比特密碼算法在5G 中應(yīng)用相關(guān)問題[3]. 在研究項目中, 空口機(jī)密性和完整性保護(hù)算法是各國企業(yè)關(guān)注的重點(diǎn): 美國AT&T 等公司提出未來5G 標(biāo)準(zhǔn)應(yīng)當(dāng)使用AES-256 算法, 提供抗量子計算攻擊的能力; 我國于2018 年初公布了使用256 比特密鑰、基于ZUC-128 算法設(shè)計的ZUC-256 序列密碼算法(草案)[4]; 歐洲愛立信等公司在2018 年底提出了256 比特的SNOW-V 序列密碼算法[5]. 與128 比特密鑰的ZUC-128 算法相比, ZUC-256 算法對初始化進(jìn)行了重新設(shè)計, 增加了初始化向量(IV) 長度以提供足夠的安全冗余; 能夠支持多種長度的消息認(rèn)證碼(MAC), 以應(yīng)對5G 潛在的多安全級別的需求. 除了安全性, 空口密碼算法在終端芯片和網(wǎng)絡(luò)側(cè)設(shè)備中實(shí)現(xiàn)性能、對于現(xiàn)有設(shè)備的影響(如升級、改造成本影響), 也是3GPP 重要考察指標(biāo). 由于AES-256 算法與現(xiàn)階段標(biāo)準(zhǔn)化的AES-128 算法(128-NEA2/NIA2) 相比僅增加了輪數(shù), 因此對于終端芯片設(shè)計的影響非常小; 在網(wǎng)絡(luò)側(cè)無論是使用專用硬件實(shí)現(xiàn)還是基于通用服務(wù)器虛擬化實(shí)現(xiàn)(如使用Intel X86 架構(gòu)CPU 的通用服務(wù)器, 可以利用Intel專門的指令集進(jìn)行加速), 性能都能夠滿足5G 需求. 歐洲愛立信公司提出的SNOW-V 算法復(fù)用了AES輪函數(shù)的結(jié)構(gòu), 在網(wǎng)絡(luò)側(cè)進(jìn)行通用服務(wù)器虛擬化實(shí)現(xiàn)時, 能夠直接使用AES 算法的全部指令集, 加解密速度高于AES; 但是在終端芯片中很難復(fù)用已有硬件. ZUC-256 算法主體結(jié)構(gòu)與ZUC-128 相同, 對于終端十分友好; 但是Intel 處理器沒有專門針對ZUC-128 算法設(shè)計指令集, 因而ZUC-256 算法在通用服務(wù)器上性能能否滿足5G 通信加密標(biāo)準(zhǔn)的高速要求, 即在純軟件實(shí)現(xiàn)條件下達(dá)到20 Gbps 的下行速度[6], 成為了標(biāo)準(zhǔn)推進(jìn)中的關(guān)鍵問題.

        截至目前, 國內(nèi)外學(xué)者對ZUC-128 算法實(shí)現(xiàn)的研究主要集中在其硬件FPGA 實(shí)現(xiàn)[7–11]以及在高通Hexagon DSP 架構(gòu)上的軟件優(yōu)化[12–14]. 然而, 公開的文獻(xiàn)中ZUC-128 的軟件實(shí)現(xiàn)方法僅限于查表實(shí)現(xiàn), 受限于密鑰流生成階段的查表運(yùn)算, ZUC-128 算法在軟件上的性能表現(xiàn)并不太理想. ZUC-256 算法作為ZUC-128 算法的升級版本, 也面臨著相同的困境. 2008 年3 月, Intel、AMD 處理器廠商宣布在其x86 架構(gòu)處理器上推出用于AES[15,16]加/解密運(yùn)算的AES-NI 指令集[17], 采用AES-NI 指令集的單指令多數(shù)據(jù)(Single Instruction Multiple Data, SIMD) 技術(shù)[18,19]實(shí)現(xiàn)AES 算法的軟件實(shí)現(xiàn)性能是采用查表方法的3.5 倍. 近些年來, 隨著SIMD 技術(shù)的不斷完善, 它的高效軟件實(shí)現(xiàn)性能使得越來越多的密碼算法將其應(yīng)用到軟件實(shí)現(xiàn)上, 例如2012 年, Seiichi 和Shiho[20]將SSE 指令結(jié)合bit-slice 技術(shù)[21]應(yīng)用到PRESENT[22]和Piccolo[23]算法上, 使二者實(shí)現(xiàn)吞吐量分別達(dá)到4.73 和4.57 cycle/byte; 2013 年Neves 和Aumasson[24]將AVX2 指令集應(yīng)用到雜湊密碼算法SHA-3 的候選算法BLAKE[25]上并提高了其實(shí)現(xiàn)性能. 因此, 利用SIMD 技術(shù)快速軟件實(shí)現(xiàn)ZUC-256 算法成為重要研究內(nèi)容. 不久前, 以色列的兩位學(xué)者利用AES-NI 指令集對ZUC-256 的密鑰流生成算法的查表運(yùn)算進(jìn)行軟件優(yōu)化, 速度提升了4.5倍; 其核心思想是直接從ZUC-256 的S-盒的數(shù)學(xué)邏輯結(jié)構(gòu)入手, 利用查表指令和AES-NI 指令集實(shí)現(xiàn)多路并行計算, 從而完全避免建大表[26]. 但是, 文獻(xiàn)[26] 中僅給出了ZUC-256 的密鑰流生成算法的快速軟件優(yōu)化實(shí)現(xiàn)方法, 并沒有給出MAC 生成算法的軟件優(yōu)化實(shí)現(xiàn)方法.

        本文主要的工作是對ZUC-256 的軟件實(shí)現(xiàn)進(jìn)行整體優(yōu)化, 包含密鑰流生成算法和MAC 生成算法.對于密鑰流生成算法, 我們對文獻(xiàn)[26] 中的密鑰流生成算法實(shí)現(xiàn)方法進(jìn)行優(yōu)化, 包括S-盒查表方法以及向量轉(zhuǎn)換的優(yōu)化等; 對于MAC 生成算法, 我們將文獻(xiàn)[12] 中對ZUC-128 的軟件優(yōu)化技術(shù), 包括延遲模約方法和構(gòu)造泛哈希函數(shù)方法, 推廣到了ZUC-256 的MAC 生成算法中. MAC 生成算法的軟件實(shí)現(xiàn)主要有兩大瓶頸需要突破, 一是明文消息的比特判斷, 二是密鑰流每次只能進(jìn)行“1-比特” 運(yùn)算. 對于前者我們利用SIMD 技術(shù)中的比較指令來規(guī)避比特判斷, 據(jù)我們所知, 我們是第一個將這種想法應(yīng)用到序列密碼之中的, 但是這種方法依舊無法實(shí)現(xiàn)每次按字操作計算. 從MAC 生成算法的設(shè)計角度來看, 密鑰流和明文消息可以看成是一個GF(2m) 域上的線性泛哈希函數(shù)[27], 而這剛好是MAC 生成算法的核心. 2010 年,英特爾推出的一個新的指令, 無進(jìn)位乘法指令PCLMULQDQ, 它最大的特點(diǎn)是支持GF(2m) 域上的乘法,該指令常常被用于信號處理、有限域、糾錯碼和密碼學(xué)中. 對于密碼學(xué), 以前的一些研究結(jié)果表明可以利用無進(jìn)位乘法指令來有效實(shí)現(xiàn)許多密碼算法, 包括但不限于: AES-GCM 中的GHASH 算法[28]、二元域上的橢圓曲線[29,30]以及Koblitz 曲線中的橢圓曲線[31]. 同傳統(tǒng)的GF(2m) 域上的乘法相比, 無進(jìn)位乘法指令在軟件實(shí)現(xiàn)上有著非常明顯的速度提升. 我們利用PCLMULQDQ 指令將MAC 生成中的比特滑動異或轉(zhuǎn)化為GF(2m) 上的多項式乘法運(yùn)算, 達(dá)到了每次按字計算而非比特計算的快速軟件實(shí)現(xiàn)目標(biāo), 速度至少可以提升2.5 倍[12].

        本文探討ZUC-256 流密碼算法在x86 架構(gòu)處理器上的軟件優(yōu)化實(shí)現(xiàn)方法, 將SIMD 技術(shù)的并行性應(yīng)用到ZUC-256 的軟件優(yōu)化實(shí)現(xiàn)中. 實(shí)驗(yàn)結(jié)果表明, 與目前基于查表實(shí)現(xiàn)密鑰流生成的方法相比, 利用SIMD 技術(shù)的軟件實(shí)現(xiàn)性能具有明顯優(yōu)勢; 此外利用無進(jìn)位乘法指令實(shí)現(xiàn)MAC 生成可以做到每次按字操作.

        本文的結(jié)構(gòu)如下: 首先第2 節(jié)概述預(yù)備知識, 簡要介紹ZUC-256 算法流程. 接下來第3 節(jié)利用SIMD技術(shù)實(shí)現(xiàn)密鑰流生成算法以及實(shí)現(xiàn)MAC 生成算法. 在第4 節(jié), 我們對第3 節(jié)中的方法進(jìn)行優(yōu)化以及將其他一些優(yōu)化方法應(yīng)用到ZUC-256, 并對比測試結(jié)果. 最后第5 節(jié)對本文做一個總結(jié).

        2 預(yù)備知識

        本節(jié)首先介紹一些符號定義, 然后簡要介紹ZUC-256 算法.

        2.1 符號定義

        下面介紹后文將要使用到的符號定義.

        下文中的十六進(jìn)制值均以前綴0x 表示(如0x3B 為十進(jìn)制的59).

        2.2 ZUC-256 密鑰流生成算法

        ZUC-256 算法的完整描述在文獻(xiàn)[4] 中, ZUC-256 密鑰流生成算法包括兩個階段: 初始化階段和密鑰流生成階段, 這兩個階段操作相似. 每個階段都包含三個部分:

        (1) LFSR. 496-比特長的線性反饋移位寄存器, 由16 個31-比特記憶單元變量{s15,s14,··· ,s0}構(gòu)成, 這些單元均定義在集合{1,2,··· ,231?1}上;

        (2) BR. 比特重組層, 從LFSR 層中抽取一些內(nèi)部狀態(tài), 并拼接成4 個32-比特字{X0,X1,X2,X3};

        (3) FSM. 有限狀態(tài)自動機(jī), 輸入由BR 層決定, 包含2 個32-比特字R1與R2作為FSM 中的記憶單元變量.

        令p=231?1, Hp={1,2,··· ,p}為不大于p的所有正整數(shù)集合. 定義LFSR 反饋函數(shù)F1:H5p →Hp為以下函數(shù):

        (1)X0:=FH(s15?1)||FL(s14),X1:=FL(s11)||FH(s9?1),X2:=FL(s7)||FH(s5?1),X3:=FL(s2)||FH(s0?1).

        (2)Z:=((X0⊕R1)?R2)⊕X3,W1:=X1?R1,W2:=X2⊕R2.

        (3)R1:=S(L1(FL(W1)||FH(W2))),R2:=S(L2(FL(W2)||FH(W1))).

        (4)s16:=F1(s0,s4,s10,s13,s15).

        (5){s0,s1,··· ,s15}:={s1,s2,··· ,s16}.

        (6) 返回密鑰流字Z.

        在初始化階段, 密鑰載入過程首先將一個256-比特的種子密鑰SK 和一個184-比特的初始向量IV 打入到LFSR 的記憶單元變量{s15,s14,··· ,s0}中作為其初始狀態(tài); 其次, 令非線性函數(shù)F的兩個記憶單元變量R1和R2為0; 最后運(yùn)行初始化迭代過程32 次, 完成密鑰載入過程. ZUC-256 密鑰流生成算法在完成初始化階段以后, 依次執(zhí)行LFSR 層、BR 層和FSM 層進(jìn)行狀態(tài)更新, 完成一次迭代過程, 在此過程中不輸出任何密鑰流字, 隨后進(jìn)入到密鑰流的輸出過程.

        2.3 ZUC-256 MAC 生成算法

        (2) 初始化Tag:=(z0,z1,··· ,zt?1).

        (3) 當(dāng)i=0 到l ?1 時執(zhí)行:

        (3.1)Wi:=(zt+i,zt+i+1,··· ,z2t+i?1);

        (3.2) 若mi=1, 則Tag=Tag⊕Wi.

        (4)Wl:=(zl+t,zl+t+1,··· ,zl+2t?1).

        (5) Tag=Tag⊕Wl.

        (6) 返回Tag 作為MAC 輸出.

        在MAC 生成階段, 為了防止偽造攻擊, 對于不同長度的認(rèn)證標(biāo)簽, 在初始化階段所采用的常數(shù)均不相同, 同時也異于ZUC-256 密鑰流生成算法中采用的常數(shù).

        3 基于x86 平臺上的SIMD 技術(shù)并行實(shí)現(xiàn)ZUC-256

        SIMD 最大的優(yōu)點(diǎn)在于它的并行性, 該技術(shù)可實(shí)現(xiàn)同一操作并行處理多組數(shù)據(jù). 目前支持SIMD 技術(shù)的處理器廠商主要有Intel、AMD、ARM 等, Intel 處理器中的SSE/AVX 指令集及AMD 處理器中的SSE/XOP 指令集中的指令均采用SIMD 技術(shù), 大多數(shù)PC 及服務(wù)器采用的是Intel 處理器. 本文使用的是基于Intel 處理器的SIMD 并行技術(shù).

        SIMD 技術(shù)可用于并行計算, 寄存器的長度有128 比特(SSE 系列)、256 比特(AVX2) 和512 比特(AVX512), 使用SIMD 技術(shù)對ZUC-256 算法進(jìn)行優(yōu)化的點(diǎn)主要是考慮可以并行計算邏輯運(yùn)算、查表運(yùn)算和模加運(yùn)算等. 由于ZUC-256 中計算的基本單元為32-比特的字, 因此, 除了建大表, 對單密鑰或單IV模式(不使用SIMD 進(jìn)行并行計算的算法實(shí)現(xiàn)模式) 的優(yōu)化基本不可行. 以下針對ZUC-256 的優(yōu)化均為多密鑰或多IV 模式下的優(yōu)化.

        (1) 對于支持128-比特寄存器的系統(tǒng)(SSE), 可以并行處理4 條數(shù)據(jù)的運(yùn)算操作;

        (2) 對于支持256-比特寄存器的系統(tǒng)(AVX2), 可以并行處理8 條數(shù)據(jù)的運(yùn)算操作;

        (3) 對于支持512-比特寄存器的系統(tǒng)(AVX512), 可以并行處理16 條數(shù)據(jù)的運(yùn)算操作.

        接下來我們通過利用SIMD 技術(shù)分別優(yōu)化實(shí)現(xiàn)ZUC-256 的密鑰流生成算法和MAC 生成算法.

        3.1 密鑰流生成算法的SIMD 實(shí)現(xiàn)

        從ZUC-256 密鑰流生成算法的描述可知, 在FSM 層需要用到兩個8-比特的S-盒對32-比特的字進(jìn)行四次查表運(yùn)算. 在單密鑰模式中, 我們可以通過建大表以空間換時間的方式快速實(shí)現(xiàn)查表運(yùn)算, 但如果在多密鑰模式中使用SIMD 技術(shù)并行處理多條數(shù)據(jù), 即使建大表也不能實(shí)現(xiàn)多條數(shù)據(jù)并行查表運(yùn)算操作,打破了SIMD 的并行性. 因此如何利用SIMD 技術(shù)既能快速實(shí)現(xiàn)ZUC-256 算法又能繼承其并行性是我們整個工作的核心. 在本節(jié)中我們收集歸納了幾種ZUC-128 和ZUC-256 的優(yōu)化方法, 并將ZUC-128 的優(yōu)化方法適當(dāng)推廣到ZUC-256 中, 最后分析其優(yōu)缺點(diǎn)和可行性.

        3.1.1S0-盒的SIMD 實(shí)現(xiàn)[26]

        S0為3 個4 比特變換P1、P2和P3(見表1) 通過3 輪Feistel 結(jié)構(gòu)迭代產(chǎn)生,S0-盒的結(jié)構(gòu)圖具體見圖1.

        表1 S0-盒查表運(yùn)算中P1/2/3 變換Table 1 P1/2/3 maps used during S0 S-box algorithm

        圖1 S0-盒結(jié)構(gòu)Figure 1 Algebraic structure of S0-box

        令x為8-比特字節(jié)輸入, 令xL、xH分別為其低4-比特和高4-比特, 以下為S0-盒的實(shí)現(xiàn)詳解.

        (1)t=P1[xL]⊕xH;

        (2) outL=P2[t]⊕xL;

        (3) outH=P3[outL]⊕t;

        (4) out = out ?5;

        (5) 返回out.

        為了利用 SIMD 技術(shù)實(shí)現(xiàn)P1、P2和P3變換, 可以借助字節(jié)查表指令 PSHUFB, SSE 中的_mm_shuffle_epi8 (AVX2 中的_mm256_shuffle_epi8 以及AVX512 中_mm512_shuffle_epi8), 該指令接受兩個16-字節(jié)(或32-字節(jié)或64-字節(jié)) 的向量: 以第一個向量map 作為表, 第二個向量mask中的元素作為索引值進(jìn)行查表得到一個16-字節(jié)(或32-字節(jié)或64-字節(jié)) 的向量. 例如: 令mask={15,14,··· ,0},則_mm_shuffle_epi8(P1,mask)={9,3,··· ,9}為P1的反序.算法1展示了利用AVX2實(shí)現(xiàn)S0-盒的具體過程(SSE 與AVX512 類似).

        算法1 ZUC-256 S0輸入: 32-字節(jié)向量in輸出: 32-字節(jié)向量out定義: byte_low4_mask = _mm256_set_epi8(0x0F)定義: byte_hi3_mask = _mm256_set_epi8(0xE0), byte_low5_mask = _mm256_set_epi8(0x1F)定義: p1_mask = _mm256_set_epi32(0x09030507,0x0C000400,0x0A020F0F,0x0E000F09)定義: p2_mask = _mm256_set_epi32(0x0209030F,0x0A0E010B,0x040C0007,0x05060D08)定義: p3_mask = _mm256_set_epi32(0x0D0C0900,0x050D0303,0x0F0A0D00,0x060A0602)1. 程序S0(in)2. hi = _mm256_and_si256(_mm256_srli_epi32(in, 4), byte_low4_mask);3. low = _mm256_and_si256(in, byte_low4_mask);4. r = _mm256_xor_si256(hi, _mm256_shuffle_epi8(p1_mask, low));5. s = _mm256_xor_si256(low, _mm256_shuffle_epi8(p2_mask, r));6. t = _mm256_xor_si256(r, _mm256_shuffle_epi8(p3_mask, s));7. tmp = _mm256_or_si256(s, _mm256_slli_epi32(t, 4));8. low = _mm256_and_si256(_mm256_srli_epi32(tmp, 3), byte_low5_mask);9. hi = _mm256_and_si256(_mm256_slli_epi32(tmp, 5), byte_hi3_mask);10. out = _mm256_or_si256(low, hi);11. 返回out.

        需要說明的是_mm256_set_epi32 指令只允許8 個32-比特的字作為輸入, 按先高位后低位的順序排列,算法1中的p1_mask、p2_mask 和p3_mask 應(yīng)當(dāng)分別輸入兩次P1、P2和P3的值(AVX512 需要輸入四次), 即p1_mask = _mm256_set_epi32(0x09030507, 0x0C000400, 0x0A020F0F, 0x0E000F09,0x09030507, 0x0C000400, 0x0A020F0F, 0x0E000F09), 因此在實(shí)際的C 代碼中需要輸入兩次. 在這里由于篇幅原因,算法1中只輸入了一次, 下文中情形類似.

        3.1.2S1-盒的SIMD 實(shí)現(xiàn)[26]

        從2.2 節(jié)可知,S1是基于有限域GF(256) 上的逆函數(shù)構(gòu)造的, 與分組密碼AES 的S-盒類似, 它們之間仿射等價. 記FAES表示模本原多項式fAES(x)=x8+x4+x3+x+1 的有限域GF(256), AES 算法的S-盒(記為SAES) 的構(gòu)造為:SAES(x)=A·x?1+D, 其中A為二元矩陣,D=0x63; 同時記FZUC表示模本原多項式fZUC(x) =x8+x7+x3+x+1 的有限域GF(256),S1-盒的構(gòu)造為:S1(x) =M ·x?1+B,其中B=0x55,M為二元矩陣. 二元矩陣A和M具體如下:

        由于S1-盒的構(gòu)造和SAES-盒的構(gòu)造是仿射等價的, 因此, 存在一個域FZUC到域FAES的同構(gòu)映射φ,

        其中,K為一個二元可逆矩陣, 文獻(xiàn)[26] 中給出了一種計算矩陣K的方法. 因此在同構(gòu)映射φ下對任意的x ∈FZUC都存在唯一的y=Kx ∈FAES, 通過利用AESENCLAST 指令來計算y?1∈FAES, 最后乘以K?1便可得到x?1∈FZUC, 這樣便可以通過AES-NI 指令集來達(dá)到實(shí)現(xiàn)并行查S1的目的. 首先將SAES-盒轉(zhuǎn)化為:

        同時,S1-盒:

        在同構(gòu)映射φ下, ZUC-256 算法的加密S1-盒可以等價的構(gòu)造為:

        其中T=M·K?1·A?1, 根據(jù)文獻(xiàn)[26] 給出的方法計算矩陣K,K共有8 種選擇, 在這里選擇以下的K值, 同時矩陣T也可以被同步計算出來.

        公式(2)中的S1-盒的計算可以分解為矩陣乘法、SAES-盒查表以及異或運(yùn)算, 而矩陣乘法可以轉(zhuǎn)換為2次查表(4 進(jìn)8 出) 和1 次異或運(yùn)算, 以下為S1-盒的實(shí)現(xiàn)詳解.

        (1) 計算y,K1,K2.

        (2) 計算z=SAES[y]⊕D, 使用AESENCLAST 指令時需要注意行移位變換;

        (3) 計算w,T1,T2.

        AESENCLAST 指令用于實(shí)現(xiàn)分組算法AES 的最后一輪函數(shù), 包括: 行移位變換、字節(jié)替代即SAES、輪密鑰加. 對上述步驟(2) 中的y進(jìn)行逆行移位變換以及將輪密鑰置為D, 利用AESENCLAST 指令便可得到z進(jìn)而計算出S1.算法2為S1-盒用AVX2 實(shí)現(xiàn)的具體過程(SSE 與AVX512 類似).

        算法2 ZUC-256 S1輸入: 32-字節(jié)向量input輸出: 32-字節(jié)向量output定義: k_mask1 = _mm256_set_epi32(0xD3D20A0B,0xB8B96160,0xB3B26A6B,0xD8D90100)定義: k_mask2 = _mm256_set_epi32(0x29AB63E1,0xEE6CA426,0x0F8D45C7,0xC84A8200)定義: t_mask1 = _mm256_set_epi32(0x5B867FA2,0xA479805D,0x538E77AA,0xAC718855)定義: t_mask2 = _mm256_set_epi32(0x47DE73EA,0x33AA079E,0xD940ED74,0xAD349900)定義: aes_row_invshift = _mm256_set_epi32(0x0306090C,0x0F020508,0x0B0E0104,0x070A0D00)定義: aes_cancelkey = _mm_set_epi8(0x63)1. 程序S1(input)2. low = _mm256_shuffle_epi8(k_mask1, _mm256_and_si256(input, byte_low4_mask));3. hi = _mm256_shuffle_epi8(k_mask2, _mm256_and_si256(_mm256_srli_epi32(input, 4),byte_low4_mask));4. tmp = _mm256_shuffle_epi8(aes_row_invshift, _mm256_xor_si256(hi, low));5. tmp = _mm_aesenclast_si128(tmp, aes_cancelkey);6. low = _mm256_shuffle_epi8(t_mask1, _mm256_and_si256(tmp, byte_low4_mask));7. hi = _mm256_shuffle_epi8(t_mask2, _mm256_and_si256(_mm256_srli_epi32(tmp, 4), byte_low4_mask));8. output = _mm256_xor_si256(low, hi);9. 返回output.

        注意在算法2中步驟5 和6 只允許接收16-字節(jié)的輸入, 這是因?yàn)镮ntel 目前只給出16-字節(jié)的AES-NI 指令集, 因此當(dāng)使用AVX2 和AVX512 指令集時分別需要調(diào)用2 次和4 次AESENCLAST 指令,單次查S1-盒的效率會比SSE 低, 但是對比經(jīng)典查表方法這依然是非常高效的.

        3.1.3 延遲模約[12]

        在計算LFSR 時,為了保證公式(1)的正確性,需要對(1)式中的每次乘法和加法結(jié)果進(jìn)行模約運(yùn)算. 文獻(xiàn)[12] 中提出延遲模約方法對單密鑰模式下的ZUC-256 密鑰流生成算法進(jìn)行優(yōu)化, 其主要思想是: 模數(shù)p= 231?1 對于加法模約運(yùn)算是非??焖俚? 只需要用到與運(yùn)算和移位運(yùn)算(對任意x,y,z ∈Hp,k ∈Z,k=x+y, 則z=x+ymodp= (k& 0x7FFFFFFF)+(k ?31)), 但乘以一個2 的冪的乘法模約運(yùn)算需要用到循環(huán)運(yùn)算, 這對軟件優(yōu)化來說需要更多開銷, 如何減少乘法模約運(yùn)算?

        令k ∈Z, 則k=(1+28)s0+220s4+221s10+217s13+215s15的計算是在整環(huán)Z 上的乘法和加法,沒有模約處理, 很明顯k< 222·231=253; 然后計算k′=(k& 0x7FFFFFFF)+(k ?31)<232?2, 只需要對k′再進(jìn)行一次加法模約處理可以得到kmodp, 因此計算公式(1)整個過程只需要兩次加法模約,在單密鑰模式下, 如果需要, 還可以使用匯編語言提升速度.

        然而, 若在公式(1)中應(yīng)用延遲模約方法, 需要將32 位上的加法和乘法操作對應(yīng)轉(zhuǎn)換到64 位上, 這對于多密鑰模式來說需要較大開銷(例如: 對于一個8×32-比特的向量, 將其轉(zhuǎn)換為8×64-比特的向量, 則需要兩個256-比特的向量進(jìn)行存儲以及其它操作, 最后再將其轉(zhuǎn)為一個8×32-比特的向量), 經(jīng)過測試, 在多密鑰模式應(yīng)用延遲模約比乘法模約運(yùn)算開銷更大. 因此, 延遲模約技術(shù)適合應(yīng)用到單密鑰模式(如果不使用匯編, 對比乘法模約, 提升幅度也并不高), 在多密鑰模式下, 使用乘法模約開銷會更少.

        3.2 MAC 生成算法的SIMD 實(shí)現(xiàn)

        利用SIMD 技術(shù)并行實(shí)現(xiàn)MAC 生成算法首先需要解決兩個問題, 一是明文消息的比特判斷, 二是密鑰流每次只能進(jìn)行“1-比特” 運(yùn)算. 在本節(jié)中, 我們給出了MAC 生成算法的兩種SIMD 實(shí)現(xiàn)方法.

        3.2.1 利用比較指令生成MAC 的SIMD 實(shí)現(xiàn)

        2.3 節(jié)描述了MAC 的生成, 從其描述步驟(3.2) 可知, 每次迭代都需要對明文消息的每1-比特進(jìn)行判斷. 然而, ZUC-256 算法的基本單元都是32-比特的字, 按比特判斷不僅會降低軟件整體性能, 而且不利于使用SIMD 技術(shù)并行處理多條數(shù)據(jù), 因此我們的目標(biāo)是盡量避免明文消息的比特判斷以及每次迭代都是按字計算而不是按比特計算. 為了方便描述, 在本文中我們主要針對認(rèn)證標(biāo)簽長度為32-比特的MAC 生成(64-比特= 2×32 比特, 128-比特= 4×32 比特).

        假設(shè)生成的密鑰比特流為z0,z1,···, 明文比特序列為m0,m1,···, 則2.3 節(jié)中MAC 生成描述步驟(3) 中的Wi可以等價轉(zhuǎn)化為Wi=mizi‖mizi+1‖···‖mizi+31. 以下為MAC 生成算法的前32 次迭代的一個等價轉(zhuǎn)換.

        (3) 則Tag=Tag⊕T0⊕T1⊕···⊕T31.

        在單密鑰模式下, 上述的Ti在本質(zhì)上依舊避免不了對明文序列的判斷, 但是在多密鑰模式下, 我們可以利用比較指令PCMPGTD 來很好的規(guī)避這一問題,算法3展示了利用AVX2 中的PCMPGTD 指令生成32-比特Tag 的部分過程, 對應(yīng)2.3 節(jié)中的描述步驟(3).

        算法3 ZUC-256 MAC 生成算法-1輸入: 32-字節(jié)向量密鑰流組?vecz, 8×L 個32-比特明文數(shù)組?msg輸出: 32-字節(jié)向量vtag定義: V2ZERO = _mm256_setzero_si256()1. 程序MAC_Generate(vecz, msg)2. i 從0 到L ?1 依次執(zhí)行:3. r = _mm256_loadu_si256(msg + 8×i);4. j 從0 到31 依次執(zhí)行:5. s = _mm256_slli_epi32(r, j); t = _mm256_cmpgt_epi32(V2ZERO, s);6. u = _mm256_srli_epi32(vecz[i+2], 32 ?j);7. v = _mm256_slli_epi32(vecz[i+1], j); w = _mm256_or_si256(u, v);8. vtag = _mm256_xor_si256(vtag, _mm256_and_si256(w, t));9. vtag = _mm256_xor_si256(vtag, tmp); tmp = vtag;10. 返回vtag.

        算法3的主要思想是利用_mm256_cmpgt_epi32(a, b) 的輸出結(jié)果, 該指令接受兩個256-比特的向量, 按有符號的32-比特進(jìn)行比較, 大于輸出0xFFFFFFFF, 否則輸出0; 因此將明文消息字進(jìn)行左移, 然后與0 進(jìn)行比較, 如果移位后的明文消息字最高位為1, 則為負(fù)數(shù), 經(jīng)過比較指令后輸出0xFFFFFFFF,再經(jīng)過與運(yùn)算就可以取出Wi.

        3.2.2 利用無進(jìn)位乘法指令生成MAC 的SIMD 實(shí)現(xiàn)

        算法3中雖然利用PCMPGTD 比較指令規(guī)避了明文序列的判斷, 但是在步驟7 中的或運(yùn)算等價于在密鑰比特流上按比特滑動, 這類似于字循環(huán)操作, 并不利于軟件優(yōu)化; 除此之外, 在步驟4 中仍然需要執(zhí)行32 次才能處理一個明文消息字, 換句話說, 這在本質(zhì)上是按比特計算, 依然沒有達(dá)到真正意義上的按字計算. 文獻(xiàn)[12] 給出一種方法, 在單密鑰模式下利用無進(jìn)位乘法指令PCLMULQDQ 來快速生成ZUC-128的MAC, 可以每次迭代處理一個明文消息字. 與ZUC-128 流密碼中的MAC 生成算法相比, ZUC-256 在算法結(jié)構(gòu)上并沒有太大的改變, 因此我們可以將文獻(xiàn)[12] 中的方法推廣到ZUC-256 的MAC 生成算法的多密鑰模式中, 并優(yōu)化了其方法中的某些步驟, 以此加速其實(shí)現(xiàn)進(jìn)程.

        假設(shè)生成的密鑰比特流為z0,z1,···, 明文比特序列為m0,m1,···, 則密鑰比特流和明文序列可以看做是一個F2[x] 上的線性泛哈希函數(shù)的輸入. 2010 年, Intel 在他們的32 納米處理器家族上引進(jìn)了一種新的指令PCLMULQDQ; 令人感到驚喜的是, 該指令可以計算兩個64-比特數(shù)的無進(jìn)位乘法乘積, 即計算兩個在F2[x] 上次數(shù)最多為63-次的二元多項式的乘積(最多為126-次的多項式). 在實(shí)現(xiàn)性能方面,PCLMULQDQ 能夠在14 個時鐘圈內(nèi)執(zhí)行, 這遠(yuǎn)快于經(jīng)典的F2[x] 上的多項式乘法運(yùn)算. 因此我們可以利用無進(jìn)位乘法指令PCLMULQDQ 來計算MAC 生成. 下面我們展示如何利用PCLMULQDQ 指令快速生成MAC, 首先我們將2.3 節(jié)MAC 生成描述步驟(3) 中前32 次計算等價轉(zhuǎn)換為另一種描述.

        (1) 令r=(m31,m30,··· ,m0)T;

        (2) 令 矩陣

        (3) 則Tag=Tag⊕(K·r).

        注意K · r是在域F2上進(jìn)行的, 即操作運(yùn)算中的加法為異或運(yùn)算. 令m,p,p1,p2,q ∈F2[x],m=m0+m1x+···+m31x31為F2[x] 上的一個31-次多項式, 其序和第一個明文消息字的序相反;p1=z31+z30x+···+z0x31為第二個密鑰流字作為F2[x]上的一個31-次多項式;p2=z63+z62x+···+z32x31為下一個密鑰流字;p=p1x32+p2為兩個密鑰流字構(gòu)成的63-次多項式;q=mp=q2x64+q1x32+q0為多項式m和p的乘積, 我們將證明q1(一個32-比特的字, 作為多項式的系數(shù)) 和K·r是等價的.

        因此MAC 的生成運(yùn)算可以等價轉(zhuǎn)化為F2[x] 上的多項式乘法. 在實(shí)際的軟件實(shí)現(xiàn)中, 首先將消息字的反序(將反序結(jié)果轉(zhuǎn)換為64-比特, 高32 位為0) 和兩個32-比特密鑰流字作為PCLMULQDQ 指令的輸入, 取出其運(yùn)算結(jié)果中的q1便可得到K ·r. 對后續(xù)的所有明文消息字重復(fù)同樣的步驟直到我們獲得最終的MAC 碼, 達(dá)到了每次按字計算而非比特計算的快速軟件實(shí)現(xiàn)目標(biāo).算法4為AVX2 中的PCLMULQDQ 指令生成32-比特Tag 的實(shí)現(xiàn)過程.

        在算法4中, PCLMULQDQ 指令需要輸入兩個128-比特向量以及一個控制選擇位, 該指令根據(jù)控制選擇位每次選取兩個128-比特向量中某兩個64-比特數(shù)計算得到一個128-比特向量, 這在AVX2 和AVX512 中需要多次調(diào)用才能得到結(jié)果, 其效率會比SSE 低. 除此之外, 在步驟3 中還需要對明文序列字進(jìn)行反序處理, 目前SIMD 技術(shù)在x86 平臺上還沒有提供比特反序的指令, 如果未來Intel 提供比特反序的指令, 利用PCLMULQDQ 指令會有更進(jìn)一步的優(yōu)勢.

        4 方案優(yōu)化與試驗(yàn)結(jié)果

        在本節(jié)中我們將第3 節(jié)中的技術(shù)應(yīng)用到ZUC-256 算法中, 并對其中一些技術(shù)方法做進(jìn)一步的優(yōu)化;在4.4 節(jié)中我們對比幾種不同方法實(shí)現(xiàn)ZUC-256 流密碼算法的軟件性能, 并分析其結(jié)果. 我們已將完整的C 實(shí)現(xiàn)代碼(AVX512 版本) 公開發(fā)布在GitHub 網(wǎng)站上: https://github.com/Nonights/ZUC256.

        4.1 S-盒優(yōu)化

        算法4 ZUC-256 MAC 生成算法-2輸入: 32-字節(jié)向量密鑰流組vecz, 8×L 個32-比特明文數(shù)組msg輸出: 32-字節(jié)向量vtag (8 個并行的32-比特Tag)1. 程序MAC_Generate(vecz, msg)2. i 從0 到L ?1 依次執(zhí)行:3. r = Word_reverse(_mm256_loadu_si256(msg + 8×i)); /?對每一路消息字進(jìn)行反序處理?/4. s[4] = Expandtovec128(r); /?將r 的每路數(shù)據(jù)擴(kuò)展為64 比特并轉(zhuǎn)換成4 個SSE 中的向量?/5. w[4] = Storetovec128(vecz[i+1], vecz[i+2]); /?將兩個密鑰流向量轉(zhuǎn)換成4 個SSE 中的向量?/6. j 從0 到3 依次執(zhí)行:7. u[j] = _mm_clmulepi64_si128(s[j], w[j], 0x00);8. v[j] = _mm_clmulepi64_si128(s[j], w[j], 0x11);9. tmp = Loadtovec256(u[4], v[4]); /?取出每路中的q1 并生成一個32-字節(jié)向量?/10. tmp = _mm256_xor_si256(tmp, temp); temp = tmp; /?更新tmp, temp 的初始值置為0 ?/11. vtag = _mm256_xor_si256(_mm256_xor_si256(vecz[0], tmp), vecz[L+1]);12. 返回vtag.

        在第3 節(jié)中,算法1和算法2的輸入輸出均為32-字節(jié)的向量(針對AVX2), 然而回顧ZUC-256 算法描述中對于查表操作S(Y3||Y2||Y1||Y0) =S0(Y3)||S1(Y2)||S0(Y1)||S1(Y0), 即在單密鑰模式下,S0-盒只對字Y的奇字節(jié)位進(jìn)行查表, 而S1-盒只對字Y的偶字節(jié)位進(jìn)行查表; 換句話說, 在多密鑰8×32 模式下, 對于一個32-字節(jié)的向量vecs,S0和S1只需要分別對其奇字節(jié)位和偶字節(jié)位進(jìn)行查表. 第一種方法是利用算法1和算法2先分別計算出S0(vecs) 與S1(vecs), 然后再分別取出奇字節(jié)和偶字節(jié), 最后再移位異或得到S(vecs); 然而以這種方法查表計算, 會浪費(fèi)很多開銷, 因?yàn)镾0不需要對vecs中的偶字節(jié)位進(jìn)行查表, 同理S1也不需要對vecs中的奇字節(jié)位進(jìn)行查表. 第二種方法如下: 在單密鑰模式下, 假設(shè)R1=S(X3||X2||X1||X0) =S0(X3)||S1(X2)||S0(X1)||S1(X0),R2=S(Y3||Y2||Y1||Y0) =S0(Y3)||S1(Y2)||S0(Y1)||S1(Y0), 則令R′1=S0(X3||Y3||X1||Y1) =S0(X3)||S0(Y3)||S0(X1)||S0(Y1),R′2=S1(X2||Y2||X0||Y0) =S1(X2)||S1(Y2)||S1(X0)||S1(Y0), 最后再通過移位、與和異或便可得到R1和R2, 避免不必要的開銷. 除此之外, 在使用第二種方法實(shí)現(xiàn)S時, 還可以利用混合指令VPBLENDVB和移位指令VPSLLD (或VPSRLD) 進(jìn)一步優(yōu)化實(shí)現(xiàn),算法5為2.2 節(jié)里描述步驟(3) 中R 的AVX2 實(shí)現(xiàn)(SSE 和AVX512 類似).

        算法5 ZUC-256 R輸入: 32-字節(jié)向量l1, l2輸出: 32-字節(jié)向量r1, r2定義: even_byte_mask = _mm256_set1_epi32(0x00FF00FF)1. 程序R(l1,l2)2. a = S0(_mm256_blendv_epi8(l1, _mm256_srli_epi32(l2, 8), even_byte_mask));3. b = S1(_mm256_blendv_epi8(_mm256_slli_epi32(l1, 8), l2, even_byte_mask));4. r1 = _mm256_blendv_epi8(a, _mm256_srli_epi32(b, 8), even_byte_mask);5. r2 = _mm256_blendv_epi8(_mm256_slli_epi32(a, 8), b, even_byte_mask);6. 返回r1, r2.

        4.2 向量轉(zhuǎn)換優(yōu)化

        目前, Intel 只提供了AESENCLAST 和PCLMULQDQ 的SSE 指令, 即只允許128-比特的運(yùn)算操作,因此當(dāng)使用AVX2 和AVX512 時分別需要調(diào)用2 次和4 次相應(yīng)的SSE 指令. 例如在AVX2 指令集中,對于一個256-比特的輸入向量vec, 當(dāng)調(diào)用AESENCLAST 指令時, 需要將vec 轉(zhuǎn)換為兩個128-比特的向量; 這里有兩種轉(zhuǎn)換方法, 一種是利用memcpy 命令或者利用指針進(jìn)行強(qiáng)制轉(zhuǎn)換, 然而這種方法不是并行處理的. 另一種方法是利用轉(zhuǎn)換、提取和插入指令, 這種方法可以保證算法過程的并行性; 其次對比第一種方法, 后者在多次調(diào)用中性能會有明顯提升.算法6為算法1中步驟5 的具體AVX2 實(shí)現(xiàn).

        算法6 ZUC-256 USE_AES-NI輸入: 32-字節(jié)向量tmp輸出: 32-字節(jié)向量tmp 1. 程序USE_AES-NI(tmp)2. _mm256_storeu2_m128i(temp, temp + 1, tmp); /?temp 為兩個128-比特的臨時向量組?/3. temp[0] = _mm_aesenclast_si128(temp[0], aes_concelkey);4. temp[1] = _mm_aesenclast_si128(temp[1], aes_concelkey);5. tmp = _mm256_loadu2_m128i(temp, temp + 1);6. 返回tmp.

        算法6中的方法依然可以推廣到AVX512, 在AVX512 中需要用到四次512-比特到128-比特向量轉(zhuǎn)換、四次AESENCLAST 指令調(diào)用和四次128-比特到512-比特向量轉(zhuǎn)換, 性能相對會進(jìn)一步下降. 利用SIMD 技術(shù)實(shí)現(xiàn)MAC 生成時, 調(diào)用PCLMULQDQ 指令和AESENCLAST 情形類似, 但是需要注意明文消息的注入(每一路32-比特消息需要進(jìn)行反序處理并擴(kuò)展為64-比特, 高32-比特為0) 和密鑰流字的順序.

        4.3 LFSR 層的移位操作優(yōu)化

        除了算法本身的優(yōu)化以外, 還可以通過增加代碼的復(fù)雜度減少LFSR 層的移位操作來提升性能. 在密鑰流生成階段, 每一輪迭代對BR 層、FSM 層和LFSR 層的狀態(tài)進(jìn)行更新, 當(dāng)明文消息流足夠長的時候,代碼中for 循環(huán)也在增加. 注意到LFSR 層, 每次只對最后一個寄存器的值進(jìn)行更新, 而其他值都是由后一個寄存器的值覆蓋更新, 在16 個迭代中所有值全部被更新, 因此可以通過多輪連續(xù)迭代減少移位操作.例如在密鑰流生成階段, 在一個循環(huán)內(nèi)做16 次迭代可以最大程度的減少移位操作.

        4.4 試驗(yàn)結(jié)果

        在本小節(jié)中, 我們將測試不同方法的軟件實(shí)現(xiàn)性能, 分為密鑰流生成和MAC 生成兩個大類(見表2);注意我們以文獻(xiàn)[4] 中的參考代碼為基準(zhǔn), 其余實(shí)現(xiàn)方法都是在此基礎(chǔ)上進(jìn)行優(yōu)化. 我們對比文獻(xiàn)[12] 中的延遲模約方法、文獻(xiàn)[26] 中的SIMD 技術(shù)和本文的優(yōu)化SIMD 技術(shù)分別實(shí)現(xiàn)ZUC-256 密鑰流生成算法的軟件性能, 以及對比文獻(xiàn)[26] 中的無進(jìn)位乘法方法、本文中的比較指令(方法1) 和無進(jìn)位乘法指令(方法2) 的SIMD 技術(shù)分別生成MAC 的軟件性能.

        表2 對比測試版本Table 2 Eight versions of test

        我們分別在2 個不同處理器平臺上對ZUC-256 的軟件實(shí)現(xiàn)性能進(jìn)行評估,一個是Intel(R)Core(TM)i3-6100 CPU @3.70GHz, 該平臺有4GB 內(nèi)存, 系統(tǒng)類型為32 位Win7 操作系統(tǒng), 記為Platform1; 另一個平臺是Intel(R) Xeon(R) Gold 6128 CPU @3.40 GHz, 128 GB 內(nèi)存, 64 位Win10 操作系統(tǒng), 記為Platform2. Platform1 和Platform2 分別使用Visual Studio 2015 軟件和Visual Studio 2017 軟件進(jìn)行性能測試, 同時兩個平臺除了算法本身的優(yōu)化外, 沒有對軟件進(jìn)行額外的優(yōu)化設(shè)置, 均使用的是軟件默認(rèn)設(shè)置. Platform1 和Platform2 中運(yùn)行軟件的解決方案配置均采用Release 模式, 前者解決方案平臺使用x86, 后者使用x64.

        表2 中的測試方法均使用C 代碼實(shí)現(xiàn), 沒有使用匯編語言; 其中文獻(xiàn)[4] 和文獻(xiàn)[12] 中的四種方法均為在單密鑰模式下的軟件實(shí)現(xiàn), 而剩余四種方法利用SIMD 技術(shù)并行實(shí)現(xiàn). 除此之外, Platform1 中使用的SIMD 技術(shù)均為AVX2, Platform2 中的SIMD 技術(shù)均為AVX512. 圖2、圖3、圖4 和圖5 分別展示了兩個不同平臺上ZUC-256 密鑰流生成和MAC 生成的各個實(shí)現(xiàn)方法的軟件性能. 評估ZUC-256 密鑰流生成算法和MAC 生成算法的軟件實(shí)現(xiàn)性能指標(biāo)是算法每秒鐘處理數(shù)據(jù)的比特數(shù), 即bps; 在本文中,1 Gbps = 109bps. 在Platform1 中, 我們將LFSR 層的移位操作優(yōu)化技巧應(yīng)用到本文的3 個實(shí)現(xiàn)方法中, 和沒有增加代碼復(fù)雜度的實(shí)現(xiàn)方法相比, 速度提升了大約15%. 從圖2–圖5 可以發(fā)現(xiàn), 密鑰流生成算法和MAC 生成算法的最優(yōu)軟件實(shí)現(xiàn)性能結(jié)果均為AVX512 版本, 密鑰流生成算法的AVX512 版本實(shí)現(xiàn)性能可以達(dá)到21 Gbps, 相較于目前已知的最優(yōu)實(shí)現(xiàn)方法[26]性能提升了30%, 而AVX2 版本的實(shí)現(xiàn)性能則提升了56%, 主要原因在于編譯軟件的不斷智能化, Visual Studio 2017 對于代碼中的類似LFSR 層的移位操作會自行進(jìn)行優(yōu)化(注: 由于文獻(xiàn)[26] 的參考文獻(xiàn)中給出的完整實(shí)現(xiàn)代碼所在網(wǎng)址無法打開, 我們對比的結(jié)果是通過利用文獻(xiàn)[26] 中給出的方法然后自行編寫的代碼運(yùn)行得出的, 但文獻(xiàn)[26] 中結(jié)論表示AVX512 版本比AVX2 的實(shí)現(xiàn)性能稍差, 這與理論邏輯不符, 并且我們的運(yùn)行結(jié)果也驗(yàn)證了這一點(diǎn)).MAC 生成算法同文獻(xiàn)[4] 中的無優(yōu)化實(shí)現(xiàn)方法相比性能提高了20 倍. 在表2 中我們只列舉了一部分優(yōu)化方法的組合對比, 然而某些不在表2 中的其他的優(yōu)化方法組合可能會有更進(jìn)一步的速度提升, 在這里我們就不對所有可能的組合進(jìn)行一一測試.

        圖2 四種ZUC-256 密鑰流生成實(shí)現(xiàn)方法在兩個平臺上的性能表現(xiàn)Figure 2 Performance of four different methods of ZUC-256 crypt on two platforms

        圖3 四種32 比特MAC 生成實(shí)現(xiàn)方法在兩個平臺上的性能表現(xiàn)Figure 3 Performance of four different methods of 32-bits MAC generation on two platforms

        圖4 四種64 比特MAC 生成實(shí)現(xiàn)方法在兩個平臺上的性能表現(xiàn)Figure 4 Performance of four different methods of 64-bits MAC generation on two platforms

        圖5 四種128 比特MAC 生成實(shí)現(xiàn)方法在兩個平臺上的性能表現(xiàn)Figure 5 Performance of four different methods of 128-bits MAC generation on two platforms

        5 結(jié)論

        在本文中, 我們給出了ZUC-256 序列密碼算法的整體快速軟件實(shí)現(xiàn)方法, 包括密鑰流生成算法和MAC 生成算法. 密鑰流生成算法是基于文獻(xiàn)[26] 中提出的方法基礎(chǔ)上快速實(shí)現(xiàn)的, 我們一方面優(yōu)化了S-盒的查表操作, 避免了不必要的查表開銷; 另一方面, 在調(diào)用AES-NI 指令集時, 我們還對向量轉(zhuǎn)換方式進(jìn)行優(yōu)化, 保證了SIMD 實(shí)現(xiàn)過程的并行性. 實(shí)驗(yàn)結(jié)果表明, 我們的優(yōu)化方案和文獻(xiàn)[26] 相比軟件實(shí)現(xiàn)性能具有較大優(yōu)勢, 在Intel(R) Core(TM) i3-610 處理器和Intel(R) Xeon(R) Gold 6128 處理器上的軟件實(shí)現(xiàn)性能分別提升了56% 和30%, 并且在后者處理器上的軟件實(shí)現(xiàn)性能可以達(dá)到21 Gbps, 超過了5G 系統(tǒng)中的下行速度要求. 由于ZUC-128 算法和ZUC-256 算法中的MAC 生成算法大體結(jié)構(gòu)是一樣的, 文獻(xiàn)[12] 中構(gòu)造的無進(jìn)位乘法方法依然可以應(yīng)用到ZUC-256 的MAC 生成算法中; 同無優(yōu)化的MAC 生成算法的軟件實(shí)現(xiàn)性能相比, 我們利用無進(jìn)位乘法指令并行實(shí)現(xiàn)MAC 的方法具有非常明顯的優(yōu)勢. 但是, 在密鑰流生成算法和MAC 生成算法中用到的AESENCLAST 指令和PCLMULQDQ 指令目前只允許輸入128-比特的向量(SSE), 因此使用AVX2 和AVX512 指令集需要多次調(diào)用, 性能會有所降低.Intel 在2019 年5 月發(fā)布的白皮書中提出未來要擴(kuò)展現(xiàn)有的指令集, 尤其是都規(guī)劃了AESENCLAST 指令和PCLMULQDQ 指令的AVX2 和AVX512 版本[32]. 等到這些指令集正式發(fā)布以后, 相信ZUC-256算法的軟件實(shí)現(xiàn)性能會有更進(jìn)一步的提升.

        猜你喜歡
        字節(jié)比特密鑰
        探索企業(yè)創(chuàng)新密鑰
        No.8 字節(jié)跳動將推出獨(dú)立出口電商APP
        密碼系統(tǒng)中密鑰的狀態(tài)與保護(hù)*
        No.10 “字節(jié)跳動手機(jī)”要來了?
        一種對稱密鑰的密鑰管理方法及系統(tǒng)
        比特幣還能投資嗎
        海峽姐妹(2017年10期)2017-12-19 12:26:20
        簡談MC7字節(jié)碼
        比特幣分裂
        基于ECC的智能家居密鑰管理機(jī)制的實(shí)現(xiàn)
        比特幣一年漲135%重回5530元
        銀行家(2017年1期)2017-02-15 20:27:20
        免费人成无码大片在线观看| 无码精品久久久久久人妻中字| 欧美性猛交xxxx乱大交3| a级毛片免费观看视频| 久久精品中文字幕第一页| 亚洲国产91高清在线| 少妇无码av无码专线区大牛影院| 天天躁夜夜躁天干天干2020| 俺来也俺去啦久久综合网| 亚洲精品日本| 国产女人av一级一区二区三区| 国产精品亚洲а∨无码播放| 黑人巨茎大战欧美白妇| 亚洲色大成人一区二区| av在线网站一区二区| 女同精品一区二区久久| 一本久久伊人热热精品中文字幕 | 成片免费观看视频大全| 免费无码又爽又刺激高潮的视频网站| 国产精品国产三级国产专区51区 | 国产av一区二区三区丝袜| 免费观看在线视频播放| 国产免费久久精品99久久| 99爱在线精品免费观看| 亚洲国产精品一区二区第四页| 人妻av一区二区三区高| 人妖一区二区三区在线| 国产精品人妻一码二码| 好吊妞人成免费视频观看| 亚洲国产都市一区二区| 国产精品无码翘臀在线观看| 国产丝袜无码一区二区三区视频 | 中文字幕日本韩国精品免费观看| 亚洲人不卡另类日韩精品| 中文字幕在线亚洲日韩6页| 欧美日本免费一区二| 在线小黄片视频免费播放| 精品伊人久久大线蕉色首页| 国产精品-区区久久久狼| 亚洲精品无人区一区二区三区| 亚洲av综合av一区|