本發(fā)明涉及異構(gòu)系統(tǒng)的密碼算法的加速實(shí)現(xiàn)設(shè)計(jì)領(lǐng)域,具體為設(shè)計(jì)適用于通用cpu2+fpga1設(shè)備的pbkdf2密碼算法的加速框架,并利用高層綜合工具實(shí)現(xiàn)從c語言級(jí)別在現(xiàn)場可編程門陣列(fpga1)上的加速裝置。
背景技術(shù):
在如今這個(gè)到處充斥著各種各樣信息的世界里,保護(hù)被存儲(chǔ)、傳輸或共享的敏感數(shù)據(jù)和信息已經(jīng)成為一個(gè)非常重要的話題。使用密碼是一種非常常見并且簡單的保護(hù)用戶信息安全的方法。正確使用密碼來保護(hù)敏感數(shù)據(jù)和信息不僅需要選擇強(qiáng)密碼,而且需要選擇一種安全的方法來處理軟件和硬件系統(tǒng)中的密碼。于是產(chǎn)生了各種各樣的加密算法,并且隨著計(jì)算能力的不斷提升,加密算法的種類在不斷地更新,強(qiáng)度也在不斷地提升。于是圍繞著研究編制密碼、恢復(fù)密碼,確保信息的秘密性、真實(shí)性的技術(shù)科學(xué)——密碼學(xué),各種不同的技術(shù)和研究方向也應(yīng)運(yùn)而生,密碼恢復(fù)技術(shù)也就是其中一種被人們所需要的技術(shù)。
密碼恢復(fù)是指從計(jì)算機(jī)系統(tǒng)存儲(chǔ)或傳輸?shù)臄?shù)據(jù)中恢復(fù)密碼的過程。密碼恢復(fù)的目的可能是幫助用戶恢復(fù)被忘記的密碼獲得對(duì)系統(tǒng)的未經(jīng)授權(quán)的訪問;或者讓系統(tǒng)管理員檢查容易被破解的密碼;又或者是使用密碼恢復(fù)來獲取法官允許訪問的數(shù)字證據(jù)。
常見的密碼恢復(fù)方法有窮舉法、字典法等。窮舉法是依靠多次猜測密碼,字典法是按照已有的字典一條一條地嘗試密碼,對(duì)比密碼在加密算法中的最終值是否與可得到的正確密鑰的最終值相同。
大部分處理密碼的算法中的計(jì)算核心都包含哈希(hash)函數(shù),如:數(shù)字簽名標(biāo)準(zhǔn)、安全電子交易、因特網(wǎng)協(xié)議安全、無線局域網(wǎng)安全、隨機(jī)數(shù)生成算法、密碼存儲(chǔ)機(jī)制等。以特定次數(shù)的迭代對(duì)密碼進(jìn)行哈希計(jì)算,然后將生成的哈希值存儲(chǔ)在身份驗(yàn)證中是最簡單的處理用戶的密碼的方法,如pbkdf2算法。pbkdf2算法是如今處理密鑰最常用的算法之一,如winzip、wpa2、rar5等都應(yīng)用了pbkdf2算法來處理用戶密鑰。
為了保證算法的強(qiáng)度,pbkdf2算法中引入了計(jì)算密集型操作,這些操作基于將輸入值映射到派生密鑰的迭代的偽隨機(jī)函數(shù)。由于pbkdf2算法中有迭代次數(shù)較多的偽隨機(jī)函數(shù),循環(huán)部分存在較大加速實(shí)現(xiàn)計(jì)算的空間。
針對(duì)pbkdf2算法性能的分析研究多基于通用cpu或者gpu(graphicprocessingunit,圖形處理器)的硬件平臺(tái),這樣就造成運(yùn)行速度受限于cpu或gpu的更新?lián)Q代,最新的cpu或gpu受限于成本和部署規(guī)模的限制,而老的cpu或gpu又受限制于性能。
現(xiàn)場可編程門陣列(field-programmablegatearray,fpga)是作為專用集成電路領(lǐng)域中的一種半定制電路而出現(xiàn)的,既解決了定制電路的不足,又克服了原有可編程器件門電路數(shù)有限的缺點(diǎn)。目前,xilinx公司的一些fpga芯片中還加入了cpu,這種處理器系統(tǒng)與現(xiàn)場可編程門陣列的組合設(shè)計(jì)大大方便了專用芯片電路的應(yīng)用開發(fā),不僅有軟件的可編程性和靈活性,同時(shí)又有專用集成電路的高吞吐率和低延時(shí)的特性;而且fpga內(nèi)部的資源是可以重配置的,易于平衡數(shù)據(jù)并行和流水并行。近年來,將特定密碼算法在fpga中進(jìn)行實(shí)現(xiàn),以提高算法的處理速度是密碼領(lǐng)域的一個(gè)研究方向。
技術(shù)實(shí)現(xiàn)要素:
本發(fā)明要解決的問題是提供一種用于pbkdf2密碼算法的加速裝置與方法。
為了解決上述技術(shù)問題,本發(fā)明提供一種pbkdf2密碼算法加速裝置,包括由fpga與通用cpu組成的cpu+fpga異構(gòu)系統(tǒng);
所述cpu與fpga通過總線接口相連接;
所述cpu用于對(duì)輸入的口令進(jìn)行預(yù)計(jì)算,并將預(yù)計(jì)算結(jié)果處理后通過總線接口傳輸至fpga,以及用于讀取并校驗(yàn)所述fpga加速計(jì)算后得到的結(jié)果數(shù)據(jù);
所述fpga用于讀取cpu預(yù)計(jì)算的計(jì)算結(jié)果,并加速計(jì)算pbkdf2算法的循環(huán)體,將得到的結(jié)果數(shù)據(jù)通過總線接口傳輸至cpu。
作為本發(fā)明的pbkdf2密碼算法加速裝置的改進(jìn):所述fpga包含至少一個(gè)的(即一個(gè)或多個(gè))用于pbkdf2算法中循環(huán)部分加速計(jì)算的ip核。
作為本發(fā)明的pbkdf2密碼算法加速裝置的改進(jìn):fpga中的單個(gè)循環(huán)部分的ip核包括分組循環(huán)流水部分、雙bram輸送存儲(chǔ)數(shù)據(jù)部分和分組交錯(cuò)處理部分,所述分組交錯(cuò)處理部分分別與分組循環(huán)流水部分和雙bram輸送存儲(chǔ)數(shù)據(jù)部分連接:
所述分組循環(huán)流水部分用于將pbkdf2中運(yùn)算次數(shù)最多的核心函數(shù)進(jìn)行流水,并在數(shù)據(jù)進(jìn)行分組后,將分組數(shù)據(jù)輸入循環(huán)流水線進(jìn)行計(jì)算;
所述雙bram輸送存儲(chǔ)數(shù)據(jù)部分用于存儲(chǔ)和傳輸循環(huán)部分每組數(shù)據(jù)中不隨運(yùn)算改變的固定參數(shù)、隨著運(yùn)算過程改變的過程參數(shù)以及輸出參數(shù);
所述分組交錯(cuò)處理部分用于將從cpu預(yù)計(jì)算處理后傳來的兩組不同的數(shù)據(jù)分別存儲(chǔ)于雙bram輸送存儲(chǔ)數(shù)據(jù)部分并從雙bram輸送存儲(chǔ)數(shù)據(jù)部分取出相應(yīng)數(shù)據(jù)交錯(cuò)送入分組循環(huán)流水部分進(jìn)行計(jì)算,另外輸出參數(shù)的計(jì)算也隨著流水線的計(jì)算進(jìn)行分組交錯(cuò)處理。
本發(fā)明還同時(shí)提供了利用上述裝置進(jìn)行的pbkdf2密碼算法加速方法,包含以下步驟:
1)、初始化:將預(yù)計(jì)算部分和在執(zhí)行pbkdf2算法循環(huán)體之前的部分在cpu中進(jìn)行計(jì)算,并將計(jì)算結(jié)果通過總線接口傳輸至fpga;
2)、循環(huán):將pbkdf2算法中計(jì)算密集的循環(huán)體部分放置在fpga上,利用優(yōu)化手段提升fpga上的加速效果以及資源利用效率,并將計(jì)算結(jié)果通過總線接口傳輸至cpu;
3)、校驗(yàn):讀取fpga加速計(jì)算后得到的結(jié)果數(shù)據(jù),并執(zhí)行運(yùn)算結(jié)果匯總以及校驗(yàn)值計(jì)算判定。
作為本發(fā)明的pbkdf2密碼算法加速方法的改進(jìn):步驟2)中,fpga內(nèi)的雙bram輸送存儲(chǔ)數(shù)據(jù)部分對(duì)循環(huán)部分每組數(shù)據(jù)中不隨運(yùn)算改變的固定參數(shù)、隨著運(yùn)算過程改變的過程參數(shù)以及輸出參數(shù)進(jìn)行存儲(chǔ)和傳輸;
每組數(shù)據(jù)的每個(gè)固定參數(shù)由一組雙bram一起存儲(chǔ)和傳輸,在每條數(shù)據(jù)輸入流水線前兩個(gè)時(shí)鐘周期開始讀取數(shù)據(jù),并且奇數(shù)條數(shù)據(jù)和偶數(shù)條數(shù)據(jù)分別讀取不同的bram以防止由讀數(shù)據(jù)需要兩個(gè)時(shí)鐘周期帶來的結(jié)構(gòu)沖突;
每組數(shù)據(jù)的每個(gè)過程參數(shù)由兩組雙bram存儲(chǔ)和傳輸,在每條數(shù)據(jù)輸入流水線前兩個(gè)時(shí)鐘周期開始讀取數(shù)據(jù),并且奇數(shù)條數(shù)據(jù)和偶數(shù)條數(shù)據(jù)分別讀取一組雙bram中不同的bram,在運(yùn)算結(jié)束后將結(jié)果立即存入另一組雙bram中,并且奇數(shù)條結(jié)果和偶數(shù)條結(jié)果分別存入這組雙bram的不同bram中;
每組數(shù)據(jù)的輸出參數(shù)由一組雙bram存儲(chǔ)和傳輸,奇數(shù)條數(shù)據(jù)和偶數(shù)條數(shù)據(jù)分別讀取和存儲(chǔ)于不同的bram以防止由讀寫數(shù)據(jù)帶來的結(jié)構(gòu)沖突。
作為本發(fā)明的pbkdf2密碼算法加速方法的進(jìn)一步改進(jìn):所述步驟2)中,fpga內(nèi)的分組循環(huán)流水部分根據(jù)循環(huán)部分中數(shù)據(jù)依賴的特征,從雙bram輸送存儲(chǔ)數(shù)據(jù)部分輸送過來的分組數(shù)據(jù)在輸入循環(huán)流水線運(yùn)算后所得的數(shù)據(jù),在存儲(chǔ)回雙bram輸送存儲(chǔ)數(shù)據(jù)部分之后還需再次輸入循環(huán)流水線進(jìn)行運(yùn)算,直至該組數(shù)據(jù)在整個(gè)算法中的循環(huán)部分計(jì)算完畢。
作為本發(fā)明的pbkdf2密碼算法加速方法的進(jìn)一步改進(jìn):核心計(jì)算函數(shù)的流水采用深度流水線;
在fpga還有空閑資源且不能放置一個(gè)ip核的情況下,延長流水線,利用閑置資源,能提升流水線的工作頻率,在資源約束下提高系統(tǒng)吞吐率。
作為本發(fā)明的pbkdf2密碼算法加速方法的進(jìn)一步改進(jìn):所述步驟2)中,fpga內(nèi)的分組交錯(cuò)處理部分將從cpu中傳來的兩組不同的數(shù)據(jù)分別存儲(chǔ)于雙bram輸送存儲(chǔ)數(shù)據(jù)部分,并從雙bram輸送存儲(chǔ)數(shù)據(jù)部分取出相應(yīng)數(shù)據(jù)兩組交錯(cuò)送入分組循環(huán)流水部分進(jìn)行計(jì)算,另外輸出參數(shù)的計(jì)算也跟隨著流水線的計(jì)算進(jìn)行分組交錯(cuò)處理;
在一組數(shù)據(jù)已經(jīng)全部送入流水線中并且運(yùn)算結(jié)果在進(jìn)行存儲(chǔ)無法讀取的同時(shí),另一組數(shù)據(jù)開始被送入流水線中進(jìn)行運(yùn)算,填補(bǔ)因結(jié)構(gòu)沖突帶來的流水線停頓。
本發(fā)明的目的之一是提供一種基于通用cpu+fpga設(shè)備的pbkdf2密碼算法加速裝置框架。如圖1所示,pbkdf2算法的框架可以分為初始化s1(initial)、循環(huán)s2(loop)以及校驗(yàn)s3(check)三大部分。其中初始化部分的計(jì)算功能廣泛且復(fù)雜,包括哈希值解析,鹽值添加,預(yù)計(jì)算等操作,因此適合采用通用處理器實(shí)現(xiàn)。循環(huán)部分的計(jì)算功能單一但是循環(huán)次數(shù)非常大,占加密運(yùn)算過程中絕大部分的計(jì)算量,因此適合采用在fpga上實(shí)現(xiàn)ip核的方式進(jìn)行加速。校驗(yàn)部分的運(yùn)算不需要大量循環(huán),但需要完成運(yùn)算結(jié)果匯總以及校驗(yàn)值計(jì)算判定的功能,更適合采用通用cpu完成。cpu與fpga之間通過通用總線接口進(jìn)行數(shù)據(jù)傳輸。
本發(fā)明另一個(gè)目的是提供pbkdf2算法在異構(gòu)系統(tǒng)上的加速實(shí)現(xiàn)方法。主要采用的加速方法是分離出pbkdf2算法中計(jì)算密集的循環(huán)部分,循環(huán)部分在fpga優(yōu)化實(shí)現(xiàn)。fpga的優(yōu)化實(shí)現(xiàn)手段包括:分組循環(huán)流水、雙bram(blockrandomaccessmemory,塊易揮發(fā)性隨機(jī)存取存儲(chǔ)器)輸送存儲(chǔ)數(shù)據(jù)、分組交錯(cuò)處理、深度流水、多知識(shí)產(chǎn)權(quán)(ip)核并行計(jì)算。在依靠窮舉法、字典法進(jìn)行密鑰恢復(fù)時(shí),依靠多次猜測密碼或按照已有的字典去嘗試密鑰,并對(duì)比密鑰在經(jīng)過加密算法計(jì)算后的輸出值是否與可得到的正確密鑰的輸出值相同,以此來找到正確的密鑰。
本發(fā)明具有如下技術(shù)優(yōu)勢:
1.本發(fā)明使用擴(kuò)展的c/c++類語言實(shí)現(xiàn)pbkdf2算法,增強(qiáng)算法的抽象能力、可重用性和可讀性,運(yùn)用高層綜合的自動(dòng)化設(shè)計(jì)流程,采用fpga1實(shí)現(xiàn)算法的加速,提高系統(tǒng)性能。
2.本發(fā)明對(duì)fpga1采用分組循環(huán)流水的優(yōu)化手段解決了pbkdf2算法循環(huán)結(jié)構(gòu)中的數(shù)據(jù)沖突問題。
3.本發(fā)明對(duì)fpga1采用雙bram輸送存儲(chǔ)數(shù)據(jù)的優(yōu)化手段解決了高層綜合手段實(shí)現(xiàn)分組循環(huán)流水時(shí)出現(xiàn)資源占用不平衡的問題,還解決了在使用bram后使流水線產(chǎn)生停頓,還保證了計(jì)算的正確性。
4.發(fā)明對(duì)fpga1采用分組交錯(cuò)處理的優(yōu)化手段解決了使用雙bram輸送存儲(chǔ)數(shù)據(jù)手段后的結(jié)構(gòu)沖突所引起流水線停頓的問題。
5.發(fā)明對(duì)fpga1采用多知識(shí)產(chǎn)權(quán)(ip)核并行計(jì)算的優(yōu)化手段充分利用了fpga1的資源,達(dá)到了更高的計(jì)算速度。
6.發(fā)明對(duì)fpga1采用深度流水的優(yōu)化手段充分利用了fpga1的閑置資源,獲得了更高的流水線工作頻率,提高了系統(tǒng)的吞吐率。
綜上所述,本發(fā)明在異構(gòu)系統(tǒng)上設(shè)計(jì)了適用于pbkdf2密碼算法的軟硬件框架,能高速恢復(fù)采用pbkdf2密碼算法的多種加密應(yīng)用的密鑰。本發(fā)明在于如何在cpu+fpga異構(gòu)系統(tǒng)上高效地利用fpga硬件資源設(shè)計(jì)出高速且通用的pbkdf2密碼算法加速框架。
本發(fā)明在系統(tǒng)級(jí)的層面開發(fā)pbkdf2密碼算法加速裝置,在cpu+fpga的異構(gòu)系統(tǒng)上實(shí)現(xiàn)pbkdf2密碼算法的加速運(yùn)算。本發(fā)明挖掘算法中并行性,去除算法中的數(shù)據(jù)相關(guān)依賴,提升加密算法可實(shí)現(xiàn)的并行性。將加密算法分析與硬件電路設(shè)計(jì)優(yōu)化相結(jié)合,高效地利用fpga的資源,從而實(shí)現(xiàn)pbkdf2密碼算法的加速。
附圖說明
下面結(jié)合附圖對(duì)本發(fā)明的具體實(shí)施方式作進(jìn)一步詳細(xì)說明。
圖1為本發(fā)明的實(shí)施例pbkdf2-hmac-sha256算法的結(jié)構(gòu)圖;
圖2為本發(fā)明的pbkdf2算法的加速裝置框架示意圖;
圖3為本發(fā)明的實(shí)施例的fpga1的單個(gè)循環(huán)部分ip核的電路結(jié)構(gòu)圖;
圖4為本發(fā)明的深度流水技術(shù)的原理圖;
圖5為本發(fā)明的分組循環(huán)流水部分111的原理圖;
圖6為本發(fā)明的實(shí)施例pbkdf2-hmac-sha256算法數(shù)據(jù)相關(guān)性示意圖;
圖7為本發(fā)明的實(shí)施例pbkdf2-hmac-sha256算法偽代碼。
具體實(shí)施方式
下面結(jié)合具體實(shí)施例對(duì)本發(fā)明進(jìn)行進(jìn)一步描述,但本發(fā)明的保護(hù)范圍并不僅限于此。
實(shí)施例1、pbkdf2密碼算法加速裝置,包括fpga1和通用cpu2組成的cpu+fpga異構(gòu)系統(tǒng)。cpu2和fpga1通過總線接口相互連接;fpga1不僅有軟件的可編程性和靈活性,同時(shí)又有專用集成電路的高吞吐率和低延時(shí)的特性;fpga1內(nèi)部的資源是可以重配置的,便于設(shè)計(jì)數(shù)據(jù)并行和流水并行,易于平衡數(shù)據(jù)并行和流水并行。本發(fā)明利用fpga1的特點(diǎn)對(duì)pbkdf2算法進(jìn)行加速實(shí)現(xiàn),使得在使用字典法時(shí),在通用cpu+fpga設(shè)備上能高速地完成以pbkdf2密碼算法為其加密算法主體的各類應(yīng)用的密鑰恢復(fù),即采用異構(gòu)計(jì)算方式來提升密鑰恢復(fù)算法的性能。
如圖2所示,本發(fā)明主要采用的加速方法是分離出pbkdf2算法中計(jì)算密集的循環(huán)部分,循環(huán)部分在fpga1優(yōu)化實(shí)現(xiàn)。fpga1的優(yōu)化實(shí)現(xiàn)手段包括:分組循環(huán)流水、雙bram輸送存儲(chǔ)數(shù)據(jù)、分組交錯(cuò)處理、深度流水、多知識(shí)產(chǎn)權(quán)(ip)核并行計(jì)算。
分離出pbkdf2算法中計(jì)算密集的循環(huán)部分在fpga1上加速實(shí)現(xiàn)的加速方法,即將pbkdf2算法中計(jì)算密集的循環(huán)部分放在fpga1上進(jìn)行加速計(jì)算,而以pbkdf2密碼算法為其主體的各類應(yīng)用的加密算法除此之外的部分放在通用cpu2上運(yùn)算,即除pbkdf2算法中計(jì)算密集的循環(huán)部分之外的部分,包括除pbkdf2算法之外的部分以及pbkdf2算法中可以提取出來做預(yù)計(jì)算的部分。因此cpu2用于對(duì)pbkdf2算法的代碼框架初始化部分進(jìn)行計(jì)算,并將計(jì)算結(jié)果處理后通過總線接口傳輸至fpga1,以及用于讀取并校驗(yàn)所述fpga1加速計(jì)算后得到的結(jié)果數(shù)據(jù);在本發(fā)明中fpga1內(nèi)循環(huán)部分的ip核用于讀取cpu2對(duì)pbkdf2算法的代碼框架初始化部分的計(jì)算結(jié)果,根據(jù)單個(gè)ip核的資源占用情況,可在fpga1上放置多個(gè)ip核加速計(jì)算pbkdf2算法中的循環(huán)部分,最終將得到的結(jié)果數(shù)據(jù)通過總線接口傳輸至cpu2。
如圖3所示,fpga1單個(gè)循環(huán)部分的ip核包括分組循環(huán)流水部分111、雙bram輸送存儲(chǔ)數(shù)據(jù)部分112和分組交錯(cuò)處理部分113,其中分組交錯(cuò)處理部分113分別與分組循環(huán)流水部分111和雙bram輸送存儲(chǔ)數(shù)據(jù)部分112連接:
分組循環(huán)流水部分111用于將pbkdf2中運(yùn)算次數(shù)最多的核心函數(shù)進(jìn)行流水,并在數(shù)據(jù)進(jìn)行分組后,將分組數(shù)據(jù)輸入循環(huán)流水線進(jìn)行計(jì)算;分組循環(huán)流水部分111采用深度流水線,利用fpga1的閑置資源,延長核心計(jì)算函數(shù)流水線的級(jí)數(shù),提升流水線的運(yùn)行頻率;
雙bram輸送存儲(chǔ)數(shù)據(jù)部分112用于存儲(chǔ)和傳輸循環(huán)部分每組數(shù)據(jù)中不隨運(yùn)算改變的固定參數(shù)、隨著運(yùn)算過程改變的過程參數(shù)以及輸出參數(shù);
分組交錯(cuò)處理部分113用于將從cpu2預(yù)計(jì)算處理后傳來的兩組不同的數(shù)據(jù)分別存儲(chǔ)于雙bram輸送存儲(chǔ)數(shù)據(jù)部分112,并從雙bram輸送存儲(chǔ)數(shù)據(jù)部分112交錯(cuò)地取出相應(yīng)數(shù)據(jù)送入分組循環(huán)流水部分111進(jìn)行計(jì)算,另外輸出參數(shù)的計(jì)算也隨著流水線的計(jì)算進(jìn)行分組交錯(cuò)處理;
通過以上所述的pbkdf2密碼算法加速裝置可以實(shí)現(xiàn)本發(fā)明實(shí)施例的pbkdf2-hmac-sha256密碼算法加速裝置,具體包括以下步驟:
1、初始化計(jì)算:將預(yù)計(jì)算部分和在執(zhí)行pbkdf2算法循環(huán)部分之前的部分,即pbkdf2算法的代碼框架初始化部分在cpu2中進(jìn)行計(jì)算,并將計(jì)算結(jié)果通過總線接口傳輸至fpga1;
2、單個(gè)循環(huán)部分ip核計(jì)算:將pbkdf2算法中計(jì)算密集的循環(huán)部分放置在fpga1上,即在fpga1上計(jì)算pbkdf2算法代碼框架的循環(huán)部分s1,并利用優(yōu)化手段提升fpga1上的加速效果以及資源利用效率,并將計(jì)算結(jié)果通過總線接口傳輸至cpu2;其中優(yōu)化手段包括,
1)、分組循環(huán)流水:目的是解決pbkdf2算法循環(huán)結(jié)構(gòu)中的數(shù)據(jù)沖突問題。pbkdf2算法的迭代結(jié)構(gòu)決定了pbkdf2算法的循環(huán)體中在循環(huán)的內(nèi)部或是兩次循環(huán)之間包含有數(shù)據(jù)依賴性。得益于每兩個(gè)密鑰之間在計(jì)算時(shí)沒有數(shù)據(jù)依賴性,所以在分組循環(huán)流水中,首先將pbkdf2算法中采用的偽隨機(jī)函數(shù)(如哈希函數(shù))或是偽隨機(jī)函數(shù)中的核心函數(shù)(如hmac中的哈希函數(shù))進(jìn)行流水,并對(duì)屬于不同待測密鑰的數(shù)據(jù)進(jìn)行分組,然后在一個(gè)時(shí)鐘周期內(nèi)將每組的屬于一個(gè)密鑰的數(shù)據(jù)輸入流水線,由于pbkdf2算法中循環(huán)體的特點(diǎn),上一輪的輸出作為下一輪的輸入,所以在一組的數(shù)據(jù)都輸入流水線后,輸出的計(jì)算結(jié)果將再次輸入流水線進(jìn)行計(jì)算。如此循環(huán)往復(fù),直到這一組數(shù)據(jù)在pbkdf2算法中的循環(huán)體計(jì)算結(jié)束,即為分組循環(huán)流水。因此通過分組循環(huán)流水,可以很好地消除由于循環(huán)內(nèi)(如hmac中的兩次哈希函數(shù))或是循環(huán)間的數(shù)據(jù)相關(guān)性引起的流水線停頓。
2)、雙bram輸送存儲(chǔ)數(shù)據(jù):目的是解決高層綜合手段實(shí)現(xiàn)分組循環(huán)流水時(shí)出現(xiàn)資源占用不平衡的問題。在利用高層綜合實(shí)現(xiàn)分組循環(huán)流水時(shí),可能會(huì)出現(xiàn)大量使用fpga1上的查找表(lut)資源構(gòu)成多路選擇器(mux)結(jié)構(gòu)來為流水線選擇輸入的數(shù)據(jù)的情況,而作為存儲(chǔ)單元的bram卻并沒有被用到。因而通過改寫代碼,使高層綜合實(shí)現(xiàn)分組循環(huán)流水時(shí)使用bram存儲(chǔ)輸入的固定變量數(shù)據(jù)、過程變量數(shù)據(jù)以及輸出變量數(shù)據(jù),并承擔(dān)輸送數(shù)據(jù)給流水線和存儲(chǔ)流水線輸出數(shù)據(jù)的功能,以此來平衡fpga1上的資源占用,即減少lut的使用量,轉(zhuǎn)而使用資源充足的bram。
雙bram輸送存儲(chǔ)數(shù)據(jù)還解決了在使用bram后帶來的流水線停頓。由于在fpga1內(nèi)部,對(duì)bram中的數(shù)據(jù)進(jìn)行讀操作需要兩個(gè)時(shí)鐘周期(寫操作只需要一個(gè)時(shí)鐘周期),無法滿足一個(gè)時(shí)鐘周期為流水線提供一組輸入?yún)?shù)的要求。因此不論是固定參數(shù)還是過程參數(shù)都將其拷貝一份后分別放入一組雙bram中,并在兩個(gè)時(shí)鐘周期內(nèi)從兩塊bram中讀取出兩個(gè)密鑰對(duì)應(yīng)的數(shù)據(jù)輸入sha256流水線,以此來消除使用bram帶來的流水線的停頓。
對(duì)于每一組數(shù)據(jù)中的輸出參數(shù)以及在循環(huán)體內(nèi)不變的固定參數(shù)分別用一組雙bram進(jìn)行存儲(chǔ)。對(duì)于每一組數(shù)據(jù)中需要在循環(huán)體內(nèi)被不斷更新的過程參數(shù),在被輸送進(jìn)入流水線計(jì)算后得到更新的數(shù)據(jù)將被存儲(chǔ)到另一組雙bram中。即對(duì)于一組過程變量,將對(duì)應(yīng)兩組雙bram用于存儲(chǔ)。由于在用高層語言綜合實(shí)現(xiàn)電路時(shí),一組數(shù)據(jù)在流水線中計(jì)算所得值無法實(shí)現(xiàn)直接再次送入流水線進(jìn)行計(jì)算,所以需要將每次流水線輸出的過程參數(shù)用bram存儲(chǔ)起來。另外,在每組的數(shù)組數(shù)超過流水線級(jí)數(shù)時(shí),若只使用一組過程變量對(duì)應(yīng)一組雙bram,由于bram不能同時(shí)讀寫,而流水線是一拍出一個(gè)數(shù)據(jù),此時(shí)從流水線中得到的數(shù)據(jù)就會(huì)因?yàn)樽x寫沖突無法寫入bram而丟失。所以考慮到bram存儲(chǔ)器的地址線資源限制,流水線中輸出的過程變量將先寫入另一組雙bram,讓從流水線中計(jì)算得到的數(shù)據(jù)得到及時(shí)的存儲(chǔ)。在一組雙bram中讀取這一組的數(shù)據(jù)輸入流水線時(shí)用另外一組雙bram存儲(chǔ)這一組數(shù)據(jù)這一輪流水的結(jié)果,下一輪流水時(shí)則交換這兩組雙bram的讀寫操作的狀態(tài),這樣保證了計(jì)算的正確性。
3)、分組交錯(cuò)處理:目的是解決使用雙bram輸送存儲(chǔ)數(shù)據(jù)手段后的結(jié)構(gòu)沖突引起的流水線停頓。雖然bram的寫操作只需要一個(gè)時(shí)鐘周期就能完成,但是由于bram不能同時(shí)讀寫,所以這一組數(shù)據(jù)下一輪流水線啟動(dòng)時(shí)要從該組雙bram中讀取的數(shù)據(jù)需要在這一組數(shù)據(jù)上一輪流水線結(jié)束,最后一個(gè)計(jì)算完畢的數(shù)據(jù)被寫入該組雙bram中后才能讀取到。所以造成流水線停頓。分組交錯(cuò)處理是指在對(duì)這一組數(shù)據(jù)流水線計(jì)算的結(jié)果寫入bram,流水線產(chǎn)生停頓時(shí),從另外一對(duì)雙bram中取出另一組使用同樣存儲(chǔ)方式的被測密鑰對(duì)應(yīng)的數(shù)據(jù),將其送入流水線進(jìn)行計(jì)算。這一組的數(shù)據(jù)全部送入流水線后,讀取上一組存儲(chǔ)完畢的數(shù)據(jù)送入流水線。如此循環(huán)往復(fù)直到循環(huán)體結(jié)束,以此來消除使用雙bram輸送存儲(chǔ)數(shù)據(jù)手段后引起的流水線停頓。
3、fpga資源優(yōu)化:為了充分利用fpga1的資源,其中運(yùn)用的優(yōu)化手段包括:
1)、多知識(shí)產(chǎn)權(quán)(ip)核并行計(jì)算:目的是充分利用fpga1的資源,達(dá)到更高的計(jì)算量。得益于數(shù)據(jù)存儲(chǔ)調(diào)度的設(shè)計(jì)采用了bram結(jié)構(gòu),lut和觸發(fā)器(ff)資源使用量下降,并且儲(chǔ)存空間富余,即使流水級(jí)數(shù)的延長也并不會(huì)過多地增加硬件的開銷,所以在一片fpga1內(nèi)可以根據(jù)fpga1剩余的資源數(shù)以及單個(gè)ip核11需要的資源數(shù)放置多個(gè)包括完整循環(huán)體功能的ip核11,令多個(gè)包括循環(huán)體的ip核11并行計(jì)算,以獲得更高的系統(tǒng)計(jì)算量。
2)、深度流水:目的是最大化地利用fpga資源,提升系統(tǒng)的吞吐率。綜合考慮fpga1能夠達(dá)到的時(shí)鐘頻率,完成相應(yīng)的邏輯操作所需要的最大時(shí)延,以及fpga1在放入多ip核并行計(jì)算后的閑置資源,采用如圖4所示的深度流水技術(shù)延長核心計(jì)算函數(shù)流水線的級(jí)數(shù),能充分利用fpga1的資源,獲得更高的時(shí)鐘頻率,在現(xiàn)有資源條件下提高系統(tǒng)吞吐率。
4、校驗(yàn):cpu2讀取fpga1加速計(jì)算后得到的結(jié)果數(shù)據(jù),將執(zhí)行運(yùn)算結(jié)果匯總并進(jìn)行校驗(yàn)值的計(jì)算判定,即pbkdf2算法的代碼框架校驗(yàn)部分在cpu2中進(jìn)行計(jì)算;
本實(shí)施例步驟2在fpga1上的實(shí)現(xiàn)結(jié)構(gòu)如圖3所示,主要由分組循環(huán)流水部分111、雙bram輸送存儲(chǔ)數(shù)據(jù)部分112和分組交錯(cuò)處理部分113構(gòu)成,分別體現(xiàn)fpga1硬件優(yōu)化手段中的分組循環(huán)流水、雙bram輸送存儲(chǔ)數(shù)據(jù)和分組交錯(cuò)處理,具體原理如下:
分組循環(huán)流水部分111原理如圖5所示;在本實(shí)施例中,實(shí)現(xiàn)了pbkdf2算法中的核心函數(shù)sha256的s級(jí)流水。在pbkdf2算法中,對(duì)于輸入的一組n個(gè)密鑰的相關(guān)數(shù)據(jù),為避免如圖6(a)所示的pbkdf2算法循環(huán)中前后兩次sha256函數(shù)輸入輸出之間的數(shù)據(jù)相關(guān)性,采用了如圖6(b)所示的算法結(jié)構(gòu)。如圖5所示,在運(yùn)算中,在完成對(duì)s級(jí)sha256函數(shù)流水線的填充后,這一輪sha256函數(shù)的輸出之后還需再次輸入流水線,進(jìn)行下一輪sha256函數(shù)的計(jì)算,這是符合pbkdf2-hmac-sha256算法特性的。如此循環(huán)往復(fù),直到完成pbkdf2-hmac-sha256算法中除預(yù)計(jì)算部分外的c-1次hmac。
雙bram輸送存儲(chǔ)數(shù)據(jù)部分112以及分組交錯(cuò)處理部分113加入后fpga1的電路框架如圖3所示,相應(yīng)的在pbkdf2-hmac-sha256算法偽代碼如圖7所示。步驟1在cpu2上進(jìn)行初始化運(yùn)算,并將所得的結(jié)果通過總線接口傳到fpga1進(jìn)行pbkdf2算法代碼框架中循環(huán)部分的運(yùn)算。共有兩組數(shù)據(jù)輸入至fpga1的一個(gè)循環(huán)部分的ip核中,每組數(shù)據(jù)包含n個(gè)密鑰對(duì)應(yīng)的值,每個(gè)密鑰對(duì)應(yīng)2個(gè)在計(jì)算過程中不會(huì)變的固定參數(shù)t1、t2,和在計(jì)算過程中會(huì)變化的過程參數(shù)hash。其中,
本實(shí)施例步驟2的運(yùn)作過程如下:
如圖3所示,步驟2中對(duì)pbkdf2算法的代碼框架循環(huán)部分的運(yùn)算開始時(shí),fpga1接收步驟1在cpu2中完成初始化運(yùn)算的運(yùn)算結(jié)果,共有兩組數(shù)據(jù)輸入至fpga1的一個(gè)循環(huán)部分的ip核中;分組交錯(cuò)處理部分113用一組數(shù)據(jù)先填充流水線,并且分組交錯(cuò)處理部分113要在數(shù)據(jù)送入流水線前兩個(gè)時(shí)鐘周期開始從bram中讀取數(shù)據(jù),并且為了避免奇偶條數(shù)據(jù)讀取時(shí)帶來的結(jié)構(gòu)沖突,奇偶條數(shù)據(jù)分別從一組雙bram中的不同的bram中讀取,例如奇數(shù)條hash的值從hash_mem0中讀取、偶數(shù)條hash的值從hash_mem1中讀取。在讀到每條密鑰對(duì)應(yīng)的t1、t2和hash值后,在一個(gè)時(shí)鐘周期內(nèi)將讀到的一條密鑰對(duì)應(yīng)的數(shù)據(jù)全部送入sha256函數(shù)的流水線進(jìn)行計(jì)算。計(jì)算完畢后,流水線中輸出的過程變量hash先寫入另一組雙bram——hash_mem2、hash_mem3中。在將過程變量hash寫入hash_mem2、hash_mem3的同時(shí)由于讀寫沖突無法從hash_mem2、hash_mem3中讀數(shù)據(jù)輸入流水線進(jìn)行下一輪sha256的計(jì)算,因此從hash_mem4、hash_mem5中讀取另一組密鑰對(duì)應(yīng)的數(shù)據(jù)輸入流水線,避免流水線的氣泡。從hash_mem4、hash_mem5中讀到的數(shù)據(jù)的計(jì)算結(jié)果寫入hash_mem6、hash_mem7中。此時(shí),hash_mem2、hash_mem3已經(jīng)寫完畢,從hash_mem2、hash_mem3中再次讀出過程變量輸入流水線進(jìn)行計(jì)算。偶數(shù)次的sha256計(jì)算結(jié)果從流水線輸出后,在存儲(chǔ)到bram的同時(shí),根據(jù)pbkdf2算法的要求,從相應(yīng)的out_mem讀出數(shù)據(jù)進(jìn)行異或計(jì)算,并將結(jié)果存儲(chǔ)到對(duì)應(yīng)的out_mem中,每組數(shù)據(jù)對(duì)應(yīng)一組雙bram進(jìn)行存儲(chǔ)。如此循環(huán)往復(fù)直至完成兩組數(shù)據(jù)的c-1次hmac計(jì)算。最后存儲(chǔ)在兩組雙out_mem中的結(jié)果通過總線接口傳輸?shù)絚pu2中進(jìn)行步驟4的校驗(yàn)計(jì)算。
另外,為了驗(yàn)證本發(fā)明的有益效果,將實(shí)施例應(yīng)用于使用了pbkdf2-hmac-sha256算法的rar5加密算法時(shí),在通用cpu2+fpga1系統(tǒng)zynq-7000上實(shí)現(xiàn),達(dá)到了每秒4511個(gè)hash的計(jì)算速度。其中,所用的fpga1是xc7z-030,并且在一塊fpga1上放置了2個(gè)ip核11并行進(jìn)行四組密鑰的循環(huán)部分的計(jì)算。相比于在intel處理器核i7-4790cpu上的運(yùn)行結(jié)果每秒29個(gè)hash,達(dá)到了155倍的加速比。相比于在同樣的異構(gòu)設(shè)備上,fpga未實(shí)現(xiàn)流水時(shí)的運(yùn)行結(jié)果每秒9個(gè)hash,加速了501倍。相比于僅在異構(gòu)設(shè)備上的arma9處理器上的運(yùn)行結(jié)果每秒3個(gè)hash,加速了1503倍。
雖然以上描述了本發(fā)明的具體實(shí)施方式,但是熟悉本技術(shù)領(lǐng)域的技術(shù)人員應(yīng)當(dāng)理解,我們所描述的具體的實(shí)施例只是說明性的,而不是用于對(duì)本發(fā)明的范圍的限定,熟悉本領(lǐng)域的技術(shù)人員在依照本發(fā)明的思想所作的等效的修飾以及變化,都應(yīng)當(dāng)涵蓋在本發(fā)明的權(quán)利要求所保護(hù)的范圍內(nèi)。