我们被要求编写DES 算法的 Java 实现(用于加密和解密)。我有几个问题:
DES 指定应该有 64 位的纯文本或密文和一个正好 56 位的共享密钥。给出字节数的方法是什么,
该算法使用了大量的位级操作,例如将 64 位分成两个 32 位部分。如何才能做到这一点?
我们被要求编写DES 算法的 Java 实现(用于加密和解密)。我有几个问题:
DES 指定应该有 64 位的纯文本或密文和一个正好 56 位的共享密钥。给出字节数的方法是什么,
该算法使用了大量的位级操作,例如将 64 位分成两个 32 位部分。如何才能做到这一点?
虽然这不是你问题的真正答案,但我不得不说:
在大多数情况下,自己实现加密算法是一个非常糟糕的主意。
让我解释:
密码学很难。很少有人能够很好地理解它来发明自己的算法,甚至他们也会寻求其他人的帮助来验证它是否不会在一秒钟内被破坏。
即使使用已被证明足以满足某人意图的现有算法,这仍然是一个坏主意,因为细微错误的可能性已经足够多,这会破坏其他安全算法的实现。这种情况发生了很多次,以至于我数不清是多少次了。
即使你真的很幸运、很勤奋并且实现了完美的实现,如果不使用已经开发、测试和证明的现有实现,那也是浪费时间和资源。
还有一点关于 DES,虽然我希望你知道:纯 DES 对于当今的标准来说被认为是非常弱的。所以你应该实施更好的3DES。
编辑: 好吧,说了这么多,在意识到这似乎是一项家庭作业(感谢您的提醒)之后,我对 DES 进行了一些研究。这是我到目前为止得到的:
DES 是一种分组密码,在 64 位块上运行。有几种不同的操作模式。它们确实确定了如何将明文划分为 64 位块。某些模式需要填充,这意味着您用数据填充最后一个块,您可以在解密密文后将其删除。上面 Wikipedia 文章中的 Padding 段落包含有关如何在 DES 中使用填充的描述。
理论讲了这么多,如何在 Java 中实现这一点......
byte[] bytesOfString = clearTextString.getBytes();
这为您提供了一个字节数组,用于您必须加密的字符串。剩下的就是简单的计数和添加......
我希望这个修改后的答案对你更有用。
您不能使用现有的 bouncycastle 库: http: //www.bouncycastle.org/docs/docs1.6/index.html吗?
您将在 David Hook 的“使用 Java 开始密码学”中找到许多使用此库的示例。
您现在应该知道 8 位 = 1 个字节。加密中的所有内容都适用于位,除了定义缓冲区之外,您永远不需要字节。
拆分使用按位运算。屏蔽下半部分的高位,移动上半部分的高位。我假设您已经有了参考资料,虽然它们是宝贵的资源,但您绝对必须知道按位运算的工作原理。一个不会破坏项目的好资源是压缩算法,例如 CABAC,因为它们同样是面向位的。然后关闭选项卡并尝试使用规范制作您自己的。