![]() |
1
1
纠错码是解决这个问题最直接的方法。然而,它们并不特别容易实施。 最好的方法是使用 Reed Solomon Code . 当您第一次获得密码时,还需要计算代码所需的冗余并存储它。当您想重新计算密钥时,可以使用冗余来更正错误或丢失的输入。 |
![]() |
2
1
加密/创建: 取N个输入。以良好/安全的方式将每一块变成一块。使用Reed Solomon从N个块组合生成M个冗余块。现在有了N+M个块,只需要总共N个块就可以生成原始的N个块。 使用N个块加密或创建安全密钥。 如果是第一个,则存储加密密钥和M个冗余块。如果是第二个,则只存储M个冗余块。
取N-R正确的输入块,其中R=<M。将它们与存储的冗余块组合以创建原始N块。使用原始的N个块来解密或创建安全密钥。 https://stackoverflow.com/users/492020/giacomo-verticale :这基本上就是他/她所说的,但我认为应该更明确一点。) |
![]() |
3
1
Shamir's share secret 是一种技术,当你想将一个秘密分成多个共享时使用,这样只有最小k部分的组合才能揭示最初的秘密。如果您不确定发起程序的正确性,并且您想验证这一点,请使用 verifiable secret sharing 。两者都基于多项式插值 |
![]() |
4
0
一种方法是生成一个纯随机密钥(或者对所有输入进行散列,如果您出于某种原因想避免RNG),使用k/n阈值方案对其进行拆分,并使用单独的密码输入对每个共享进行加密(例如,使用100000次迭代通过PBKDF2发送它们,然后使用AES-CTR/HMAC对/MAC进行加密)。这将需要比存储散列子集更少的存储空间;大约N*(共享大小+盐大小+MAC大小) |
![]() |
5
0
与其简单地从大量输入中允许一些错误,不如将输入分为多个组,并允许每个组中有一些错误。如果你允许64个输入中有4个错误,那么你必须有15249024个加密密钥,但是如果你把它分成两组32个,每组允许两个错误,那么你只需要有1984个加密密钥。 一旦解密了每个组中的密钥信息,然后将其作为最终所需的解密密钥的输入。 此外,从每个组中获取的密钥与最终所需的密钥相比决不能微不足道。不要简单地将256位密钥分解为8个32位密钥片段。这样做将允许能够解密其中7个密钥的人尝试对最后一个密钥进行暴力攻击。如果要访问256位密钥,则必须在整个过程中使用256位密钥。 |