我正在用Java编写类似DES的分组密码。密码适用于64位块,我很难决定如何对数据进行分区以使其可用。如果你想知道数据将来自一个文件,我只是用零填充它,直到最近的64的倍数。这就是我一直在想的。
存储多个长片。
通过一系列longs,我可以以最少的步数遍历每个块。但是,像XOR这样的逻辑运算能否正常运行?另外,当我必须将64位分成32位时,我应该转换为int还是继续使用long?然后有迹象需要担心,但我认为我可以使用Long类来解决这个问题。
存储一个字节数组数组。
这是我最初的想法,但我现在看到了局限。我必须使用每个数组8个元素,而不是只有一个长数组。这可能不重要我不知道。
位集。
我看到了这些,并认为它们是我一直在寻找的答案,但是当我开始使用它们时,我意识到它们不适合手头的问题而且许多方法实际上并没有按我认为的那样做做。
我想知道更有经验的人会如何做到这一点。我认为多头是可行的方法,但我想知道所有的算术是否都有效。我是在正确的轨道还是有更好的方法?
答案 0 :(得分:2)
使用最符合您需求的数据结构。
如果您不想分割您的值,请使用long
。如果您需要将数据拆分为两半,请使用int
。
如果您需要对数据进行更多控制,则应使用byte[]
。因为内部表示对您来说不是问题(因为您使用Java),所以不需要在内部使用byte[]
。
当谈到与其他计算机的通信时(例如通过网络套接字或文件),字节顺序可能很重要。那么最好使用byte[]
,因为你可以更好地控制字节顺序。
BitSet
用于其他用例,不可用于加密。
答案 1 :(得分:1)
您应该为您的密码使用最有效的原语类型。因此,如果您主要使用64位指令,请转到long
。如果使用主要的32位指令,那么int
可能是最好的类型。我会让你猜出16位和8位操作的类型。
请注意,您不应将此界面直接呈现给外界。相反,您应该使用基于字节数组的接口(就像例如Cipher
)。对于大端,有符号/无符号等,您不希望遇到大量悲痛的用户。除此之外,密码通常是针对特定大小的比特或字节的消息定义的。
当然不要使用BitSet
。这是一个可怕的(无界)界面,具有许多特殊性。它绝对不适合这种操作。