?? lsbencrypt.cs
字號:
?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.Position = 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();
}
}
}
?? 快捷鍵說明
復制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -