一種基于OpenCL的Bitslicing-KLEIN的快速實現(xiàn)方法
【專利摘要】本發(fā)明公開了一種基于OpenCL的Bitslicing?KLEIN快速實現(xiàn)方法,包括下述步驟:S1、對需要加/解密的數(shù)據(jù)進行重排;S2、對重排后的數(shù)據(jù)執(zhí)行bitslicing化KLEIN的輪函數(shù),執(zhí)行次數(shù)由密鑰長度決定;S3、將處理好的數(shù)據(jù)還原為正確的明密文格式;S4、將上述步驟寫成供OpenCL主程序調(diào)用的內(nèi)核函數(shù);S5、根據(jù)管道延遲隱藏技術(shù)確定分塊大小及調(diào)度策略,編寫OpenCL主程序;S6、執(zhí)行程序,輸出加解密結(jié)果,釋放資源。本發(fā)明通過引入重排機制對原有的bitslicing化后的KLEIN版本進行了優(yōu)化,并使用OpenCL將優(yōu)化后的算法進行并行化實現(xiàn),不僅使得KLEIN算法具備了抗邊信道的緩存和計時攻擊的特性,還提高了算法的性能,可用于快速加解密或口令破解機等,同時能使Bitslicing?KLEIN在支持OpenCL的平臺和設(shè)備上并行運行并獲得最佳性能。
【專利說明】
_種基于OpenGL的B i ts I i c i ng-KLE IN的快速實現(xiàn)方法
技術(shù)領(lǐng)域
[0001 ]本發(fā)明涉及密碼算法的技術(shù)領(lǐng)域,特別涉及基于OpenCL的Bitslicing-KLEIN的快 速實現(xiàn)方法。
【背景技術(shù)】
[0002] 自GPU的概念由Nv i d ia公司提出以來,GPU的能力就被不斷提升,并被廣泛應(yīng)用于 個人電腦、工作站、嵌入式系統(tǒng)、移動設(shè)備之中。由于它是專門為處理圖形圖像數(shù)據(jù)而設(shè)計 的,它具有高度并行的結(jié)構(gòu)。經(jīng)過多年的發(fā)展,其并行運算能力已經(jīng)遠遠超越了CPU,這也使 得它得以突破了原先單一的用途,而利用GPU對各種計算進行并行加速也成為了當(dāng)今的研 究熱點,GPGPU(通用計算圖形處理器)的概念也應(yīng)運而生。
[0003] 目前,在利用GPU進行并行化方面使用得最為普遍的是CUDA和OpenCL兩種技術(shù)。本 專利所使用的就是OpenCL技術(shù)。OpenCL全稱Open Computing Language(開放計算語言),是 由Khronos Group維護的為異構(gòu)平臺提供編寫程序(尤其是并行程序)的開放的框架標(biāo)準(zhǔn)。 OpenCL由編寫內(nèi)核程序的語言和定義并控制平臺的API兩部分組成,可以在多核CPU或者 GPU上編譯運行。通過使用OpenCL,軟件開發(fā)人員便能夠高效利用各種異構(gòu)處理平臺,從高 性能計算服務(wù)器,到家用計算機再到手持設(shè)備,都被OpenCL所支持,并且在OpenCL幫助下, 能夠組合工作。
[0004] Bitslicing技術(shù)則是由密碼學(xué)家Eli Biham最初提出并應(yīng)用在DES的軟件性能提 升上。該技術(shù)能為密碼算法提供抗邊信道的緩存和計時攻擊的特性,因而受到了不少密碼 算法設(shè)計者的青睞。目前該技術(shù)已被應(yīng)用到Serpent,Rectangle,RoadRunneR-A算法的設(shè)計 上,也被用于KLEIN,PRINCE,LED等算法的優(yōu)化上。
【發(fā)明內(nèi)容】
[0005] 本發(fā)明的主要目的在于克服現(xiàn)有技術(shù)的缺點與不足,提供一種基于OpenCL的 Bitslicing-KLEIN并行化實現(xiàn)方法,利用OpenCL結(jié)合管道延遲隱藏來實現(xiàn)Bitslicing-KELIN的并行化。
[0006] 為了達到上述目的,本發(fā)明采用以下技術(shù)方案:
[0007] 本發(fā)明一種基于OpenCL的Bitslicing-KLEIN的快速實現(xiàn)方法,包括下述步驟:
[0008] S1、對需要加/解密的數(shù)據(jù)進行重排,輸入數(shù)據(jù)經(jīng)過重排后,排列成適合 Bitslicing-KLEIN中的SubNibbles和 MixNibbles 操作的形式;
[0009] S2、對重排后的數(shù)據(jù)執(zhí)行bitslicing化KLEIN的輪函數(shù),執(zhí)行次數(shù)由密鑰長度決 定;
[0010] S3、將處理好的數(shù)據(jù)還原為正確的明密文格式,輪函數(shù)執(zhí)行過后,對數(shù)據(jù)進行重 排,使其還原成明文或者密文的格式,再將其保存到輸出數(shù)據(jù)所在的存儲區(qū)域中;
[0011] S4、將上述步驟S1-S3寫成供OpenCL主程序調(diào)用的內(nèi)核函數(shù),函數(shù)的參數(shù)包括加/ 解密用的明/密文數(shù)據(jù)的地址、輪數(shù)、加/解密用的密鑰數(shù)據(jù)的地址以及存放加/解密結(jié)果的 地址;
[0012] S5、根據(jù)最優(yōu)化策略確定分塊大小及調(diào)度策略,編寫OpenCL主程序,主程序包括設(shè) 置分塊大小,獲取可用平臺,獲取設(shè)備列表并選中目標(biāo)設(shè)備作為運行設(shè)備,創(chuàng)建上下文環(huán) 境,創(chuàng)建內(nèi)核程序?qū)ο蟛⑦M行編譯、創(chuàng)建傳輸隊列和內(nèi)核執(zhí)行隊列,創(chuàng)建內(nèi)存空間,設(shè)置參 數(shù)映射,拷貝數(shù)據(jù)到設(shè)備,根據(jù)管道延遲隱藏技術(shù)安排傳輸隊列和內(nèi)核隊列的執(zhí)行順序,從 目標(biāo)設(shè)備中拷貝執(zhí)行結(jié)果,釋放資源;
[0013] S6、運行主程序,輸出加/解密結(jié)果,釋放資源,主程序編寫好后,直接運行,目標(biāo)設(shè) 備會按照主程序的設(shè)置及調(diào)度策略合理地循環(huán)執(zhí)行拷貝數(shù)據(jù)到目標(biāo)設(shè)備,讓各個線程運行 內(nèi)核程序,將運行結(jié)果從目標(biāo)設(shè)備拷貝回主機三個操作,等所有數(shù)據(jù)處理結(jié)果都完成之后, 將結(jié)果輸出到指定的位置并釋放資源。
[0014] 作為優(yōu)選的技術(shù)方案,步驟S1中,對輸入數(shù)據(jù)進行重排的具體方法是:
[0015] 為了發(fā)揮bitslicing技術(shù)的并行特性,需要將明文或者密文從 S0SlS2S3S4S5S6S7S8S9Sl()SllS12Sl:BS14S15;£i^%S()SlS8S9S2S:BSl()SllS4S5S12Sl:BS6S7S14S15 + 比特,對應(yīng)KLEIN中的第i個S盒的輸入,重排時需要同時按照Mi xNi bb 1 e S時的輸入作為劃 分,將第i個比特位分配到對應(yīng)的變量上,MixNibbles將相鄰的兩個S盒的輸入劃分為一組, 重排時需要將MixNibbles輸入的所有第0比特分配到變量νο中,貝lJv() = si|()S9|()S3|()Sii|oS5| 0813|咖|()815|(),¥1為所有輸入的第1比特,¥2,¥3以此類推,其中81|()為第;[個3盒輸入的最低位, 類似地將聽義附131316 8所有輸入的第4比特分配到變量¥4中,貝11¥4=8()|()88|()82|()81()|()84|()812| 086|防14|(),¥5為所有輸入的第5比特,¥6,¥7以此類推。
[0016] 作為優(yōu)選的技術(shù)方案,步驟S2中,需要處理的數(shù)據(jù)經(jīng)過重排后,直接執(zhí)行 Bitsl icing-KLEIN的輪函數(shù),包括輪密鑰加、塊替換、塊旋轉(zhuǎn)以及塊混合四個步驟;
[0017] 所述輪密鑰加,是在待加密數(shù)據(jù)和密鑰重排好之后,直接進行異或運算;
[0018] 所述塊替換,直接使用Bitslicing-KLEIN的塊替換中的布爾表達式,不同之處在 于,由于數(shù)據(jù)已經(jīng)重排好,不需要逐比特提取出來再進行布爾表達式的運算;
[0019] 所述塊旋轉(zhuǎn),是在KLEIN中,加密的時候是左移兩個字節(jié),所以只需將變量的值進 行交換即可;
[0020]所述塊混合,直接使用Bitsl icing-KLEIN的塊混合中的布爾表達式進行運算,不 同之處在于,不需要逐比特提取出來再執(zhí)行運算。
[0021] 作為優(yōu)選的技術(shù)方案,步驟S4中,所述加/解密用的明/密文數(shù)據(jù)地址、加/解密用 的密鑰數(shù)據(jù)地址以及加/解密結(jié)果的地址均為無符號字符向量全局指針,輪數(shù)的類型為整 型,編寫內(nèi)核函數(shù)的時候,可以用C語言的內(nèi)置類型,并推薦使用OpenCL提供的內(nèi)置類型。
[0022] 作為優(yōu)選的技術(shù)方案,所述內(nèi)核函數(shù)的內(nèi)容包括獲取當(dāng)前工作節(jié)點的位置,獲取 對應(yīng)的處理數(shù)據(jù),對加/解密用的明/密文數(shù)據(jù)進行重排,對加/解密用的密鑰數(shù)據(jù)進行重 排,根據(jù)輪數(shù)循環(huán)執(zhí)行輪密鑰加、輪密鑰生成、塊替換、塊旋轉(zhuǎn)、塊混合,最后再執(zhí)行一次輪 密鑰加,然后對數(shù)據(jù)進行重排還原成恰當(dāng)?shù)呐帕?,最后將處理好的?shù)據(jù)存進保存加/解密結(jié) 果的數(shù)組中。
[0023] 作為優(yōu)選的技術(shù)方案,步驟S5中,所述根據(jù)最優(yōu)化策略確定分塊大小及調(diào)度策略, 編寫OpenCL主程序具體為:
[0024] 首先要設(shè)置global_work_size以及l(fā)ocal_work_size兩個參數(shù)的值;
[0025] 然后要配置OpenCL的運行環(huán)境,具體如下:
[0026] 先使用〇166七?1&七:1^〇1'1111〇8和〇166七?1&七;1^〇1'111111;1^〇兩個命令來獲取可用的計算平 臺,并選擇AMD環(huán)境作為計算平臺;然后使用clCreateContextFromType命令生成上下文環(huán) 境,命令的第二個參數(shù)設(shè)為CL_DEVICE_TYPE_GPU表示使用GPU作為計算設(shè)備;再使用 clGetContextlnfo命令獲取計算設(shè)備的信息,檢查所選設(shè)備是否正確;接著使用 clCreateProgramWithSource命令創(chuàng)建程序?qū)ο螅褂胏lBui ldProgram編譯程序?qū)ο?,確保 程序?qū)ο竽鼙徽?zhí)行;然后使用clCreateKernel命令創(chuàng)建內(nèi)核對象;最后使用 clCreateCommandQueue命令創(chuàng)建執(zhí)行內(nèi)核函數(shù)以及執(zhí)行數(shù)據(jù)傳輸?shù)膬蓚€命令隊列;使用 clCreateBuffer命令為輸入數(shù)據(jù)、輸出數(shù)據(jù)及輪密鑰數(shù)據(jù)創(chuàng)建內(nèi)存空間;然后使用 clSetKernelArg命令為內(nèi)核程序設(shè)置相應(yīng)的參數(shù),需要設(shè)置的參數(shù)個數(shù)與內(nèi)核函數(shù)的參數(shù) 個數(shù)一致;
[0027]在核心部分,需要根據(jù)管道延遲隱藏技術(shù)的調(diào)度策略,分多次使用 clEnqueueWriteBuffer命令將待加密的明文以及要使用到的密鑰復(fù)制到顯存中,然后使用 clEnqueueNDRangeKernel命令將內(nèi)核程序放入命令隊列中執(zhí)行然后使用 clEnqueueReadBuffer命令從顯存中讀取加密結(jié)果;
[0028] 最后的部分,使用clRe lease、free命令釋放資源。
[0029]作為優(yōu)選的技術(shù)方案,在IDE中打開OpenCL主程序,或者使用命令行界面,直接進 行編譯運行,根據(jù)OpenCL主程序,加密結(jié)果會輸出到屏幕或者指定的文件當(dāng)中。
[0030]本發(fā)明與現(xiàn)有技術(shù)相比,具有如下優(yōu)點和有益效果:
[0031] 1、本發(fā)明在原有的Bitslicing-KLEIN的基礎(chǔ)上引入了重排的機制,使得 bitsl icing技術(shù)的并行特性能充分發(fā)揮出來,同時免去了原有算法中SubNibbles和 MixNibbles中比特提取的過程,從而使算法具有了更好的并行特性。
[0032] 2.本發(fā)明綜合考慮了并行粒度,內(nèi)存分配策略并在管道延遲隱藏技術(shù)指導(dǎo)下進行 了合理的分塊,選擇了合理的調(diào)度策略,可以保證本發(fā)明中的B i t s 1 i c ing-KLE IN在使用GPU 進行并行實現(xiàn)時的性能。
【附圖說明】
[0033]圖1是本發(fā)明的KLEIN加/解密流程圖;
[0034] 圖2本發(fā)明基于OpenCL的Bitslicing-KLEIN的快速實現(xiàn)方法的流程圖。
【具體實施方式】
[0035]下面結(jié)合實施例及附圖對本發(fā)明作進一步詳細的描述,但本發(fā)明的實施方式不限 于此。
[0036] 實施例
[0037] 本實施例基于OpenCL給出了一種Bitslicing-KLEIN的并行化加密的實現(xiàn)方法,使 用的是KLEIN-64。如圖1、圖2所示,根據(jù)該實施例的步驟,稍加修改也可用于KLEIN-80/96以 及并行化解密或并行化加解密的實現(xiàn)。
[0038] 1、對需要加/解密的數(shù)據(jù)進行重排。
[0039]本實施列中,待加密的數(shù)據(jù)大小為64比特,在內(nèi)存中使用8個8比特的變量存放,在 OpenCL中使用8比特的向量(含8個元素)來表示。將KLEIN用到的16個S盒的輸入標(biāo)記為so, S1,......,S15,其中Si為4比特,Si |j為第i個s盒輸入中的第j比特,待加密的數(shù)據(jù)以矩陣的方 式來表示,則重排的操作可以表示為:
[0040]
[0041 ]設(shè)存儲輸入數(shù)據(jù)的8個變量為vO,vl,……,v7,則它們重排后為:
[0042] V0=S1|3||S9|3||S3|3||S11|3||S5|3||S13|3||S7|3||S15|3
[0043] Vl = si|2l|s9|2l|s3|2l|sil|2l|s5|2l|si3|2l|s7|2l|si5|2
[0044] V2 = si|l||s9|l||s3|ll|sil|l||s5|ll|si3|ll|s7|ll|si5|l
[0045] V3 = si|o||s9|o||s3|ol|sn|o||s5|ol|si3|ol|s7|ol|si5|o
[0046] V4=s0|3l|s8|3l|s2|3l|si0|3l|s4|3l|si2|3l|s6|3l|si4|3
[0047] V5 = s0|2l|s8|2l|s2|2l|si0|2l|s4|2l|si2|2l|s6|2l|si4|2
[0048] V6=s0|l||s8|ll|s2|ll|si0|l||s4|ll|si2|ll|s6|ll|si4|l
[0049] V7 = S〇|〇||s8|〇l|s2|〇l|si〇|〇||s4|〇l|si2|〇l|s6|〇l|si4|〇
[0050] 為了進一步提高重排的效率,可以使用矩陣快速轉(zhuǎn)置算法然后再分別對各個變量 進行調(diào)整。
[0051 ] 2、對重排后的數(shù)據(jù)執(zhí)行bitslicing化KLEIN的輪函數(shù),執(zhí)行次數(shù)由密鑰長度決定。
[0052]本實施例中,因為輸入數(shù)據(jù)時64比特,按照KLEIN的設(shè)計輪數(shù)為12輪。由于重排后 的數(shù)據(jù)不能直接執(zhí)行KLEIN輪函數(shù)的操作,所以需要對KLEIN輪函數(shù)中的四個操作以及密鑰 生成的操作進行修改。以下對各個操作進行介紹:
[0053]輪密鑰加:由于待加密數(shù)據(jù)和密鑰已經(jīng)重排好,可以直接進行異或運算。
[0054]塊替換:直接使用Bitslicing-KLEIN的塊替換中的布爾表達式,不同之處在于,由 于已經(jīng)重排好了,不需要逐比特提取出來再進行布爾表達式的運算,在本實施例中可以直 接進行布爾表達式運算。
[0055]塊旋轉(zhuǎn):在KLEIN中,加密的時候是左移兩個字節(jié),所以只需將變量的值交換一下 就可以了。而經(jīng)過重排之后,需要對各個變量進行旋轉(zhuǎn)的操作,以V0為例:旋轉(zhuǎn)前為VQ = S1|3|| 89|3||83|3||811|3||85|3||813|3||87|3||815|3,方定車專后為¥0=85|3||813|3||87|3||815|3||89|3||81|3||811|3||83|3〇 [0056]塊混合:直接使用Bitslicing-KLEIN的塊混合中的布爾表達式進行運算,不同之 處在于,不需要逐比特提取出來再執(zhí)行運算。
[0057]輪密鑰生成算法的修改辦法類似,此處不予贅述。
[0058] 3、將處理好的數(shù)據(jù)還原為正確的明密文格式。
[0059]此處相當(dāng)于步驟1重排的逆運算,還原的操作可表示為:
[0060]
[0061] 4、將上述步驟寫成供OpenCL主程序調(diào)用的內(nèi)核函數(shù)。
[0062] 本實施例中,內(nèi)核函數(shù)參數(shù)有四個,分別是存放明文數(shù)據(jù)的數(shù)組的地址(輸入數(shù) 據(jù))、存放密鑰數(shù)據(jù)的數(shù)組的地址,加密輪數(shù)以及存放加密結(jié)果的數(shù)組的地址(輸出數(shù)據(jù))。 [0063]為了確保工作節(jié)點能訪問到正確的數(shù)據(jù),這里使用整型變量idx來標(biāo)識工作節(jié)點 在工作空間中的位置。由于明文分組大小和密鑰的大小一致,所以用同一個變量就能訪問 對應(yīng)的明文分組和密鑰。
[0064] get_global_id(x)函數(shù)可以獲取當(dāng)前執(zhí)行的工作節(jié)點在工作空間中指定維度X上 的索引位置。那么,
[0065] int idx = get_global_id(0);
[0066] 有了該索引就可以直接獲取到當(dāng)前工作節(jié)點需要處理的明文及使用的密鑰。內(nèi)核 函數(shù)的偽代碼如下:
[0067]
[0068]
[0069] 5、根據(jù)最優(yōu)化策略確定分塊大小及調(diào)度策略,編寫OpenCL主程序。
[0070] 首先要設(shè)置global_work_size以及l(fā)ocal_work_size兩個參數(shù)的值:
[0071] 本實施例中,明文分組數(shù)量為1310720 (10ΜΒ),輪密鑰分組大小為1,GPU支持的一 個維度上工作節(jié)點的數(shù)量上限為1024,根據(jù)管道延遲隱藏模型,單個線程處理的分塊為2MB 時最合適,因而需要分5次執(zhí)行,每次需要處理的分組個數(shù)為1310720/5,所以有:
[0072] size_t global_work_size[2]={1310720/5,1}
[0073] size_t local_work_size[2]={1024,1}
[0074] 也就是,執(zhí)行該內(nèi)核程序的工作空間為1維,1維中有1310720/5工作節(jié)點,其中每 1024個工作節(jié)點組成一個工作組。
[0075] 然后要配置OpenCL的運行環(huán)境:
[0076] 先使用〇166七?1&七:1^〇1'1111〇8和〇166七?1&七;1^〇1'111111;1^〇兩個命令來獲取可用的計算平 臺,并選擇AMD環(huán)境作為計算平臺;然后使用clCreateContextFromType命令生成上下文環(huán) 境,命令的第二個參數(shù)設(shè)為CL_DEVICE_TYPE_GPU表示使用GPU作為計算設(shè)備;再使用 clGetContextlnfo命令獲取計算設(shè)備的信息,檢查所選設(shè)備是否正確;接著使用 clCreateProgramWithSource命令創(chuàng)建程序?qū)ο螅褂胏lBui ldProgram編譯程序?qū)ο?,確保 程序?qū)ο竽鼙徽?zhí)行;然后使用clCreateKernel命令創(chuàng)建內(nèi)核對象;最后使用 clCreateCommandQueue命令創(chuàng)建執(zhí)行內(nèi)核函數(shù)以及執(zhí)行數(shù)據(jù)傳輸?shù)膬蓚€命令隊列。使用 clCreateBuffer命令為輸入數(shù)據(jù)、輸出數(shù)據(jù)及輪密鑰數(shù)據(jù)創(chuàng)建內(nèi)存空間;然后使用 clSetKernelArg命令為內(nèi)核程序設(shè)置相應(yīng)的參數(shù),需要設(shè)置的參數(shù)個數(shù)與內(nèi)核函數(shù)的參數(shù) 個數(shù)一致。
[0077]在核心部分,需要根據(jù)管道延遲隱藏技術(shù)的調(diào)度策略,分多次使用 clEnqueueWriteBuffer命令將待加密的明文以及要使用到的密鑰復(fù)制到顯存中,然后使用 clEnqueueNDRangeKernel命令將內(nèi)核程序放入命令隊列中執(zhí)行然后使用 clEnqueueReadBuffer命令從顯存中讀取加密結(jié)果。在本實施例中,因為內(nèi)核函數(shù)的執(zhí)行時 間比兩次傳輸數(shù)據(jù)需要的時間長。所以按照最優(yōu)的調(diào)度策略,應(yīng)該是等第一次輸傳輸完畢 后,馬上進行第一次的內(nèi)核執(zhí)行,同時進行第二次的數(shù)據(jù)傳輸。等第一次內(nèi)核執(zhí)行完畢后, 可以馬上執(zhí)行數(shù)據(jù)的返回,此時第二次用到的數(shù)據(jù)也已經(jīng)傳輸完畢了,所以可以馬上進行 第二次的內(nèi)核執(zhí)行。以此類推。若使用的環(huán)境與本實施例不同,則應(yīng)該先自行測出目標(biāo)設(shè)備 的傳輸時間及內(nèi)核執(zhí)行時間,從而根據(jù)管道延遲技術(shù)的最優(yōu)調(diào)度策略來對傳輸和內(nèi)核執(zhí)行 進行合理安排。
[0078]最后的部分,使用clRe lease、free等命令釋放資源。
[0079] 6、運行主程序,輸出加/解密結(jié)果,釋放資源。
[0080] 在IDE中打開OpenCL主程序,或者使用命令行界面,直接對其進行編譯運行即可。 根據(jù)OpenCL主程序,加密結(jié)果會輸出到屏幕或者指定的文件當(dāng)中。
[0081 ]實驗結(jié)果
[0082] 本實例運行環(huán)境為:CHJ型號為Core i5 3210,內(nèi)存8G,操作系統(tǒng)為WinlO. 1(64 位),GPU型號為Nvidia GT640M,顯存2G,所使用的SDK版本為CUDA Toolkit 7.5(0penCL 1.2),使用的集成開發(fā)環(huán)境為Visual Studio 2013。
[0083] 本實例在輸入數(shù)據(jù)大小為10MB時,與原版KLEIN及原版KLEIN經(jīng)過bitslicing化后 的版本BS-KLEIN的性能比較:
[0084]
[0085] 上述實施例為本發(fā)明較佳的實施方式,但本發(fā)明的實施方式并不受上述實施例的 限制,其他的任何未背離本發(fā)明的精神實質(zhì)與原理下所作的改變、修飾、替代、組合、簡化, 均應(yīng)為等效的置換方式,都包含在本發(fā)明的保護范圍之內(nèi)。
【主權(quán)項】
1. 一種基于OpenCL的Bitslicing-KLEIN的快速實現(xiàn)方法,其特征在于,包括下述步驟: 51、 對需要加/解密的數(shù)據(jù)進行重排,輸入數(shù)據(jù)經(jīng)過重排后,排列成適合Bitslicing-KLEIN中的 SubNibbles 和 MixNibbles 操作的形式; 52、 對重排后的數(shù)據(jù)執(zhí)行bitslicing化KLEIN的輪函數(shù),執(zhí)行次數(shù)由密鑰長度決定; 53、 將處理好的數(shù)據(jù)還原為正確的明密文格式,輪函數(shù)執(zhí)行過后,對數(shù)據(jù)進行重排,使 其還原成明文或者密文的格式,再將其保存到輸出數(shù)據(jù)所在的存儲區(qū)域中; 54、 將上述步驟S1-S3寫成供OpenCL主程序調(diào)用的內(nèi)核函數(shù),函數(shù)的參數(shù)包括加/解密 用的明/密文數(shù)據(jù)的地址、輪數(shù)、加/解密用的密鑰數(shù)據(jù)的地址以及存放加/解密結(jié)果的地 址; 55、 根據(jù)最優(yōu)化策略確定分塊大小及調(diào)度策略,編寫OpenCL主程序,主程序包括設(shè)置分 塊大小,獲取可用平臺,獲取設(shè)備列表并選中目標(biāo)設(shè)備作為運行設(shè)備,創(chuàng)建上下文環(huán)境,創(chuàng) 建內(nèi)核程序?qū)ο蟛⑦M行編譯、創(chuàng)建傳輸隊列和內(nèi)核執(zhí)行隊列,創(chuàng)建內(nèi)存空間,設(shè)置參數(shù)映 射,拷貝數(shù)據(jù)到設(shè)備,根據(jù)管道延遲隱藏技術(shù)安排傳輸隊列和內(nèi)核隊列的執(zhí)行順序,從目標(biāo) 設(shè)備中拷貝執(zhí)行結(jié)果,釋放資源; 56、 運行主程序,輸出加/解密結(jié)果,釋放資源,主程序編寫好后,直接運行,目標(biāo)設(shè)備會 按照主程序的設(shè)置及調(diào)度策略合理地循環(huán)執(zhí)行拷貝數(shù)據(jù)到目標(biāo)設(shè)備,讓各個線程運行內(nèi)核 程序,將運行結(jié)果從目標(biāo)設(shè)備拷貝回主機三個操作,等所有數(shù)據(jù)處理結(jié)果都完成之后,將結(jié) 果輸出到指定的位置并釋放資源。2. 根據(jù)權(quán)利要求1所述的基于OpenCL的Bitslicing-KLEIN的快速實現(xiàn)方法,步驟Sl中, 對輸入數(shù)據(jù)進行重排的具體方法是: 為了發(fā)揮bitslicing技術(shù)的并行特性,需要將明文或者密文從SQS1S2S3S4S5S6S7S8S9S10S11 S12S13S14S15重排為SQS1S8S9S2S3S1QS11S4S5S12S13S6S7S14S15,其中 Si為4比特,對應(yīng)KLEIN中的第i 個S盒的輸入,重排時需要同時按照MixNibbles時的輸入作為劃分,將第i個比特位分配到 對應(yīng)的變量上,MixNibbles將相鄰的兩個S盒的輸入劃分為一組,重排時需要將MixNibbles 輸入的所有第〇比特分配到變量VQ中,則V0=S1|QS9|()S3|()S11|()S5|()S13|()S7|()S15|(),V1為所有輸入 的第1比特,V2,V3以此類推,其中Si |〇為第i個S盒輸入的最低位,類似地將MixNibbles所有輸 入的第4比特分配到變量V4中,則¥4=80|088|()82|()81()|()84|()812|()86|()814|(),¥5為所有輸入的第5比 特,V6,V7以此類推。3. 根據(jù)權(quán)利要求1所述的基于OpenCL的Bitslicing-KLEIN的快速實現(xiàn)方法,其特征在 于,步驟S2中,需要處理的數(shù)據(jù)經(jīng)過重排后,直接執(zhí)行Bitslicing-KLEIN的輪函數(shù),包括輪 密鑰加、塊替換、塊旋轉(zhuǎn)以及塊混合四個步驟; 所述輪密鑰加,是在待加密數(shù)據(jù)和密鑰重排好之后,直接進行異或運算; 所述塊替換,直接使用Bitslicing-KLEIN的塊替換中的布爾表達式,不同之處在于,由 于數(shù)據(jù)已經(jīng)重排好,不需要逐比特提取出來再進行布爾表達式的運算; 所述塊旋轉(zhuǎn),是在KLEIN中,加密的時候是左移兩個字節(jié),所以只需將變量的值進行交 換即可; 所述塊混合,直接使用Bitslicing-KLEIN的塊混合中的布爾表達式進行運算,不同之 處在于,不需要逐比特提取出來再執(zhí)行運算。4. 根據(jù)權(quán)利要求1所述的基于OpenCL的Bitslicing-KLEIN的快速實現(xiàn)方法,其特征在 于,步驟S4中,所述加/解密用的明/密文數(shù)據(jù)地址、加/解密用的密鑰數(shù)據(jù)地址以及加/解密 結(jié)果的地址均為無符號字符向量全局指針,輪數(shù)的類型為整型,編寫內(nèi)核函數(shù)的時候,可以 用C語言的內(nèi)置類型,并推薦使用OpenCL提供的內(nèi)置類型。5. 根據(jù)權(quán)利要求4所述的基于OpenCL的Bitslicing-KLEIN的快速實現(xiàn)方法,其特征在 于,所述內(nèi)核函數(shù)的內(nèi)容包括獲取當(dāng)前工作節(jié)點的位置,獲取對應(yīng)的處理數(shù)據(jù),對加/解密 用的明/密文數(shù)據(jù)進行重排,對加/解密用的密鑰數(shù)據(jù)進行重排,根據(jù)輪數(shù)循環(huán)執(zhí)行輪密鑰 加、輪密鑰生成、塊替換、塊旋轉(zhuǎn)、塊混合,最后再執(zhí)行一次輪密鑰加,然后對數(shù)據(jù)進行重排 還原成恰當(dāng)?shù)呐帕?,最后將處理好的?shù)據(jù)存進保存加/解密結(jié)果的數(shù)組中。6. 根據(jù)權(quán)利要求5所述的基于OpenCL的Bitslicing-KLEIN的快速實現(xiàn)方法,其特征在 于,步驟S5中,所述根據(jù)最優(yōu)化策略確定分塊大小及調(diào)度策略,編寫OpenCL主程序具體為: 首先要設(shè)置gl〇bal_work_size以及l(fā)ocal_work_size兩個參數(shù)的值; 然后要配置OpenCL的運行環(huán)境,具體如下: 先使用clGetPlatformIDs和clGetPlatformlnfo兩個命令來獲取可用的計算平臺,并 選擇AMD環(huán)境作為計算平臺;然后使用ClCreateContextFromType命令生成上下文環(huán)境,命 令的第二個參數(shù)設(shè)為CL_DEVICE_TYPE_GPU表示使用GPU作為計算設(shè)備;再使用 clGetContextlnfo命令獲取計算設(shè)備的信息,檢查所選設(shè)備是否正確;接著使用 clCreateProgramWithSource命令創(chuàng)建程序?qū)ο?,使用clBui IdProgram編譯程序?qū)ο螅_保 程序?qū)ο竽鼙徽?zhí)行;然后使用c ICreateKernel命令創(chuàng)建內(nèi)核對象;最后使用 clCreateCommandQueue命令創(chuàng)建執(zhí)行內(nèi)核函數(shù)以及執(zhí)行數(shù)據(jù)傳輸?shù)膬蓚€命令隊列;使用 ClCreateBuffer命令為輸入數(shù)據(jù)、輸出數(shù)據(jù)及輪密鑰數(shù)據(jù)創(chuàng)建內(nèi)存空間;然后使用 ClSetKernelArg命令為內(nèi)核程序設(shè)置相應(yīng)的參數(shù),需要設(shè)置的參數(shù)個數(shù)與內(nèi)核函數(shù)的參數(shù) 個數(shù)一致; 在核心部分,需要根據(jù)管道延遲隱藏技術(shù)的調(diào)度策略,分多次使用 ClEnqueueWriteBuffer命令將待加密的明文以及要使用到的密鑰復(fù)制到顯存中,然后使用 ClEnqueueNDRangeKernel命令將內(nèi)核程序放入命令隊列中執(zhí)行然后使用 ClEnqueueReadBuffer命令從顯存中讀取加密結(jié)果; 最后的部分,使用〇11^16&86、;^66命令釋放資源。7. 根據(jù)權(quán)利要求1所述的基于OpenCL的Bitslicing-KLEIN的快速實現(xiàn)方法,其特征在 于,在IDE中打開OpenCL主程序,或者使用命令行界面,直接進行編譯運行,根據(jù)OpenCL主程 序,加密結(jié)果會輸出到屏幕或者指定的文件當(dāng)中。
【文檔編號】H04L9/08GK105933111SQ201610369557
【公開日】2016年9月7日
【申請日】2016年5月27日
【發(fā)明人】龔征, 袁宇恒, 溫雅敏, 廖國鴻, 魏標(biāo), 李泮琳, 黎偉杰
【申請人】華南師范大學(xué), 廣東財經(jīng)大學(xué)