Java中类似DES算法中块的数据类型



我正在用Java编写一个类似DES的分组密码。密码适用于64位块,我很难决定如何对数据进行分区以使其可用。如果你想知道数据来自一个文件,我只想用零填充它,直到最接近的64的倍数。以下是我一直在想的。

存储一个long数组
有了一个长数组,我可以用最少的步骤遍历每个块。但是,像XOR这样的逻辑运算能正常工作吗?此外,当我必须将64位拆分为32位时,我应该转换为int还是继续使用long?还有一个迹象需要担心,但我认为我可以使用Long类来解决这个问题。

存储字节数组的数组
这是我最初的想法,但我现在看到了局限性。我必须为每个数组使用8个元素,而不是只使用一个长数组。我甚至不知道这可能无关紧要。

比特集
我看到了这些,并认为它们是我一直在寻找的答案,但当我开始使用它们时,我意识到它们不适合手头的问题,而且很多方法实际上并没有达到我认为的效果。

我想知道一个更有经验的人会怎么做。我想还有很长的路要走,但我想知道所有的算术是否都能奏效。我是走在正确的轨道上,还是有更好的方法?

使用最适合您需要的数据结构。

如果您从不希望拆分值,请使用long。如果需要将数据一分为二,请使用int

如果你需要对你的数据有更多的控制权,你应该使用byte[]。因为内部表示对您来说不是问题(因为您使用Java),所以没有必要在内部使用byte[]

当涉及到与其他计算机的通信时(例如,通过网络套接字或文件),字节顺序可能很重要。那么最好使用byte[],因为这样可以更好地控制字节顺序。

BitSet适用于其他用例,不适用于加密。

您应该为密码使用最有效的基元类型。因此,如果您主要使用64位指令,请选择long。如果您使用32位的主要指令,那么int可能是最好的类型。我让你猜一下16位和8位运算的类型。

请注意,您不应该将此接口直接呈现给外部世界。相反,您应该使用基于字节数组的接口(就像Cipher一样)。你不想让你的用户为big-endian、有符号/无符号等感到悲伤。除此之外,密码通常是为特定大小的比特或字节消息定义的。

当然不要使用BitSet。这是一个可怕的(无边界的)界面,有很多特性。它绝对不适合这种操作。

最新更新