在 Java 中实现加密,同时保持位串长度



我正在尝试找出一种在我用Java编写的Android程序中实现Blowfish(或任何有效的加密方案(的方法。

我有一个句子,比如"我是一条狗",我想加密。

但是,在加密之前,我使用自己的 5 位字符表示形式对句子进行编码。

这是我自己做的,就像一个 = "00110" 和 'the' = "11001">

所以现在我有一个可以被 5 整除的编码,看起来像

"00011101001101011010">

有没有办法实现 Blowfish 来加密这个二进制字符串,同时保持位字符串的长度。

即上面的位字符串长度为 20 位。我希望加密的位字符串也有 20 位长。

河豚可以这样做吗?可能吗?

感谢您的任何帮助!

对于任何分组密码,密文必须至少与块大小一样大。 这是河豚的64位,这意味着至少64位输出。

如果您的明文比块大小长,那么您可以使用密文窃取获得相同的密文大小:https://en.m.wikipedia.org/wiki/Ciphertext_stealing

不知道为什么要这样做编码,它肯定不会增加安全性。 此外,Blowfish是一个过时的算法:AES是一个更好的选择,但它的块大小为128。

流密码将允许您获得与明文大小完全相同的密文大小,但我不知道在 Java 中实现的任何好的密码文本大小。 无论你做什么,都要远离rc4:它有真正的安全问题。 请参阅 eSTREAM 页面,了解应具有足够安全性的可能流密码。 此外,切勿将密钥重用于流密码。

编辑:@CommonsWare指出了Maarten Bodewes的一个聪明的解决方案。 对我来说它看起来是正确的,但我认为你不会找到一个开箱即用的实现。 还要记住,每个密文都必须与 IV 配对,IV 的长度与块大小相同(河豚为 64 位(。 你永远不应该重复静脉注射。 我的总体感觉是,虽然这是一个聪明的解决方案,但如果你不必自己实现这样的东西,你可能会更好(实施加密是危险的:犯最小的错误很容易失去安全属性(。

最新更新