所以我想在java中编写一个steganography程序。
这是我到目前为止(重要的部分)
private void hideMessage(){
byte[] messageBytes = message.getBytes();
//message is a string
int messageLength = messageBytes.length;
for(int i = messageLength-1; i>=0; i--){
imageBytes[i+100000] = messageBytes[i];
//imageBytes is a bitmap image read into a byte array using imageIO
}
}
和
private void getMessage(){
int messageLength = 11;
byte[] messageBytes = new byte[messageLength];
for(int i = messageLength; i>0; i--){
messageBytes[i-1] = imageBytes[i+10000];
}
message = new String(messageBytes);
}
然而,这是我得到的字符串输出:
???????????
我做错了什么?
答案 0 :(得分:1)
您不能简单地从任意字节创建字符串 - 字节必须是您正在使用的编码中的字符编码(在您的情况下,默认编码)。如果使用不映射到字符的字节,它们将映射到'?'
。在另一个方向上也是如此:如果您的字符串中的字符不映射到字节,getBytes()
方法会将它们映射到(byte)'?'
。我想这里发生过一次或两次。
如果您使用JPG或类似的有损图像格式,它将在保存期间更改图像的字节。
答案 1 :(得分:1)
如果计划要实际更改部分位图字节,则需要将图像导出为png,因为它是无损的。 Jpeg可能会稍微改变字节,这对于图像来说不是问题,但对于文本来说它显然很关键。
其次,如果您要选择100,000作为固定位置来插入消息,则应将其设置为常量以使其更容易,并且更不容易出错。说到这一点,你当前的固定偏移量为'0',10,000和100,000。
答案 2 :(得分:1)
注意你的零点。您的评论为1000,getMessage
使用10000,hideMessage
使用100000
(因为显然这一切都是错误的,所以重新作为回答)
答案 3 :(得分:0)
但是你应该编辑原始文件,但是BufferedImage
的实例,然后将其重写回ImageIO
的文件。