首先,这个问题与代码无关,但我试图了解代码背后会发生什么。希望有人知道这个问题,因为它一直困扰着我。
我正在使用RSA加密服务提供程序在c#中编写程序。 根据我的理解,该类在其填充中使用标准的SHA1。 我一直试图了解在填充过程中实际发生了什么,但似乎无法理解这个过程中的一个步骤。
我目前正在关注的OAEP算法就是wiki。 http://en.wikipedia.org/wiki/OAEP
困扰我的步骤是3)。我认为散列函数总是返回一定数量的位(SHA1 - 160位),那么如何才能简单地将位数扩展为n-k0,其中标准1024位的位强度为864位?
答案 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个八位字节作为八位字符串掩码。