RSA-OAEP:加密哈希函数如何扩展多个位?

时间:2013-04-12 11:26:16

标签: cryptography sha1 cryptographic-hash-function

首先,这个问题与代码无关,但我试图了解代码背后会发生什么。希望有人知道这个问题,因为它一直困扰着我。

我正在使用RSA加密服务提供程序在c#中编写程序。 根据我的理解,该类在其填充中使用标准的SHA1。 我一直试图了解在填充过程中实际发生了什么,但似乎无法理解这个过程中的一个步骤。

我目前正在关注的OAEP算法就是wiki。 http://en.wikipedia.org/wiki/OAEP

困扰我的步骤是3)。我认为散列函数总是返回一定数量的位(SHA1 - 160位),那么如何才能简单地将位数扩展为n-k0,其中标准1024位的位强度为864位?

2 个答案:

答案 0 :(得分: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运算符^,并且对于每个i,您只需要计算U1)

答案 1 :(得分:0)

特别是对于OAEP,建议使用一种名为MGF1的算法,该算法可以运行。通过反复散列种子和计数器,并将结果连接在一起,spe I固定来自RfC 2437

从RfC文本中,Z是种子,l是输出的长度:

  

3.对于从0到{l / hLen} -1的计数器,请执行以下操作:

     

a。将计数器转换为长度为4的八位字节串C.   原始I2OSP:C = I2OSP(计数器,4)

     

b。将种子Z和C的哈希与八位字符串T:

连接起来
T =    T || Hash (Z || C)
  

4.输出T的前导l个八位字节作为八位字符串掩码。

相关问题