LSB算法分析

kingofpopisnn 2011-06-15 09:42:58
using System;
using System.Collections.Generic;
using System.Text;
using System.IO;

namespace LSB_Algorithm
{
class LSBEncrypt
{
//原始图片路径
private string _originalPicPath = null;
//隐藏信息路径
private string _hidingInfoPath = null;
//原始图片的文件流
private FileStream _picStream = null;
//隐藏信息的文件流
private FileStream _infoStream = null;

/// <summary>
/// LSBEncrypt类的构造函数
/// </summary>
/// <param name="path1">原始图片路径</param>
/// <param name="path2">隐藏信息的路径</param>
public LSBEncrypt(string path1, string path2)
{
_originalPicPath = path1;
_hidingInfoPath = path2;
}

/// <summary>
/// 将长整型数转换为24位二进制表示的字节数组
/// </summary>
/// <param name="x">要转换的长整型数,这个数的大小不会超过2的24次方</param>
/// <returns>二进制表示的字节数组</returns>
private byte[] ConvertToBinaryArray(long x)
{
byte[] binaryArray = new byte[24];
for (int i = 0; i != 23; i++)
{
binaryArray[23 - i] = (byte)(x & 1);
x = x >> 1;
}
return binaryArray;
}

/// <summary>
/// 将3个字节的字节数组转换为24位(8bit * 3)二进制表示的字节数组
/// </summary>
/// <param name="array">长度为3的字节数组</param>
/// <returns>二进制表示的字节数组</returns>
private byte[] ConvertToBinaryArray(byte[] array)
{
byte[] binaryArray = new byte[24];
int a = array[0];
int b = array[1];
int c = array[2];
for (int i = 0; i != 8; i++)
{
binaryArray[7 - i] = (byte)(a & 1);
a = a >> 1;
}
for (int i = 0; i != 8; i++)
{
binaryArray[15 - i] = (byte)(b & 1);
b = b >> 1;
}
for (int i = 0; i != 8; i++)
{
binaryArray[23 - i] = (byte)(c & 1);
c = c >> 1;
}
return binaryArray;
}

/// <summary>
/// 将图像的第55至第66字节的LSB替换为隐藏信息文件的长度
/// </summary>
private void HideInfoLength()
{
byte[] picBlock = new byte[12];
//读取原始图像的第55至第66字节的内容块
_picStream.pPosition = 54;
_picStream.Read(picBlock, 0, picBlock.Length);
byte[] lenArray = ConvertToBinaryArray(_infoStream.Length);
//置入隐藏文件的长度信息
int index = 0;
for (int i = 0; i < 4; i++)
{
//置a7,a6位
picBlock[i * 3] = (byte)((lenArray[index++] == 0) ? (picBlock[i * 3] & 253) : (picBlock[i * 3] | 2));
picBlock[i * 3] = (byte)((lenArray[index++] == 0) ? (picBlock[i * 3] & 254) : (picBlock[i * 3] | 1));
//置a5位
picBlock[i * 3 + 1] = (byte)((lenArray[index++] == 0) ? (picBlock[i * 3 + 1] & 254) : (picBlock[i * 3 + 1] | 1));
//置a4,a3,a2位
picBlock[i * 3 + 2] = (byte)((lenArray[index++] == 0) ? (picBlock[i * 3 + 2] & 251) : (picBlock[i * 3 + 2] | 4));
picBlock[i * 3 + 2] = (byte)((lenArray[index++] == 0) ? (picBlock[i * 3 + 2] & 253) : (picBlock[i * 3 + 2] | 2));
picBlock[i * 3 + 2] = (byte)((lenArray[index++] == 0) ? (picBlock[i * 3 + 2] & 254) : (picBlock[i * 3 + 2] | 1));
}
//将原始文件流重定位到第55字节处并将已嵌入长度信息的12字节块写回
_picStream.Position = 54;
_picStream.Write(picBlock, 0, picBlock.Length);
_picStream.Flush();
}

/// <summary>
/// 将隐藏信息以每3个字节写入原始图像从第67字节开始的每12字节块的LSB中
/// </summary>
private void HideInfoContent()
{
int readCnt = 0;
//计算循环处理的次数
long infoLen = _infoStream.Length;
int cnt = (int)(infoLen % 3 == 0 ? infoLen / 3 : infoLen / 3 + 1);
_picStream.Position = 66;
for (int i = 0; i < cnt; i++)
{
//每次循环读取BMP图像的下一个12字节的内容
byte[] picBlock = new byte[12];
readCnt = _picStream.Read(picBlock, 0, picBlock.Length);
//读取待隐藏信息的下一个3字节内容
byte[] readBuffer = new byte[3];
_infoStream.Read(readBuffer, 0, readBuffer.Length);
byte[] infoBlock = ConvertToBinaryArray(readBuffer);
//置位操作
int index = 0;
for (int ii = 0; ii < 4; ii++)
{
//置a7,a6位
picBlock[ii * 3] = (byte)((infoBlock[index++] == 0) ? (picBlock[ii * 3] & 253) : (picBlock[ii * 3] | 2));
picBlock[ii * 3] = (byte)((infoBlock[index++] == 0) ? (picBlock[ii * 3] & 254) : (picBlock[ii * 3] | 1));
//置a5位
picBlock[ii * 3 + 1] = (byte)((infoBlock[index++] == 0) ? (picBlock[ii * 3 + 1] & 254) : (picBlock[ii * 3 + 1] | 1));
//置a4,a3,a2位
picBlock[ii * 3 + 2] = (byte)((infoBlock[index++] == 0) ? (picBlock[ii * 3 + 2] & 251) : (picBlock[ii * 3 + 2] | 4));
picBlock[ii * 3 + 2] = (byte)((infoBlock[index++] == 0) ? (picBlock[ii * 3 + 2] & 253) : (picBlock[ii * 3 + 2] | 2));
picBlock[ii * 3 + 2] = (byte)((infoBlock[index++] == 0) ? (picBlock[ii * 3 + 2] & 254) : (picBlock[ii * 3 + 2] | 1));
}
_picStream.Position -= readCnt;
_picStream.Write(picBlock, 0, picBlock.Length);
}
_picStream.Flush();
}

/// <summary>
/// 执行信息隐藏操作
/// </summary>
public void ExecuteEncrypt()
{
_picStream = new FileStream(_originalPicPath, FileMode.Open, FileAccess.ReadWrite);
_infoStream = new FileStream(_hidingInfoPath, FileMode.Open, FileAccess.Read);
HideInfoLength();
HideInfoContent();
_picStream.Close();
_infoStream.Close();
}
}
}

请教下面代码什么意思?
//置a7,a6位
picBlock[ii * 3] = (byte)((infoBlock[index++] == 0) ? (picBlock[ii * 3] & 253) : (picBlock[ii * 3] | 2));
picBlock[ii * 3] = (byte)((infoBlock[index++] == 0) ? (picBlock[ii * 3] & 254) : (picBlock[ii * 3] | 1));
//置a5位
picBlock[ii * 3 + 1] = (byte)((infoBlock[index++] == 0) ? (picBlock[ii * 3 + 1] & 254) : (picBlock[ii * 3 + 1] | 1));
//置a4,a3,a2位
picBlock[ii * 3 + 2] = (byte)((infoBlock[index++] == 0) ? (picBlock[ii * 3 + 2] & 251) : (picBlock[ii * 3 + 2] | 4));
picBlock[ii * 3 + 2] = (byte)((infoBlock[index++] == 0) ? (picBlock[ii * 3 + 2] & 253) : (picBlock[ii * 3 + 2] | 2));
picBlock[ii * 3 + 2] = (byte)((infoBlock[index++] == 0) ? (picBlock[ii * 3 + 2] & 254) : (picBlock[ii * 3 + 2] | 1));
...全文
392 3 打赏 收藏 转发到动态 举报
写回复
用AI写文章
3 条回复
切换为时间正序
请发表友善的回复…
发表回复
kingofpopisnn 2011-06-16
  • 打赏
  • 举报
回复
[Quote=引用 1 楼 gomoku 的回复:]
24bit的图像每个像素有红绿蓝RGB三个部分,每个部分使用一个字节,也就是8个二进制位。

根据人类视觉特点,人的眼睛对绿色最敏感,而对蓝色最不敏感。当某个像素的蓝色从252(1111,1100)改变为249(1111,1001),人眼不一定能感觉的到变化。

因此,可以从蓝色部分偷出最不明显的三个二进制位(即'置a4,a3,a2位')来储存所谓的隐藏信息,这就是LSB(Least Si……
[/Quote]
还有问题请教你 (picBlock[ii * 3 + 1] & 254) : (picBlock[ii * 3 + 1] | 1));
什么意思啊?
gomoku 2011-06-15
  • 打赏
  • 举报
回复
24bit的图像每个像素有红绿蓝RGB三个部分,每个部分使用一个字节,也就是8个二进制位。

根据人类视觉特点,人的眼睛对绿色最敏感,而对蓝色最不敏感。当某个像素的蓝色从252(1111,1100)改变为249(1111,1001),人眼不一定能感觉的到变化。

因此,可以从蓝色部分偷出最不明显的三个二进制位(即'置a4,a3,a2位')来储存所谓的隐藏信息,这就是LSB(Least Significant Bit)。同理,从红色和绿色部分还能各偷出2个和1个位置。
kingofpopisnn 2011-06-15
  • 打赏
  • 举报
回复
谢谢 还有问题请教 可以吗?
内容概要:本文围绕“可再生能源发电与电动汽车的协同调度策略”展开硕士论文级别的研究与复现工作,基于Matlab平台构建了高比例可再生能源接入背景下电力系统与电动汽车(EV)之间的多时间尺度协同优化模型。研究重点在于应对风光发电不确定性,充分利用电动汽车作为移动储能单元的灵活充放电能力(含V2G技术),实现电网削峰填谷、提升新能源消纳效率与系统运行经济性。文中综合考虑了异质电动车集群特性、V2G过程中的损耗约束以及随机因素影响,采用如深度确定性策略梯度(DDPG)强化学习、混合整数线性规划(MILP)等先进优化算法进行求解,并通过基准模型对比验证了所提自适应调度策略在提升电网稳定性、降低运行成本方面的有效性。; 适合人群:具备一定电力系统基础知识、优化理论背景及Matlab编程能力的研究生、科研人员,以及从事新能源并网、智能电网调度、车网互动(V2G)等方向的工程技术人员。; 使用场景及目标:①学习并复现已发表高水平硕士论文中的协同调度建模方法与仿真流程;②掌握将深度强化学习(如DDPG)应用于虚拟电厂、电动汽车集群调度等复杂非线性决策问题的技术路径;③为开展新能源消纳、需求侧响应、微电网优化运行等相关课题的研究提供可复用的代码框架与创新思路参考。; 阅读建议:建议读者结合文中提供的完整Matlab代码与技术文档,深入理解模型构建逻辑、算法实现细节与参数设置依据,优先在Simulink/Matlab环境中运行并调试仿真案例,通过调整场景参数与算法超参,探究不同策略对调度效果的影响,从而深化对协同调度机制与智能优化方法应用的理解。

111,129

社区成员

发帖
与我相关
我的任务
社区描述
.NET技术 C#
社区管理员
  • C#
  • Creator Browser
  • by_封爱
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

让您成为最强悍的C#开发者

试试用AI创作助手写篇文章吧