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

时间:2017-06-30 21:15:57

标签: java android encryption blowfish bitstring

我正试图在我用Java for Android编写的程序中找到一种实现Blowfish(或任何可行的加密方案)的方法。

我有一句话,比如“我是一只狗”,我想要加密。

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

这是我自己制作的,就像a =“00110”和'the'=“11001”

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

“00011101001101011010”

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

即。上面的位串是20位长。我希望加密的位串也是20位长。

这可能与Blowfish有关吗?它有可能吗?

感谢您的帮助!

1 个答案:

答案 0 :(得分:1)

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

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

不确定为什么要以这种方式进行编码,它肯定不会增加安全性。此外,Blowfish是一种过时的算法:AES是更好的选择,但块大小为128.

流密码将允许您获得与明文大小完全相同的密文大小,但我不知道在Java中实现的任何好的密文。无论你做什么,远离rc4:它有真正的安全问题。有关可能具有足够安全性的可能流密码,请参阅eSTREAM页面。此外,您必须never re-use a key才能获得流密码。

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