图片LSB信息隐写

article/2025/7/20 16:08:28

LSB(全大写)有时也指Least Significant Byte,指多字节序列中最小权重的字节。指的是一个二进制数字中的第0位(即最低位)

        RGB色彩模式是工业界的一种颜色标准,是通过对红(R)、绿(G)、蓝(B)三个颜色通道的变化以及它们相互之间的叠加来得到各式各样的颜色的,RGB即是代表红、绿、蓝三个通道的颜色,这个标准几乎包括了人类视力所能感知的所有颜色,是运用最广的颜色系统之一。

        按照计算,256级的RGB色彩总共能组合出约1678万种色彩,即256×256×256=16777216。通常也被简称为1600万色或千万色。也称为24位色(2的24次方)。

        RGB24:使用24位来表示一个像素,RGB24:RGB分量都用8位表示,取值范围为0-255。注意在内存中RGB各分量的排列顺序为:BGR
        RGB32:使用32位来表示一个像素,RGB32:RGB分量各用去8位,剩下的8位用作Alpha通道或者不用。(ARGB32就是带Alpha通道的RGB24。)注意在内存中RGB各分量的排列顺序为:BGRA 

        每个通道可以用8位二进制标识,如下一张图,改变低位第0或第1,肉眼几乎察觉不出颜色的变化。所以,我们可以把信息写入这样的低位

 知道了隐写的原理,我们可以考虑多种方式的写入

 1、一个像素点至少可以有3个(或更多)通道RGB,这3个通道都可以隐写,写到哪一个里面如果不知道就很难读取。我们可以只写R,只写G,甚至可以三个通道混着写,可能性很多

 2、写入字节的低位,后两位人眼都分辨不出来了。是写了后1位,还是写了后2位,还是基数写1位,偶数写2位,这个也有很多种可能

 3、结束位和开始位,一张图片像素=宽*高,我从那个位置开始写,从哪个位置结束,是从左到右,还是从右到左。从上到下,还是从下到上。也可以自己定义规则

 4、对原文进行混淆、加密,这种情况,在不知道规则或秘钥的情况下,基本是不可能了。

 5、因为隐写的是二进制,可以把图片,zip,txt文件,word等各种类型的文件写入。如果不知道原来的格式,读取出来后也无法还原。

下面是一段规则非常简单的隐写代码

 1、只在R通道最后1位进行隐写

 2、前三个字节Byte,即前24个像素保存隐藏数据的大小len。根据大小,读取后面的len*8个像素的末1位,进行读取

 3、数据的读写没有进行加密处理

注意里面几个运算符: |  & >> <<


import javax.imageio.ImageIO;
import java.awt.image.BufferedImage;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.IOException;
import java.util.Scanner;public class LSB1 {public static void main(String[] args) throws IOException {Scanner scan = new Scanner(System.in);System.out.println("***************LSB图像隐写编码程序****************");System.out.println("*********请选择想要使用的功能(输入数字)*************");System.out.println();System.out.println("******************1.LSB编码********************");System.out.println("******************2.LSB解码********************");System.out.println();System.out.print("请输入你想选择的功能:");String choice = scan.next();switch(choice){case "1":System.out.print("请输入需要加密的文件的路径:");String textPath = scan.next();System.out.print("请输入png图像辅助文件的路径:");String imagePath = scan.next();System.out.print("最后再输入一下生成的png图片的保存路径:");String  imageOutputPath= scan.next();LSBEncoder(textPath,imagePath,imageOutputPath);scan.close();break;case "2":System.out.print("请输入待解码的png图片的路径:");String imageInputPath = scan.next();System.out.print("请输入解码后,存放数据的文件名称");String textFilePath = scan.next();LSBDecoder(imageInputPath,textFilePath);scan.close();break;default:System.out.print("输入错误!");scan.close();break;}}public static void LSBEncoder(String textPath, String imagePath,String imageOutputPath ) throws IOException {//读取png图像BufferedImage image = ImageIO.read(new File(imagePath));int width = image.getWidth();int height = image.getHeight();int[][][] rgb = new int[width][height][3];//将图像每个点的像素(R,G,B)存储在数组中for (int w = 0; w < width; w++) {for (int h = 0; h < height; h++) {int pixel = image.getRGB(w, h);//读取的是一个24位的数据//数据三个字节分别代表R、B、Grgb[w][h][0] = (pixel & 0xff0000) >> 16;//Rrgb[w][h][1] = (pixel & 0xff00) >> 8;//Grgb[w][h][2] = (pixel & 0xff);//B}}//读取待加密机密文件到字节数组FileInputStream fis = new FileInputStream(textPath);int byteLen = fis.available();byte[] buf = new byte[byteLen];fis.read(buf);fis.close();//我用3个字节(24位)表示数据部分的长度int[] bufLen = new int[3];bufLen[0] = (byteLen & 0xff0000 ) >> 16;bufLen[1] = (byteLen & 0xff00 ) >> 8;bufLen[2] = (byteLen & 0xff);for (int i = 0; i < 3; i++) {for (int j = 7; j >= 0; j--) {int h =(i * 8 +(7 - j)) / width;int w = (i * 8 + (7-j)) % width;//只取每个像素点的R,的字节的最低位if((bufLen[i] >>j & 1) == 1 ){rgb[w][h][0] = rgb[w][h][0] | 1;} else {rgb[w][h][0] = rgb[w][h][0] & 0xfe;}}}//按照规则将数据的二进制序列全部放到每一个像素点的第一个字节的最后一位上for (int i = 3; i < byteLen + 3; i++) {for (int j = 7; j >= 0; j--) {//高int h = (i * 8 + (7 - j)) / width ;//宽int w = (i * 8 + (7 - j)) % width;if ((buf[i-3] >> j & 1) == 1) {rgb[w][h][0] = rgb[w][h][0] | 1;//二级制:00000001} else {rgb[w][h][0] =rgb[w][h][0] & 0xfe; //二级制:11111110}}}//构建通过编码生成的png图片的类型BufferedImage imageOutput = new BufferedImage(width, height, BufferedImage.TYPE_INT_RGB);for (int w = 0; w < width; w++) {for (int h = 0; h < height; h++) {int[] color = new int[3];color[0] = rgb[w][h][0] << 16;color[1] = rgb[w][h][1] << 8;color[2] = rgb[w][h][2];int pixel = 0xff000000 | color[0] | color[1] | color[2];imageOutput.setRGB(w, h, pixel);}}ImageIO.write(imageOutput, "png", new File(imageOutputPath));}public static void LSBDecoder(String imageInputPath,String textFilePath) throws IOException {//读取图片BufferedImage imageInput = ImageIO.read(new File(imageInputPath));int width = imageInput.getWidth();// int height = imageInput.getHeight();//前3个字节保存的是信息的长度int[] bufLen=  new int[3];for (int i = 0; i < 3; i++) {int[] bits = new int[8];for (int j = 7; j >= 0; j--) {int h =(i * 8 +(7 - j)) / width;int w = (i * 8 + (7-j)) % width;int pixel = imageInput.getRGB(w,h);int r = (pixel & 0xff0000) >> 16;bits[j] = (r & 1) << j;}bufLen[i] =  bits[7] | bits[6] | bits[5] | bits[4] | bits[3] | bits[2] | bits[1] | bits[0];}//把长度转换成int类型int byteLen =  ( (bufLen[0] << 16)| (bufLen[1] << 8) | bufLen[2]);//System.out.println(byteLen);byte[] buf = new byte[byteLen];//开始循环,读取数据for (int i = 3; i < byteLen + 3; i++) {int[] bits = new int[8];for (int j = 7; j >= 0; j--) {int h = (i * 8 + (7 - j)) / width;int w = (i * 8 + (7 - j)) % width;int pixel = imageInput.getRGB(w, h);int r = (pixel & 0xff0000) >> 16;bits[j] = (r & 0x1) << j;}buf[i-3] = (byte)(bits[7] | bits[6] | bits[5] | bits[4] | bits[3] | bits[2] | bits[1] | bits[0]);}//System.out.println(new String(buf));//把读取的数据写入文件FileOutputStream fos = new FileOutputStream(textFilePath);fos.write(buf);fos.close();}
}

http://chatgpt.dhexx.cn/article/6t8jtRH3.shtml

相关文章

F3隐写

F3隐写 文章目录 F3隐写1. 引言2. 实验环境3. 实现使用的现有外部库4. 实现思路> **预处理**> **DCT量化**>**秘密信息嵌入**> **Z字形序列化**>**Huffman编码**>**反Z字形序列化**>**提取秘密信息** 5.验证6. 总结 1. 引言 数字隐写技术是一种在数字媒体…

TTL隐写

#拿到一个长成这样的文件&#xff0c;里面是意义不明的数字 63 63 63 255 63 63 63 255 63 63 63 255 63 63 63 255 63 63 63 255 63 63 63 255 63 127 63 255 63转换为2进制&#xff0c;并设置为8位数的2进制&#xff0c;就会有很神奇的事情发生 with open(C:/Users/brighten…

深度学习之图像隐写去除(DDSP模型 Steganography Removal)

文章目录 一 前言二 论文内容2.1 Abstract2.2 Introduction2.3 Background2.3.1 Prior Work2.3.2 Super Resolution GAN 超分辨率GAN 2.4 Data2.5 Deep Digital Steganography Puricication (重头戏)2.5.1 Autoencoder Architecture2.5.1 GAN Training 2.6 Result 三 训练结果四…

SRNet隐写分析网络模型 (pytorch实现)

文章目录 一 SRNet隐写分析模型介绍二 SRNet网络概述三 训练结果展示 一 SRNet隐写分析模型介绍 SRNet模型是宾汉姆顿大学(Binghamton University)Jessica教授团队于2018年提出的图像隐写分析网络模型&#xff0c;应该说是当时SOTA(state-of-the-art)的隐写分析网络模型了&…

GIF隐写

CTF DAY1的倒数第二题&#xff1a; 首先 打开图片 发现打不开 用010 Editor 发现图片开头少了文件头 添加文件头 使得图片能够看到 这时候打开图片 发现 密码一闪而过 这时候 用到另一个软件 Namo_Gif 打开刚刚已经恢复好的GIF 可以清楚的看到每一帧 对于每一帧 修改他…

隐写术--总结

文章来源&#xff1a;http://bobao.360.cn/learning/detail/243.html 1.增加数据的方式 隐藏信息 另存为.zip后解压&#xff0c;正常的.JPG图片在文本编辑器&#xff08;winhex&#xff09;中&#xff0c;16进制是以FF D9结尾 原理&#xff1a;a.先制作一个1.zip 把含有隐藏…

隐写术技术深入分析

文章目录 0x01 隐写术概要0x02 特征0x03 隐写术应用0x04 题目解析思路 0x01 隐写术概要 首先看一下官方定义&#xff0c;“隐写术是一门关于信息隐藏的技巧与科学&#xff0c;所谓信息隐藏指的是不让除预期的接收者之外的任何人知晓信息的传递事件或者信息的内容。” 简单说就…

隐写术基础

目录 前言 一. 隐写系统模型 二. 隐写分析系统模型 三. 对比隐写技术与密码技术 四. 隐写术的基本术语与概念 4.1 不可感知性 4.2 安全性 4.3 隐蔽性 4.4 鲁棒性 4.5 隐藏容量 4.7 检测粒度 总结 前言 隐写术是一门关于信息隐藏的技巧与科学&#xff0c;所谓信息隐…

CTF学习之MISC之图片隐写与文档隐写

CTF学习之MISC之图片隐写 隐写术概述 图片隐写技术图片EXIF信息隐写图片LSB低位隐写 隐写术&#xff08;Stega&#xff09; 隐写术&#xff08;Steganography&#xff0c;简写Stega&#xff09; 一门关于信息隐藏的技巧与科学 信息隐藏&#xff1a;不让除预期的接收者之外的…

隐写术

目录 隐写(信息隐藏&#xff0c;steganography) Stegsolve Binwalk MP3Stego Bftools(Brainfuck) F5-steganography-master S-Tools 隐写(信息隐藏&#xff0c;steganography) 目的&#xff1a;以表面正常的数字载体如静止图象、数字音频和视频信号等作为掩护&#xff…

OMNET++安装教程

安装&#xff1a; 如果你是windows系统&#xff0c;那么强烈推荐你跟着B站上的教程来学习&#xff0c;下面是链接。 这个博主讲的特别细致&#xff0c;而且会捎带讲几个例子&#xff0c;有助于我们快速的建立起来学习的信心&#xff01;&#xff01;&#xff01; 当时我看到…

【OMNET++】OMNET如何开启Debug调试

1.前言 OMNET作为网络仿真软件&#xff0c;其编译语言为NEDC和C&#xff0c;在学习过程中我们该如何运用debug跟踪代码呢&#xff1f;这一讲我们简单和大家分享一下OMNET如何开启Debug调试。 可能我们翻阅很多资料&#xff0c;都会提到一句话&#xff0c;Window下的OMNET是基于…

【OMNET++】OMNET安装卸载说明以及原理探讨

前言 我们安装OMNET&#xff0c;参考file:///D:/omnetpp-5.4.1-src-windows/omnetpp-5.4.1/doc/InstallGuide.pdf的官方文档&#xff0c;其支持的平台很多&#xff0c;例如window、Ubuntu 、Linux以及红帽等系统&#xff0c;这篇博文以window为例&#xff0c;简单说明其中注意…

Ubuntu18.04 安装 omnet 5.6.2

1. 下载所需的OMNet版本 下载链接&#xff1a; OMNeT官网下载 2. 解压下载的omnet包&#xff0c;找到安装教程 解压方式&#xff1a;可以鼠标右击&#xff0c;选择Extract here;也可以在终端中使用命令行解压. 安装教程在: omnetpp-5.6.2-src-linux/omnetpp-5.6.2/doc/Install…

OMNeT学习之TicToc2-7详解

OMNeT学习之TicToc2-7详解 前言 安装好OMNeT&#xff0c;学会新建项目之后&#xff0c;开始学习OMNeT提供的tictoc案例&#xff0c;共17个&#xff0c;之前的博客中已经讲解了Tictoc1&#xff0c;本次学习2-7。 本人学习一个tictoc工程&#xff0c;主要就是看它的cc文件、ned…

omnet++构架与源码分析(1)

omnet模型以及运行环境部分使用c开发&#xff0c;IDE以及插件使用Eclipse以及插件方式开发。其中c代码位于解压后的include与src目录&#xff1b; src下面分为&#xff1a; sim&#xff1a;仿真内核类的CC代码&#xff1b;各种头文件&#xff0c;都在include目录&#xff1b;…

linux下运行omnet,Ubuntu安装Omnet++

1.官网下载Omnet++压缩包(https://omnetpp.org/),解压到安装文件夹 tar -zxvf omnetpp-5.1.1-src-linux.tgz /opt 2.运行./configure 报错configure: error: Bison not found, needed to build OMNeT++/OMNEST – please install it! 解决办法:安装bison,安装完成后会提示还…

OMNeT学习之新建工程

OMNeT学习之新建工程 前言 之前学习了OMNeT的安装与运行官方的实例代码&#xff0c;这篇文章记录一下&#xff0c;OMNeT如何创建一个新的项目。 本人为初学者&#xff0c;如有错误望批评指正&#xff01; 本文原创&#xff0c;创作不易&#xff0c;转载请注明&#xff01; …

omnet++ 之aloha示例 的动画效果分析

void Host::refreshDisplay() const {cCanvas *canvas getParentModule()->getCanvas();const int numCircles 20;const double circleLineWidth 10;// 第一次使用时候创建&#xff1a;如果没有传输波形图&#xff0c;则创建一个圆环内部填色&#xff0c;创建20个圆环&am…

【OMNeT+INET】详解OMNeT开源库INET(一)

1、前言 在我看来&#xff0c;网络模拟器是用于评估目标系统性能和能力的方便工具&#xff0c;不同的设计方案&#xff0c;在不同的配置下不同的操作条件和运行场景下&#xff0c;可以用于帮助理解系统并获得与性能相关的参数&#xff08;例如吞吐量、延迟、稳定性、健壮性和可…