【问题标题】:Need a very fast one-to-one algorithm, possibly encryption需要一个非常快速的一对一算法,可能是加密
【发布时间】:2010-10-23 14:46:49
【问题描述】:

我需要一个非常、非常快速的一对一算法。该算法不需要是牢不可破的。相当强大就足够了,但它必须是闪电般的速度。我将在硬件中实现它。面积也是一个问题,所以它不应该使用太多逻辑。

它应该是一个函数 f_N(x),其输入是一个 N 位数,其输出是一个 N 位数。 N 是一个常数,可能在 20-70 之间。该函数必须是一对一的。 (即可逆,意味着可以解密。解密速度无关紧要。)

我需要在 3ns 内加密,即每秒大约 333M 输入。例如,DES 每秒大约 50Mbits。我需要每秒 333M 输入

到目前为止,我一直在使用大约 6 轮的 Feistel 密码。这似乎需要大约 3ns。

建议?

更多笔记

有一些问题,所以我会解释一下。我需要将键放入哈希表中。标准方法是散列输入键并将结果用作表的索引。表中的每一行都必须存储原始键。 Information theory 告诉我们,表的行实际上不需要和输入键一样宽,而是和输入键一样宽 less桌子。例如:

  • 输入:x(N 位)
  • 哈希:x%128(8 位)
  • 验证器:floor(x/128)(N-8 位)

在整数通常具有相同宽度但我在硬件中进行的 CPU 上会很愚蠢。

x%128 是一个容易破解的哈希。事实上,如果输入键仅在前几位不同,您将意外破坏散列。我想要一个不会被意外破坏的哈希,甚至可能很难被故意破坏。我还尝试了LFSR。 LFSR 速度很快,但两个长度相等的 LFSR 会生成线性相关的哈希结果。 (如果 f(x) 和 g(x) 对两个不同的多项式给出相同的哈希,则 f(x+1) 和 g(x+1) 很容易相关。)

所以,我需要一个具有 N 位输入和 V 位、H 位输出 (V+H=N) 的函数,其中很难找到两个长度为 N 的输入,以便两者都输出相同的 H。加密符合要求,因为它使输出的长度与输入的长度相同,并且难以逆转。加密以外的其他方法也可能起作用,尽管我想要的似乎几乎就是加密的定义。

很抱歉没有提前解释所有这些。希望这可以澄清事情。

【问题讨论】:

  • 您对 Andrew Hare 帖子的评论表明您需要加密哈希。这很重要,因为 R.A. 的答案 (TEA) 不适合用作哈希 - XBox 安全性严重依赖它。
  • 如果需要哈希而不是加密算法,相应地编辑您的问题,因为存在很大差异。但是你确实提到它需要是可逆的......
  • 你还没有解释你的 6 轮 feistel 密码有什么问题。这听起来是个不错的方法。

标签: encryption hardware cryptography


【解决方案1】:

我想知道如果您不关心加密的强度,那么也许您根本不需要加密。加密算法重要的部分是它的强度。如果加密很弱,那么一开始加密就没有任何好处。

【讨论】:

  • 没错,我并没有真正加密。我需要的是一个从 N 位映射到 N 位的函数。该函数必须是一对一的,并且应该很难猜测两个输入会产生仅相差一位或两位的输出,有点像哈希函数的限制。
  • 您的说法实际上并不正确。如果信息被破坏时所造成的总损失不超过现在和未来破坏它的成本,那么信息就被充分加密了。每秒有这么多的输入,无论如何解密整个流的成本都会很高。
  • 我完全不同意安德鲁的观点。加密始终是工作量(cpu 时间、密钥分配等)和强度之间的权衡。根据工程问题,可能需要一个非常强大的算法,其中 CPU 时间不是一个因素,或者非常快但不是非常强大的算法。
【解决方案2】:

当您说“快”时,您是只关心吞吐量,还是延迟本身最重要?

如果延迟不如吞吐量那么重要,有什么理由不能使用已知安全的标准Feistel cipher,而不是使用完整的轮数(例如 Blowfish 中的 16 ) 组合逻辑的输出,在每轮之间粘贴一个寄存器,以便您流水线化加密算法?它基本上需要与已知的安全加密算法相同数量的硬件(为寄存器添加一些触发器),但传播延迟仅为一轮 Feistel 网络的传播延迟 +人字拖。

【讨论】:

  • 到目前为止,这几乎就是我正在做的事情,但是河豚和朋友们已经固定了块大小。此外,所有寄存器都很昂贵,因为扩展管道会扩展芯片中等待结果的其他管道。不过,您是对的,它会以寄存器为代价使事情变得更快。
  • 这就是我最后所做的。我随机生成了一个 Feistel 密码,其轮数正好符合我的时间要求。
【解决方案3】:

以下是一些算法的基准测试:http://gd.tuwien.ac.at/privacy/crypto/libs/cryptlib/benchmarks.html

请注意,这些基准测试正在测试算法的实现,因此它可能不是您想要的。

【讨论】:

    【解决方案4】:

    我会推荐我的老朋友Tiny Encryption Algorithm

    它既快速又占用空间极小,在硬件中实施时您可能还必须考虑这一点。

    【讨论】:

    • TEA 的 Wikipedia 中的代码表明 TEA 的时间是 32 次: 1 次 32 位加法 4 次加法,2 次常量移位和 2 次异或 4 次加法,2 次常量移位和 2 次异或 在硬件中其中大部分可以并行化,因此所有延迟约为:32 次(32 位加法器 + 32 位异或 + 32 位加法器 + 32 位异或)。大约有 64 个加法器和 64 个串行异或。在 3ns 内,可能有足够的时间在当今的硬件中处理 3 个 32 位加法器,比 TEA 的速度快大约 20 倍。
    • 我同意 Eyal 的观点。茶不适合。如果时间是主要关注点,则必须寻找轮数较少的密码,但可以在一轮中并行执行许多操作。
    • 我应该删除答案是否已经够糟糕了?
    【解决方案5】:

    以下内容不能满足您对一对一功能的要求,但如果速度至关重要,它可能会有所帮助。 (如果它不起作用,那么我建议采用分而治之的方法:您正在使用硬件,因此理论上您应该能够并行加密和解密,除非一个输入的加密依赖于先前输入的加密。 )

    对于我称之为“munging”的最快的硬件算法就是在概念上将您的输入视为比特流,并将它们与加密安全和可重构比特生成器的比特流输出进行异或 - - 如果你想解密它可以重建。 linear feedback shift register (LFSR) 是一个简单且快速但本身并不安全的示例。选择一个较长的周期(2128 - 1 或 2256 - 1 或类似的东西)。维基百科页面建议进行修改以增强安全性。您也可以偶尔尝试(例如,每 M 位一次,其中 M = 4096、16384、65536 等等)将 LFSR 的状态与较慢但更安全的比特流(流密码或加密预先确定的一组输入,例如递增序列或 LFSR 状态的延迟快照)——尽管这属于不发明你自己的密码技术,但众所周知的密码技术已经有很大投入大量精力测试它们是否存在漏洞。

    【讨论】:

      【解决方案6】:

      使用 64 位“键”值并对每个字节进行异或运算有什么问题?您可以根据需要多次循环访问密钥,以对前 64 位之后的任何明文位进行异或运算。

      64 位密钥可以是 8 字符密码或密码短语的 8 字节哈希。

      由于密钥的位数几乎与消息一样多,因此它实际上会非常强大且非常快。

      【讨论】:

      • 这与 Vigenere 密码的形式基本相同,但有弱点。 en.wikipedia.org/wiki/Vigen%C3%A8re_cipher 非常快,是的。非常强大,不。
      • 该方案适用于 64 位消息。 128 位的消息你有麻烦了,因为你可以将前 64 位与密文的后 64 位进行异或,并得到两个明文的异或。
      • @ethan:正确——但由于消息被承诺不超过 70 位,因此该攻击效果不佳。
      • 这是一种糟糕的方法。因为没有混合,两个具有相同前缀的输入将具有相同的输出前缀,违反了他的要求之一。
      • 违反了修订要求之一。新问题与原来的问题非常相似。
      【解决方案7】:

      如果您在硬件中执行此操作,为什么不在 DSP 上使用标准分组密码?

      How Well Are High-End DSPs Suited for the AES Algorithms?

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2017-07-14
        • 2018-09-29
        • 2011-06-14
        • 1970-01-01
        • 1970-01-01
        • 2011-08-28
        • 2012-01-20
        相关资源
        最近更新 更多