lsb隐写java代码
时间: 2024-12-27 11:18:46 浏览: 8
### LSB 隐写术的 Java 实现
对于图像隐写技术中的最低有效位(LSB)方法,在Java中可以通过操作图片像素来隐藏消息。下面是一个基本的例子,展示了如何利用PNG格式的图像进行编码和解码秘密信息。
#### 编码部分:将文本嵌入到图像中
```java
import java.awt.image.BufferedImage;
import javax.imageio.ImageIO;
import java.io.File;
public class LsbStegoEncoder {
public static void encode(String imagePath, String secretMessage, String outputPath) throws Exception {
File inputImageFile = new File(imagePath);
BufferedImage image = ImageIO.read(inputImageFile);
int width = image.getWidth();
int height = image.getHeight();
StringBuilder binarySecretMessage = toBinary(secretMessage);
// 添加终止符以便于解密时识别结束位置
binarySecretMessage.append("11111111");
char[] bitsArray = binarySecretMessage.toString().toCharArray();
int index = 0;
for (int y = 0; y < height && index < bitsArray.length; ++y) {
for (int x = 0; x < width && index < bitsArray.length; ++x) {
int rgb = image.getRGB(x, y);
int leastSignificantBit = Character.getNumericValue(bitsArray[index++]);
rgb &= ~1; // 清除最后一位
rgb |= leastSignificantBit; // 设置新的最低位
image.setRGB(x, y, rgb);
}
}
File outputImageFile = new File(outputPath);
ImageIO.write(image, "png", outputImageFile);
}
private static StringBuilder toBinary(String message){
StringBuilder result = new StringBuilder();
byte[] bytes = message.getBytes();
for(byte b : bytes){
result.append(Integer.toBinaryString(b | 256).substring(1));
}
return result;
}
}
```
这段代码读取给定路径下的PNG文件并修改其像素值以存储二进制形式的秘密消息[^1]。注意这里只改变了每个颜色通道中最不重要的比特位,因此视觉效果几乎不变。
#### 解码部分:从图像提取隐藏的信息
```java
import java.awt.image.BufferedImage;
import javax.imageio.ImageIO;
import java.io.File;
public class LsbStegoDecoder {
public static String decode(String imagePath) throws Exception {
File inputFile = new File(imagePath);
BufferedImage image = ImageIO.read(inputFile);
int width = image.getWidth();
int height = image.getHeight();
StringBuilder extractedBits = new StringBuilder();
boolean endOfMessageFound = false;
for(int y=0;y<height&&!endOfMessageFound;++y){
for(int x=0;x<width&&!endOfMessageFound;++x){
int rgb=image.getRGB(x,y)&1;
extractedBits.append(rgb);
if(extractedBits.substring(Math.max(0,extractedBits.length()-8)).equals("11111111")){
endOfMessageFound=true;
}
}
}
return fromBinary(extractedBits.toString());
}
private static String fromBinary(String binStr){
StringBuilder result=new StringBuilder();
for(int i=0;i<=binStr.length();i+=8){
if(i+8>binStr.length()) break;
String eightBits=binStr.substring(i,i+8);
if(eightBits.equals("11111111"))break;
result.append((char)Integer.parseInt(eightBits,2));
}
return result.toString();
}
}
```
上述解码过程会遍历整个图像直到遇到预定义的消息结尾标记为止,并重建原始字符串。
阅读全文