Java 48位到48位使用哪种类型的加密?

Java 48位到48位使用哪种类型的加密?,java,encryption,cryptography,Java,Encryption,Cryptography,我有一堆48位(6字节)的值,需要对称加密。这两项要求是: 生成的加密值也需要48位(6字节)长。他们的钥匙本身可以(最好是)更长的时间来保护暴力攻击 生成的加密值需要具有确定性,即使用密钥B的值A将始终生成加密值C(我们动态加密并向用户显示加密数据,因此需要始终显示相同的值) 我发现的所有分组密码都使用了最小块大小64,并且看起来是固定的(不能使用任意块大小)。我应该考虑使用流密码吗 我用Java做这个 注意:我已经看到了和相关的答案,但不清楚这些建议是否能满足我的第二个要求。(对不起,我最初

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

  • 生成的加密值也需要48位(6字节)长。他们的钥匙本身可以(最好是)更长的时间来保护暴力攻击

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

  • 我发现的所有分组密码都使用了最小块大小64,并且看起来是固定的(不能使用任意块大小)。我应该考虑使用流密码吗

    我用Java做这个

    注意:我已经看到了和相关的答案,但不清楚这些建议是否能满足我的第二个要求。

    (对不起,我最初误读了要求,认为输入数据需要6字节。)

    我认为,使用标准加密算法,您无法完全做到您想要的:

    • 流密码的问题是,标准密码通过从密钥生成伪随机比特流,然后将这些比特与明文进行异或运算,从而有效地工作;实际上,这意味着您不应该两次使用同一个比特流(例如,如果您这样做,那么对两个密文进行异或运算的结果与对相应的明文进行异或运算的结果相同;并且在任何情况下,对于48比特,只有2^48个可能的比特流,因此您可以使用蛮力对它们进行测试)
    • 分组密码的问题是,据我所知,没有一个标准的密码具有48位的块大小
    现在,这并不意味着48位的分组密码不能被开发出来——事实上,我敢说有一些是存在的——仅仅是经历了密码学界多年审查的bog标准密码没有一个具有这样的块大小

    因此,我建议的选择是:

    • 放宽48位密文的要求;例如,TripleDES具有64位块大小,并且“相当”安全(相当于112位安全)[*]
    • 原则上,您可以使用所需的任何块大小实现您自己的分组密码,尽可能接近标准设计,例如遵循一些普遍推荐的设计原则的Feistel网络——作为起点,请参见Schneier,“应用密码学”,第346ff页,“分组密码设计理论”
    后一种选择的明显问题是,whist标准分组密码通常基于通用原则,它们采用经过大量审查的特定设计决策;你的大概不会

    我还建议您从这个问题上退一步(或者再解释一下您试图做什么),因为它似乎是基于通常不符合良好安全实践的需求(例如,通常人们会特别避免使用相同的明文对相同的密文进行加密)。因此,您可以使用世界上设计最好的Feistel密码,但在使用过程中会引入一些其他漏洞

    通常不推荐使用[*]TripleDES,因为AES可以更有效地提供更好的安全性(您可能希望看到我在Java中使用的一些技术,看看它有多糟糕)。但是,在您的特定应用程序中,这可能并不重要


    不,只需在数据中添加一些您不关心的字节(但如果您需要的话,这些字节总是相同的),这样您就可以达到块的大小。(如果您使用的是合适的,那么这将为您完成。)

    如果您对每种加密都有唯一的salt,则只能使用流密码(甚至不要考虑重复使用同一种盐,因为这样做很容易打破)

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

    当您还没有这样唯一的数字时,您可能无法使用流密码,因为您的结果只有48位(因此没有空间用于salt)


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

    考虑。

    如果您有一个与每个明文值关联的唯一计数器/序列号,那么您可以在CTR(计数器)模式下使用任何分组密码

    要加密密钥K下的序列号N值V:

    • 将N扩展到块的大小
    • 用分组密码和密钥K加密N
    • 取结果的前48位,用V进行异或运算
    解密也是一样。使用此方法要记住的最重要的事情是:

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


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

    我相信这就是您要查找的内容

    此算法允许您从安全PRF(例如sha256、blake2)构造PRP(即任意长度的分组密码)

    CTR模式下的分组密码与流密码具有相同的问题。
    如果没有合适的MAC(需要添加更多字节),它将容易发生位翻转。

    如果没有unique IV(这也需要添加更多字节),它将只是一个中断的实现。

    2009年设计了一个48位的块80位密钥密码-KATAN48(KTANAN48的家族版本有一些密钥调度问题。到目前为止,它还没有中断,并且有相当高的安全余量,因此它已经通过了时间的考验。

    f2800af40110
    
    32-bit value: f2800af4
    16-bit value: 0110
    
    Encrypted 32-bit value: b0daf2b9
    
    Value 1: b0da
    Value 2: f2b9
    
    b0da0110
    
    Encrypted 32-bit value: 6135d8f4
    
    6135d8f4f2b9
    
    INPUT  : 111100101000000000001010111101000000000100010000
    BITMASK: 001010111001110000100000010001100000011001100000
               | | |||  |||    |      |   ||      ||  ||     
    VALUE 1:   1 0 101  000    0      1   10      00  00      => a860
    VALUE 2: 11 1 0   00   0000 010101 110  000000  10  10000 => e015c050