2013-04-12 34 views
2

首先,這個問題並不是真正的代碼相關,但我想了解代碼背後發生了什麼。希望有人知道這個問題,因爲這一直困擾我一段時間。RSA-OAEP:加密哈希函數如何擴展若干位?

我寫在C#中,它是使用RSA加密服務提供程序。 從我所能理解的情況來看,這個類在其填充中使用標準的SHA1。 我一直在試圖理解在填充過程中實際發生了什麼,但似乎無法讓我的頭在這個過程中的一個步驟。

的算法,我目前看OAEP,簡直就是一個維基。 http://en.wikipedia.org/wiki/OAEP

是困擾我的步驟是3)。我認爲散列函數總是返回一定數量的位(SHA1 - 160位),那麼它怎麼能簡單地將位數擴展到n-k0,而使用標準的1024位密鑰位長度將會是864位?

回答

1

我從來沒有做過與OAEP什麼,但是加密散列函數(如步驟3中)使用http://en.wikipedia.org/wiki/PBKDF闡明的過程。基本上,爲了擴展輸出位的數量,你首先用一個遞增的計數器連接到被哈希的參數來重複哈希,然後連接這些結果直到你有足夠的位。此技術不會爲結果添加熵,但確實可以創建更長的輸出比特流。

維基百科: 如果你想多數民衆贊成爲dkLen長度的密鑰,你的密碼散列函數U只輸出爲hLen位:

DK = T1 || T2 || ... || Tdklen/hlen 
Ti = F(Password, Salt, Iterations, i) 

F(Password, Salt, Iterations, i) = U1^U2^...^Uc 

U1 = PRF(Password, Salt || INT_msb(i)) 
U2 = PRF(Password, U1) 
... 
Uc = PRF(Password, Uc-1) 

(如果你只需要密碼散列函數的一次迭代中,c = 1,所以你不需要XOR運算^,併爲每個我,你只需要計算U1)

+0

感謝anwser,正是我一直在尋找 –

0

專門爲OAEP的建議是使用所謂的MGF1的算法,經營。通過重複散列種子和一個計數器,其結果串聯在一起,我固定在SPE來自RfC 2437

與RFC文本,其中Z是種子和l是輸出的長度:

從0

3.對於計數器到{1 /的hLen} -1,執行以下操作:

a.Convert計數器長度爲4的一個八位組串c與所述 原始I2OSP:C = I2OSP(計數器,4)

b.Concatenate種子Z和C的八位組串T的散列:

T = T || Hash (Z || C) 

4.輸出T的主導升八位位組作爲字節串掩碼。