代码之家  ›  专栏  ›  技术社区  ›  Marplesoft

48位到48位使用什么类型的加密?

  •  3
  • Marplesoft  · 技术社区  · 16 年前

    我有一堆48位(6字节)的值需要对称加密。这两个要求是:

    1. 产生的加密值也需要48位(6字节)长。它们本身可以(而且最好)更长时间来保护暴力攻击。

    2. 产生的加密值需要具有确定性,即使用密钥B的值A将始终生成加密值C(我们动态加密并向用户显示加密数据,因此需要始终显示相同的值)。

    我发现的所有块密码使用的最小块大小为64,并且似乎是固定的(不能使用任意块大小)。我应该考虑流密码吗?

    我用Java做这个。

    注:我见过 this question 以及相关的答案,但不清楚这些建议是否能满足我的第二个要求。

    6 回复  |  直到 10 年前
        1
  •  4
  •   Neil Coffey    16 年前

    (很抱歉,我最初误解了需求,认为输入数据需要6个字节。)

    我不认为你能用标准密码算法做你想要的事情:

    • 流密码的问题在于,标准密码通过从密钥生成一个伪随机位流,然后用明文对这些位进行异或运算,从而有效地工作;这意味着您不应该使用相同的位流两次(例如,如果使用了,则异或两个密文对对应的位进行异或运算,得到的结果与异或运算的结果相同在纯文本中;而且在任何情况下,48位的比特流都只有2^48个可能的比特流,所以您可以直接用蛮力测试它们);
    • 块密码的问题是,据我所知,没有一个标准的块大小为48位。

    现在,这并不意味着一个48位的分组密码不能被开发出来——事实上,我敢说有一些——只是,经过密码界多年的审查,没有一个BOG标准密码有这样的分组大小。

    所以我建议选择:

    • 放宽48位密文的要求;例如,tripledes具有64位块大小,并且“相当”安全(相当于112位安全性)[*];
    • 原则上,您可以使用所需的块大小来实现自己的块密码,尽可能接近标准设计,例如遵循一些一般推荐的设计原则的Feistel网络——作为起点,请参阅Schneier,“应用密码术”,第346ff页,“块密码设计理论”。

    后一种选择的明显问题是,尽管标准分组密码通常基于通用的一般原则,但它们采用经过相当仔细审查的特定设计决策;您的可能不会。

    我还建议您远离这个问题(或者解释更多您正在尝试做的事情),因为它似乎是基于通常会违反良好安全实践的要求(例如,让相同的明文始终加密到相同的密文是我们通常会特别避免的事情)。。这样,您就可以拥有世界上设计最好的feistel密码,但在如何使用它的过程中还引入了其他一些漏洞。

    一般不推荐使用[*]三重模式,因为AES更有效地提供了更好的安全性(您可能希望看到一些 comparative timings of block ciphers 我在Java中看到了它有多么糟糕。但是,这在您的特定应用程序中可能并不重要。

    不,只是用一些你不关心的字节“填充”你的数据(但如果这是你的要求,它总是一样的),这样你就可以达到一个块的大小。(如果你用的是合适的 padding mode ,这将为您完成。)

        2
  •  5
  •   Accipitridae    16 年前
        3
  •  2
  •   Curious Sam    11 年前

    我相信这就是你要找的
    http://web.cs.ucdavis.edu/~rogaway/papers/shuffle.html
    此算法允许您从安全的prf(例如sha256、blake2)构造prp(即任意长度的块密码)。

    在ctr模式下的块密码与流密码具有相同的问题。
    如果没有合适的MAC(需要添加更多字节),它将容易发生位翻转。
    如果没有唯一的IV(这也需要添加更多的字节),它将只是一个中断的实现。

        4
  •  1
  •   Chris Lercher    16 年前

    如果每个加密都有一个唯一的salt,则只能使用流密码(甚至不要考虑使用相同的salt,因为这样做很容易被破坏)。

    当您有这样的唯一值(例如已经与您的值关联的序列号)时,您可以使用例如流密码 RC4-drop .

    当你已经没有这样的唯一数字时,你可能不能使用流密码,因为你的结果只有48位(所以没有足够的空间放盐)。

    对于48位的分组密码-对不起,我也不知道这样的密码。也许您可以做的是将四个48位值组合成一个192位值,生成三个64位块,对它们进行编码,然后再次将它们拆分为四个48位值。(我不知道,在你的情况下,这是否可能?)

        5
  •  1
  •   caf    16 年前

    如果您有一个与每个纯文本值相关联的唯一计数器/序列号,那么您只能在ctr(counter)模式下使用任何块密码。

    要加密k项下的序列号n的值v:

    • 将n扩展到块的大小;
    • 用分组密码和密钥k加密n;
    • 取结果的前48位,用v对其进行异或运算。

    解密是一样的。用这种方法要记住的最重要的事情是:

    永远不要使用相同的密钥和序列号来加密两个不同的值。

    序列号必须唯一。如果序列重新启动,则 必须 使用新的密钥。

        6
  •  0
  •   kilmo    10 年前

    2009年设计了一个48位块80位密钥密码-katan48(家庭版的ktantan48有一些密钥调度问题)。到目前为止,它还没有被破坏,而且有相当高的安全边际,所以它已经通过了时间的考验。