Java 48位到48位使用哪种类型的加密?
我有一堆48位(6字节)的值,需要对称加密。这两项要求是:Java 48位到48位使用哪种类型的加密?,java,encryption,cryptography,Java,Encryption,Cryptography,我有一堆48位(6字节)的值,需要对称加密。这两项要求是: 生成的加密值也需要48位(6字节)长。他们的钥匙本身可以(最好是)更长的时间来保护暴力攻击 生成的加密值需要具有确定性,即使用密钥B的值A将始终生成加密值C(我们动态加密并向用户显示加密数据,因此需要始终显示相同的值) 我发现的所有分组密码都使用了最小块大小64,并且看起来是固定的(不能使用任意块大小)。我应该考虑使用流密码吗 我用Java做这个 注意:我已经看到了和相关的答案,但不清楚这些建议是否能满足我的第二个要求。(对不起,我最初
- 流密码的问题是,标准密码通过从密钥生成伪随机比特流,然后将这些比特与明文进行异或运算,从而有效地工作;实际上,这意味着您不应该两次使用同一个比特流(例如,如果您这样做,那么对两个密文进行异或运算的结果与对相应的明文进行异或运算的结果相同;并且在任何情况下,对于48比特,只有2^48个可能的比特流,因此您可以使用蛮力对它们进行测试)李>
- 分组密码的问题是,据我所知,没有一个标准的密码具有48位的块大小
- 放宽48位密文的要求;例如,TripleDES具有64位块大小,并且“相当”安全(相当于112位安全)[*]李>
- 原则上,您可以使用所需的任何块大小实现您自己的分组密码,尽可能接近标准设计,例如遵循一些普遍推荐的设计原则的Feistel网络——作为起点,请参见Schneier,“应用密码学”,第346ff页,“分组密码设计理论”
不,只需在数据中添加一些您不关心的字节(但如果您需要的话,这些字节总是相同的),这样您就可以达到块的大小。(如果您使用的是合适的,那么这将为您完成。)如果您对每种加密都有唯一的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