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

Cryptography RSA-OAEP:加密哈希函数如何扩展位数?,cryptography,sha1,cryptographic-hash-function,Cryptography,Sha1,Cryptographic Hash Function,首先,这个问题实际上与代码无关,但我试图理解代码背后发生了什么。希望有人知道这个问题的答案,因为它已经困扰我一段时间了 我正在用c#编写一个程序,它使用RSA加密服务提供商。 据我所知,该类在填充中按标准使用了SHA1。 我一直在试图了解在填充过程中到底发生了什么,但似乎无法了解填充过程中的一个步骤 我目前正在研究的OAEP算法就是wiki算法。 困扰我的步骤是3)。我认为散列函数总是返回一定数量的位(SHA1-160位),那么它怎么能简单地将位的数量扩展到n-k0,标准的1024密钥位强度将

首先,这个问题实际上与代码无关,但我试图理解代码背后发生了什么。希望有人知道这个问题的答案,因为它已经困扰我一段时间了

我正在用c#编写一个程序,它使用RSA加密服务提供商。 据我所知,该类在填充中按标准使用了SHA1。 我一直在试图了解在填充过程中到底发生了什么,但似乎无法了解填充过程中的一个步骤

我目前正在研究的OAEP算法就是wiki算法。


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

我从来没有对OAEP做过任何事情,但是加密散列函数(如步骤3所述)使用中详细说明的过程。基本上,要扩展输出位的数量,首先要用一个递增的计数器连接到被哈希的参数来重复哈希,然后连接这些结果,直到有足够的位为止。这种技术不会给结果增加熵,但允许您创建更长的输出比特流

来自维基百科: 如果您想要一个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)

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

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

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

a、 使用 基本I2OSP:C=I2OSP(计数器,4)

b、 将种子Z和C的散列连接到八位字节字符串T:

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


谢谢你的anwser,正是我想要的
T =    T || Hash (Z || C)