2

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

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

我目前正在查看的 OAEP 算法只是 wiki 算法。 http://en.wikipedia.org/wiki/OAEP

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

4

2 回答 2

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,那么就不需要异或运算符^,并且对于每个i,只需要计算U1)

于 2013-04-12T12:59:58.000 回答
0

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

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

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

a. 使用原语 I2OSP 将 counter 转换为长度为 4 的八位字节串 C:C = I2OSP (counter, 4)

b. 将种子 Z 和 C 的哈希连接到八位字节字符串 T:

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

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

于 2013-04-13T02:42:05.593 回答