劉鶯迎
(河南牧業(yè)經(jīng)濟學院,鄭州 450001)
Salsa20算法屬于序列密碼算法[1]。序列密碼,也稱流密碼,是密碼學的重要分支,它利用初始密鑰產(chǎn)生一條密鑰流序列,與明文簡單異或進行加密。Salsa20算法是歐洲著名密碼計劃eSTREAM[2]的入選算法。該計劃旨在征集軟件或者硬件性能優(yōu)于AES的序列密碼算法。Salsa20算法[3]是由美國學者Daniel J.Bernstein提出的序列密碼算法。于2005年5月提交作為eSTREAM候選算法,同時提供了算法的速度,安全性分析以及設計原則介紹[4]。經(jīng)過三輪的算法評估,最終Salsa20/12算法成功入選,它在軟件組中排名第二,另外它支持的密鑰長度為256比特或者是128比特(比較傾向于256比特)。
Salsa20算法的基本處理單位為32比特字,最基本的函數(shù)為quarterround函數(shù),采用的運算為模232的整數(shù)加法,異或和循環(huán)移位運算的復合,軟件處理速度非???。Salsa20算法的核心是輸入輸出都是512比特的hash函數(shù)。這512比特輸入以32比特字為單位排成一個4階方陣,初始矩陣用密鑰,IV,nonce和常數(shù)值進行填充。填充后對該矩陣用quarterround函數(shù)交替進行10次列變換和10次行變換,得到的矩陣與原矩陣模232加輸出密鑰流序列。
通過以上對Salsa20算法結構的介紹以及實現(xiàn)過程,可以發(fā)現(xiàn)其混淆效果很好。這里通過模擬實驗構造所需輸入對分析一下Salsa20算法的混淆效果究竟如何。為說明Salsa20算法的混淆效果極佳,這里構造兩個輸入矩陣,它們只在一個字的一個比特上有差分。并在此基礎上分析這一個比特在不同位置上所發(fā)生的混淆效果有什么不同。通過模擬實驗結果發(fā)現(xiàn),在Salsa20算法的16個字輸入差分當中,僅僅有一個字存在一個非零比特,就可以使得三輪輪函數(shù)作用后此非零比特擴散到16個字的所有比特。
在這里把一次運算后兩個狀態(tài)在同一個位置出現(xiàn)的不同比特記作“活躍比特”。以上只對輸入差分做了4輪Salsa20算法輪函數(shù)作用,混淆效果就已經(jīng)如此巨大,接下來的16輪輪函數(shù)作用后還將有更多的活躍比特。
本節(jié)考慮的是Paul Crowley等簡化至5輪的Salsa20的截斷差分攻擊及其改進[5][6],其主要思路是:先是對n輪差分進行反向分析,得到n-2輪差分特征,然后按一定方法對密鑰進行窮舉,以達到密鑰恢復的效果。
對于任何算法,進行差分攻擊時最重要的一步就是尋找高概率差分鏈,這一步往往需要耗費很大的資源。根據(jù)ARX密碼的模加差分概率計算方法[7],可以對各論文中出現(xiàn)的3輪差分鏈進行理論概率計算,然后進行大數(shù)據(jù)模擬實驗驗證差分鏈的輸入輸出正確性和差分概率正確性。
假設三輪差分鏈表示為以下形式:
本文對Salsa20算法進行了深入探究,主要工作包括對Salsa20算法結構的介紹與分析、對算法特性的分析,對Salsa20算法的Python語言編程實現(xiàn)、對5輪Salsa20算法的差分攻擊,以及對攻擊算法復雜度的分析,最后是對現(xiàn)有差分鏈的驗證和差分鏈概率的計算。
本文主要有以下幾個重點內(nèi)容:第一點是在深入分析Salsa20算法的各組成函數(shù)以及對其擴展函數(shù)和加密函數(shù)的前提下,對其進行了Python語言的編程實現(xiàn)以及對其安全性進行了一定的分析。第二點是對Salsa20算法進行了5輪的截斷差分攻擊,包括對差分鏈選擇標準的判斷、在Paul Crowley提出的關于Salsa20算法差分攻擊的基礎上進行了改進和優(yōu)化,并且提出了具體的分析算法,同時進行了算法的復雜度分析。第三點是對現(xiàn)有差分鏈進行了有效的驗證,并且對這些差分鏈進行了理論概率的計算,最后通過模擬實驗判斷了它們是否符合高概率的條件。