LSB信息隐藏之BMP图像数据的读取

基于LSB的信息隐藏实现 LSB就是最不重要位信息隐藏算法,读取出图片中每个点的象素值,然后把信息的bit序列填充到这些象素的最低上.然后在分析检测的时候提取出最低位,就可以恢复原始信息.因为是在最低位上进行隐藏,所以图像的失真是比较小的,肉眼无法察觉,但是它会破坏图像的统计特性,这样通过统计的方法可以检测到有信息的嵌入.此外在图片有损压缩时,隐藏的信息容易丢失.如果嵌入高位,会带来失真,但是嵌入强度高,可以抵御有损压缩. 阅读详情
#include "stdafx.h"
#include "LSB_Coder.h"


//-------------------------------------------------------------------------------------------
//读图像的位图数据、宽、高、颜色表及每像素位数等数据进内存,存放在相应的全局变量中
bool LSB::readBmp(char *bmpName) 
{
FILE *fp=fopen(bmpName,"rb");//二进制读方式打开指定的图像文件


if(fp==0) return 0;


//跳过位图文件头结构BITMAPFILEHEADER


fseek(fp, sizeof(BITMAPFILEHEADER),0);


//定义位图信息头结构变量,读取位图信息头进内存,存放在变量head中


BITMAPINFOHEADER head;  


fread(&head, sizeof(BITMAPINFOHEADER), 1,fp); //获取图像宽、高、每像素所占位数等信息


bmpWidth = head.biWidth;


bmpHeight = head.biHeight;


biBitCount = head.biBitCount;//定义变量,计算图像每行像素所占的字节数(必须是4的倍数)


int lineByte=(bmpWidth * biBitCount/8+3)/4*4;//灰度图像有颜色表,且颜色表表项为256


if(biBitCount==8)
{


//申请颜色表所需要的空间,读颜色表进内存


pColorTable=new RGBQUAD[256];


fread(pColorTable,sizeof(RGBQUAD),256,fp);


}


//申请位图数据所需要的空间,读位图数据进内存


pBmpBuf= new unsigned char[lineByte * bmpHeight];


fread(pBmpBuf,1,lineByte * bmpHeight,fp);


fclose(fp);//关闭文件


return 1;//读取文件成功
}


//-----------------------------------------------------------------------------------------
//给定一个图像位图数据、宽、高、颜色表指针及每像素所占的位数等信息,将其写到指定文件中
//bool LSB::saveBmp(char *bmpName, unsigned char *imgBuf, int width, int height, int biBitCount, RGBQUAD *pColorTable)
bool LSB::saveBmp(char *bmpName)
{


//如果位图数据指针为0,则没有数据传入,函数返回


if(!pBmpBuf)


return 0;


//颜色表大小,以字节为单位,灰度图像颜色表为1024字节,彩色图像颜色表大小为0


int colorTablesize=0;


if(biBitCount==8)


colorTablesize=1024;


//待存储图像数据每行字节数为4的倍数


int lineByte=(bmpWidth * biBitCount/8+3)/4*4;

//以二进制写的方式打开文件


FILE *fp=fopen(bmpName,"wb");


if(fp==0) return 0;


//申请位图文件头结构变量,填写文件头信息


BITMAPFILEHEADER fileHead;


fileHead.bfType = 0x4D42;//bmp类型


//bfSize是图像文件4个组成部分之和


fileHead.bfSize= sizeof(BITMAPFILEHEADER) + sizeof(BITMAPINFOHEADER)


+ colorTablesize + lineByte*bmpHeight;


fileHead.bfReserved1 = 0;


fileHead.bfReserved2 = 0;


//bfOffBits是图像文件前3个部分所需空间之和


fileHead.bfOffBits=54+colorTablesize;


//写文件头进文件


fwrite(&fileHead, sizeof(BITMAPFILEHEADER),1, fp);


//申请位图信息头结构变量,填写信息头信息


BITMAPINFOHEADER head; 


head.biBitCount=biBitCount;


head.biClrImportant=0;


head.biClrUsed=0;


head.biCompression=0;


head.biHeight=bmpHeight;


head.biPlanes=1;


head.biSize=40;


head.biSizeImage=lineByte*bmpHeight;


head.biWidth=bmpWidth;


head.biXPelsPerMeter=0;


head.biYPelsPerMeter=0;


//写位图信息头进内存


fwrite(&head, sizeof(BITMAPINFOHEADER),1, fp);


//如果灰度图像,有颜色表,写入文件 


if(biBitCount==8)


fwrite(pColorTable, sizeof(RGBQUAD),256, fp);


//写位图数据进文件


fwrite(pBmpBuf, bmpHeight*lineByte, 1, fp);


//关闭文件


fclose(fp);


    //清除缓冲区,pBmpBuf和pColorTable是全局变量,在文件读入时申请的空间
//delete []pBmpBuf;
//if(biBitCount==8)
//delete []pColorTable;


return 1;


}




//-------------------------------------------------------------------------------------------
//一下为信息隐藏部分
void LSB::LSBCoder(const char*textFileName)
{
ifstream textFile;
textFile.open(textFileName,ios::in | ios::binary);
//_infoStream.open(_originalPicPath,ios::in | ios::binary);
textFile.seekg(0,textFile.end);
long textFileLength = textFile.tellg();


BYTE* pTextFile = new BYTE[textFileLength+1];
cout<<"隐藏时文件长度:"<<textFileLength<<endl;
textFile.seekg(0,textFile.beg);
textFile.read((char*)pTextFile,textFileLength);
textFile.close();


BYTE textData;
for(int i=0,k=0; i< textFileLength; ++i)
{
for(int j=0; j<8; ++j)
{
textData = pTextFile[i]>>j;
textData = textData&0x01;
if(textData==0)
{
 pBmpBuf[k+32] = pBmpBuf[k+32]&0xfe;
}
else
{
pBmpBuf[k+32] = pBmpBuf[k+32]|0x01;
}
++k;
}
}
cout<<"信息隐藏完毕"<<endl;
long length;
for(int i=0; i<32; ++i)
{
length = textFileLength>>i;
length = length&0x00000001;
if(length==0)
{
pBmpBuf[i] = pBmpBuf[i]&0x1e;
}
else
{
pBmpBuf[i] =pBmpBuf[i]|0x01;
}


}
}
//------------------------------------------------
//  解码基于LSB的信息隐藏
//-------------------------------------------------
void  LSB::LSBDecoder(const char* textFileName)
{
long length = 0x00000000;
BYTE bit;
//获取txt文件长度
for(int i=0; i<32; ++i)
{
bit =pBmpBuf[i]&0x01;
 if(bit==0)
 {
  length = length&0x7fffffff;
 }
 else
 {
 length = length|0x80000000;
 }
  if (i<31)    length = length>>1;
}
cout<<"解码时文件长度:"<<length<<endl;
//开始解码
BYTE* pTextFile = new BYTE[length];
BYTE textData;
for(int i=0,k=0; i<length*8; ++i)
{
if(i && i%8==0){++k;}
textData = pBmpBuf[i+32]&0x01;
if(textData==0)
{
 pTextFile[k] = pTextFile[k]&0x7f;
}
else
{
 pTextFile[k] = pTextFile[k]|0x80;
}
if (i%8 != 7) pTextFile[k] = pTextFile[k]>>1;
}
cout<<"解码完毕"<<endl;


 ofstream textFile;
 textFile.open(textFileName,ios::out | ios::binary);
 textFile.write((char*)pTextFile,length);
 textFile.close();
 delete pTextFile;
 //char savepicPath[]="Apple_Coder.bmp";
 //saveBmp(savepicPath, pBmpBuf, bmpWidth, bmpHeight, biBitCount, pColorTable);
}
信息隐藏实验一 LSB隐写和RS分析实现 一、LSB隐写 1. 简介 隐写对象:bmp 图像,图像内容为原始像素值 隐写方式:将秘密信息转换为二进制比特流,嵌入像素值的最低位中(对图像的影响最小) 隐写规则:嵌入0,将对应像素值最低位置为0;嵌入1则置为1 提取方式:提取像素值最低位,重新转换为对应数据编码 2. 实现 读取原始图像:图像头+图像内容,我们可以进行隐写的部分为内容部分 void readHeader(FILE *image, UCHAR header[]) { fread(header, 1, 1078, image 阅读详情

相关推荐

C++实现LSB算法的图片信息隐藏与提取项目实战

由于图像容量未必恰好匹配数据总量,最后一个数据块之后可能存在未使用的LSB位。为防止提取程序误读垃圾数据,必须定义结束标记(EOF Marker)。一种方案是在最后一个块后嵌入特殊比特序列,如连续8个1另一种更稳健的方式是利用元数据中的自然标识末尾。结合校验和机制即可准确定位终点。此外,可在全局层面设置终止块:前4字节全1表示结束,后4字节为校验,双重保险。

weixin_36303305的博客 555

c++语言 读串口,C/C++语言,对MSB、LSB的读/取处理

1. 做硬件的都知道,串口是LSB优先,I2C、1553B是MSB优先,这里的MSB、LSB指的是二进制位的位置,区别于【字节序】(通信中,先发送低字节,还是高字节的问题,那叫大端big-endian、小端little-endian)如果需要自己来实现MSB、LSB的读取、转换,如何实现呢?下面给出C/C++程序:#include"stdio.h"#defineBITS_WIDTH(8)voi...

weixin_39735012的博客 833

BMP图片的LSB算法实现隐写

基于LSB算法的BMP图片隐写,python实现,取RGB的最后一位存取信息

LSB算法分析与实现

LSB全称为 Least Significant Bit(最低有效位),是一种常被用做图片隐写的算法(在CTF中经常见到她的身影)。LSB属于空域算法中的一种,是将信息嵌入到图像点中像素位的最低位,以保证嵌入的信息是不可见的,但是由于使用了图像不重要的像素位,算法的鲁棒性差,水印信息很容易为滤波、图像量化、几何变形的操作破坏。本博客将对LSB算法进行简要分析,并使用C#程序设计语言实现一个简要的隐写系统。

Hugu 3万+

BMP图像中的LSB信息隐藏方法

任选一个24位的BMP图片文件 用二进制文件方式打开这个文件,顺序读取每个像素的颜色 将字符串的ASCII码顺序替换掉这个图像文件中每个像素的每个颜色分量的LSB位 保存修改后的图像文件 提取部分: 用二进制文件方式打开隐藏了信息的图片文件 顺序读取每个像素的颜色中每个分量的LSB位 将提取的LSB位恢复为字符串显示出来

信息隐藏LSB隐藏与提取算法

信息隐藏技术的LSB隐藏方法及提取 包含隐藏、提取、比较的MATLAB算法

CTF图片隐写入门

判断图片类型 根据图片的后缀名不能准确的判断图片的类型,但通过图片文件头部分析能获得图片的类型。(查看的时候打开命令行终端,cd到图片目录下,binwalk一下就ok啦) 在windows下安装ubuntu子系统,c盘路径在/mnt/c中 常见图片文件的文件头标志 1.JPEG 文件头标识(2 bytes):0xff.0xd8(SOI)(JPEG文件标识) 文件结束标识(2 bytes):0xff,0xd9(EOI) 2.TGA 未压缩的前5字节 00 00 02 00 RLE压缩的前五字节

huster0828的博客 3506

2024年中科大分子生物研究生考试建议

分子生物学复习资料及往年考题。

qq_43337249的博客 2950

进阶MIsc-1

打开一张.bmp图片,用各种传统方法试了都没得到答案,用winhex打开后发现一点线索,看到一些零碎字符,考虑LSB隐写--将文字嵌入图片。还有一种方法就是将.bmp文件用画图软件打开然后另存尾png文件,然后用stegsolve打开即可看到答案。看到了里面有.png文件,所以我们判断应该是RAR包有损坏所以解压不出,当我们打开压缩包只看到一个文本文件,但是用winhex打开却又。根据上思维导图中的提示把下图的7A改为74,即可解压成功。^C对剥离后的新的数据导出为新的文件夹。

ccccc120120的博客 550

在Docker中集成GPU监控体系

先上效果图 等文档整理出来再更

tamako0v0的博客 2470

深入解析.Net中SM2与sm-crypto的跨平台加解密实践

本文深入探讨了在.Net平台与前端sm-crypto库之间实现SM2国密算法跨平台加解密的实践方案。针对对接中常见的密钥格式、密文拼接顺序(C1C3C2与C1C2C3)等核心难点,提供了基于BouncyCastle的完整工具类实现、前后端联调示例及问题排查指南,旨在帮助开发者构建安全、兼容的数据加密通道。

weixin_29322855的博客 369

java bmp信息隐藏_BMP图像信息隐藏

图像隐写算法LSB—Least Significant Bits,又称最不显著位。LSB算法就是将秘密信息嵌入到载体图像像素值得最低有效位,改变这一位置对载体图像的品质影响最小。原理如下:以实验用的24位真彩图为例,每个像素用3Byte表示,每Byte分别表示R、G、B三色的亮度,亮度取值范围位0~0xFF。采用LSB算法就是将图像信息的每一Byte的最后一位二进制替换为待嵌入的秘密信息的一位,按...

weixin_33564753的博客 528

Intel AX系列网卡5G热点开启失败?Linux下3种修复方案实测(含Ubuntu/OpenWRT)

本文针对Intel AX系列网卡在Linux系统下无法开启5G热点的常见问题,深入剖析了其根源在于内核LAR机制与驱动的兼容性。文章提供了三种实测有效的修复方案:针对内核低于5.5的模块参数法、适用于高内核版本的hostapd补丁编译法以及高阶的驱动修改法,帮助用户在Ubuntu、OpenWRT等环境中成功启用5G热点功能。

weixin_29291863的博客 734

Bmp读取&&保存&&旋转&&加密&&加密后信息提取(LSB算法)

#include #include #include #include #include #include using namespace std; char buf[51200000]; typedef struct tagIMAGEDATA {     BYTE blue;     BYTE green;     BYTE red; }IMAGEDATA; BIT

ZWenLong520的博客 334

如何制作DOS启动盘 U盘制作DOS启动盘 HP-U盘启动DOS7 详细步骤教程 Intel网卡使用软件 bootutil lanconfig eeupdate Intel网卡修改MAC地址教程

制作DOS启动盘不是一项复杂的任务,只要按照以下简单的步骤进行操作,您就可以自己动手制作一个DOS启动盘。

lcy524514826的博客 896

Google Earth Engine 红树林制图方法的代码(三个模块)

谷歌地球引擎红树林制图方法(GEM)提供了一种直观、易用且可复制的工具,适用于广泛的非专业沿海管理者和决策者。该工具全面回顾并整合了相关的红树林遥感文献,并利用云计算的力量,包括简化的基于图像的潮汐校准方法。GEM 可免费用于非营利用途,并在 GEE 中运行,包含全面且详细注释的代码。GEM 专门设计用于绘制全球范围内多日期红树林分布并量化其动态变化。目前可用的工具和方法未能充分利用沿海管理者通常持有的丰富地方专业知识——GEM 致力于填补这一空白,帮助结合地方专业知识与 GEE 的云计算能力。

此星光明博客 559

信息隐藏与数字水印实验4-LSB信息隐藏的卡方分析

一、 实验目的 了解什么是隐写分析(steganalysis),隐写分析与信息隐藏和数字水印的关 系。掌握基于图像的 LSB 隐写的分析方法,设计并实现一种基于图像的 LSB 卡方隐写分析方法。二、 实验环境 (1)Windows10 或 11 系统 (2)Python 3.7 或以上 (3)图像文件 man.bmp三、 实验要求 (1)在灰度图 man.bmp 利用 LSB 方法随机嵌入 0 和 1 的比特,嵌入率为 100% , 后 生 成 mangraystego.bmp , 在 一 行 两 列 中

taylorswift的博客 5154

[AI工具评测] 为什么功能全面的 Kimi Claw,最终还是被放弃?

《KimiClaw:功能整合与体验落差的AI工具实践》 KimiClaw作为集LLM、Agent、云端执行和SaaS分发于一体的AI工具,理论上具备个人开发者所需的全栈能力:原生整合大模型与Agent、支持云端Docker部署、可生成Web应用并通过飞书协作。然而实际高频使用中暴露三大核心问题:响应延迟导致思考节奏断裂(非流式输出)、云端黑箱执行缺乏可控性(无法实时干预)、系统稳定性不足(网关和隧道偶发故障)。这些体验落差表明,功能完整性不等于使用高效性——对开发者而言,实时响应、执行透明度和系统可靠性比自

技术小甜甜:传播可落地技术,帮助个人和企业降低解决真实场景问题的成本 536

基于python的LSB加密算法设计

文章目录任务1.首先明确操作的原理2.进行操作的思如如下2.1隐藏信息2.2读取隐藏信息3.遇到的问题补充的python函数内容主要是字符串、数字、中文间的转化:4.具体的操作代码的如下4.1读取图片数据4.2隐藏(数字数据),各函数的设计①隐藏数据函数②进行数据的隐藏,同时保存图片中隐藏的点的位置的数据。③定义读取隐藏信息的函数④读取隐藏信息4.4.加密前后的图像的对比4.3隐藏(中文数据),函数的设计①隐藏数据函数②进行数据的隐藏,同时保存图片中隐藏的点的位置的数据。③定义读取隐藏信息的函数④读取隐藏信

m0_52985451的博客 4462

数据分析案例-汽车客户信息数据可视化分析

本数据集来源于kaggle,原始数据集共有8068条,11个特征变量,各变量含义解释如下:ID:客户IDGender:客户性别Ever_Married:客户婚姻状况Age:客户年龄Graduated:客户是毕业生吗?Profession:客户的职业Work_Experience:多年工作经验Spending_Score:客户的消费评分Family_Size:客户家庭成员人数(含客户)Var_1:客户的匿名类别Segmentation:(目标)客户的客户群。

m0_64336780的博客 1万+

数学建模模型总结

这是本人在两年内准备参加数学建模竞赛搜集到的模型资料,已经经过了本人的筛选和整理,希望能够对准备参加数学建模竞赛的学弟学妹们提供一些帮助!

LSB隐写总结

前言又是一年的情人节! 单身狗表示不关我事-.- 写篇博文祝贺庆祝下。一、LSB简介LSB(英文 least significant bit)即最低有效位。LSB加密是信息隐藏中最基本的方法。由于人们识别声音或图片的能力有限,因此我们稍微改动信息的某一位是不会影响我们识别声音或图片的。二、用法通常来说LSB加密用在无损压缩的数据格式文件中,例如图像中的bmp格式和音频的wav格式。由于这两种格式未

BadRer的博客 1万+

jre9下载 jdk9

(Java SE Runtime Environment 9.0) 9.0u175 官方最新版 【x86|x64】

信息隐藏与数字水印实验:图片类隐写(MATLAB)

文章目录一、BMP转二值嵌入RGB(相同分辨率)二、JPG嵌入RGB(不同像素) 最低有效位( least significant bit,LSB)指的是一个二进制数字中的第0位(即最低位)。 一、BMP转二值嵌入RGB(相同分辨率) 将BMP图像pic2.bmp转换为二值图像,并将其嵌入相同分辨率的RGB图像pic1.bmp的任一层(R层、G层或B层灰度图像)的最低位平面。 clear; clc; I=imread('pic1.bmp'); J=I; JR=J(:,:,1); L=imread('pi..

诚邀网络通信领域商务合作 7950

STM32F407中文手册

STM32f407中文手册 本参考手册面向应用开发人员,提供有关使用 STM32F405xx/07xx、STM32F415xx/17xx、 STM32F42xxx 和 STM32F43xxx 微控制器存储器与外设的完整信息。STM32F405xx/07xx、STM32F415xx/17xx、STM32F42xxx 和 STM32F43xxx 构成一个微 控制器系列,各产品具有不同的存储器大小、封装和外设。有关订购信息以及器件的机械与电气特性,请参见数据手册。有关 ARM Cortex™-M4F 内核的信息,请参见《Cortex™-M4F 技术参考手册》。

大中型超市收银系统(可直接运行)

光步前台收银系统系统功能:商品销售、商品退货、挂单、收银员权限、会员销售、单品取消、整单取消、商品查询、脱机销售、脱机数据上传,基本资料下载,开钱箱、小票打印、收款结算,支持多币种付款方式(现金、储值卡、礼券、微信等),支持多种促销。运行环境:.net 4.0登陆信息用户名:1001 密码:123456内置商品信息,商品编码可输入00001000 - 00010000,测试效果相关功能键F5 结算 F9挂单 F11商品查询 F8退货 Insert单品取消 Del整单取消 F12开钱箱F2 会员 Ctrl+Z退出系统 Home 锁屏 相关源码待公开

信息隐藏-空域隐藏-python-LSB

LSB 中文名字全称为最低有效位。 常见的信息隐藏图片格式一般为png或者bmp这类无损压缩的图片且是8位图或者24位图,8位图是使用我们的调色板 来保存颜色值,可以正好代表2的8次方256种颜色。8位即占一个字节,24位图及占3字节,我们用r,g,b来表示。 对于这些字节的最后一位我们无论其是0或者1,这于这张照片的显示来说,我们从肉眼是分辨不出来的(实际上,最后3位我们都可以进行改变且我

mynd天堂 6091

信息隐藏——MATLAB之基本操作实验

实验一:MATLAB基本操作实验 【实验目的】: 1.熟悉matlab基本功能; 2.熟悉matlab对图片矩阵的操作; 3.实现LSB信息隐藏 【实验内容】: ■一、图像翻转 ■二、LSB的顺序嵌入和提取 ■三、LSB的随机嵌入和提取 一.图像翻转 1)使用库函数imread()读取图片; 2)提取图片size:h,w,ch(高度,宽度,通道数); 3)初始化旋转之后的图片矩阵; 4)根据旋转的特点,将矩阵中的值根据向量旋转的特点赋给新矩阵; pp = round(R*(p-c)+c); 5)选择区域进行

HizT_1999的博客 2277

信息隐藏与数字水印实验2-WAV 音频的 LSB 信息隐藏

一、 实验目的 了解WAV文件格式,掌握利用WAV格式音频文件实现LSB信息隐藏原理,设计并实现一种基于WAV文件的LSB信息隐藏算法,同时自行练习设计实现一种次第有效位的音频隐写算法。 了解归一化相关系数NC的原理,利用NC对嵌入的水印图像和提取的图像水印进行比较。二、 实验环境 (1)Windows或Linux操作系统 (2)Python3环境 (3)Python的wave、numpy、matplotlib、opencv-python库 (4)wave 音频文件和二值水印图像文件三、 实验要求 (1)利

taylorswift的博客 4601
上一篇: WIN7下 QT中文乱码问题
下一篇: ZRB老师上课讲的一些开发技巧
saro21
博客等级 码龄15年 5粉丝 17原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值