我正在“Steganography”中进行一个项目,其中我想使用“Blowfish”算法加密文件内容,然后想要将加密文本嵌入到图像中并执行相反的过程来提取图像。 />
类'Cipher'中的'update'方法只加密一些no。但是,在这里我只希望文件的所有字节(加密内容)只在一个数组中。解密中的“更新”方法也是如此。稍后这个数组将被传递给一种方法,在该方法中我将文本嵌入到图像中并在需要时提取。那么对于这个问题有什么更好的方法呢?
谢谢。
答案 0 :(得分:5)
大多数密码都是流密码。他们可以在加密/解密数据时获取数据并输出结果。 Java Cipher类以这种方式工作。使用数据块调用update(..),它将返回一个加密数据块。当您到达输入数据的末尾时,可以调用final(...)方法。
现在,如果您希望将所有数据累积到单个二进制缓冲区中,并将其全部加密,那么也可以。但最后,无论哪种方式有效,密码都不关心它是一次加密1个字节还是一次加密1MB。
如果您只是想知道如何追加字节数组,只需创建一个新的字节数组,其长度等于您想要追加的数组大小的总和,然后使用System.arraycopy移动复制原始数组。
byte[] newbuf = new byte[oldbuf1.length + oldbuf2.length];
System.arraycopy(oldbuf1, 0, newbuf, 0, oldbuf1.length);
System.arraycopy(oldbuf2, 0, newbuf, oldbuf1.length, oldbuf2.length);
如果你要做那么多,并且你有足够的内存,最好将你的数据块累积到不同的字节缓冲区中,将它们填入List中,然后再进行一次最后的合并
int sum = 0;
for(byte[] ba : arraysList) {
sum = sum + ba.length;
}
byte[] newbuf = new byte[sum];
int curpos = 0;
for(byte[] ba : arraysList) {
System.arraycopy(ba, 0, newbuf, curpos, ba.length);
curpos = curpos + ba.length;
}
(代码未经测试,应该有效,不要认为那里有任何一次性。)