?? lsbdecrypt.cs
字號:
?using System;
using System.Collections.Generic;
using System.Text;
using System.IO;
namespace LSB_Algorithm
{
class LSBDecrypt
{
//偽裝圖片的路徑
private string _camouflagePicPath = null;
//還原出的隱藏信息的保存路徑
private string _infoSavePath = null;
//偽裝圖片的文件流
private FileStream _camouflageStream = null;
//還原出的隱藏信息的文件流
private FileStream _infoSaveStream = null;
/// <summary>
/// LSBDecrypt的構造函數
/// </summary>
/// <param name="path1">偽裝圖片的路徑</param>
/// <param name="path2">還原出的隱藏信息的保存路徑</param>
public LSBDecrypt(string path1, string path2)
{
_camouflagePicPath = path1;
_infoSavePath = path2;
}
/// <summary>
/// 從偽裝圖片的第55至第66字節中提取出隱藏信息的長度
/// </summary>
/// <returns>隱藏信息長度</returns>
private int GetInfoLength()
{
_camouflageStream = new FileStream(_camouflagePicPath, FileMode.Open, FileAccess.Read);
//將文件流定位到第55個字節處
_camouflageStream.Position = 54;
//讀取包含隱藏信息長度的12個字節塊
byte[] lengthBlock = new byte[12];
_camouflageStream.Read(lengthBlock, 0, lengthBlock.Length);
//提取LSB
byte[] lengthBitArray = ExtractHidingBits(lengthBlock);
//還原出整型長度值
int len = lengthBitArray[0] * 65536 + lengthBitArray[1] * 256 + lengthBitArray[2];
//如果長度不正確表明該圖片不含有隱藏信息,此檢測LSB方法不能適用于所有情況,具體的檢測算法未知
if (len <=0 || len > (_camouflageStream.Length - 54) / 4 - 3)
{
_camouflageStream.Close();
return -1;
}
return len;
}
/// <summary>
/// 利用位操作提取偽裝文件流中每12字節的LSB位
/// </summary>
/// <param name="arr">長度為12的字節數組,含有隱藏信息</param>
/// <returns>從12字節塊中提取出的3字節隱藏信息</returns>
private byte[] ExtractHidingBits(byte[] arr)
{
//用于存放從12個字節塊中提取出來的3個字節的隱藏信息
byte[] buf = new byte[3];
//24個bit位的處理
buf[0] = (byte)((arr[0] & 2) == 0 ? (buf[0] & 127) : (buf[0] | 128)); //a7
buf[0] = (byte)((arr[0] & 1) == 0 ? (buf[0] & 191) : (buf[0] | 64)); //a6
buf[0] = (byte)((arr[1] & 1) == 0 ? (buf[0] & 223) : (buf[0] | 32)); //a5
buf[0] = (byte)((arr[2] & 4) == 0 ? (buf[0] & 239) : (buf[0] | 16)); //a4
buf[0] = (byte)((arr[2] & 2) == 0 ? (buf[0] & 247) : (buf[0] | 8)); //a3
buf[0] = (byte)((arr[2] & 1) == 0 ? (buf[0] & 251) : (buf[0] | 4)); //a2
buf[0] = (byte)((arr[3] & 2) == 0 ? (buf[0] & 253) : (buf[0] | 2)); //a1
buf[0] = (byte)((arr[3] & 1) == 0 ? (buf[0] & 254) : (buf[0] | 1)); //a0
buf[1] = (byte)((arr[4] & 1) == 0 ? (buf[1] & 127) : (buf[1] | 128)); //b7
buf[1] = (byte)((arr[5] & 4) == 0 ? (buf[1] & 191) : (buf[1] | 64)); //b6
buf[1] = (byte)((arr[5] & 2) == 0 ? (buf[1] & 223) : (buf[1] | 32)); //b5
buf[1] = (byte)((arr[5] & 1) == 0 ? (buf[1] & 239) : (buf[1] | 16)); //b4
buf[1] = (byte)((arr[6] & 2) == 0 ? (buf[1] & 247) : (buf[1] | 8)); //b3
buf[1] = (byte)((arr[6] & 1) == 0 ? (buf[1] & 251) : (buf[1] | 4)); //b2
buf[1] = (byte)((arr[7] & 1) == 0 ? (buf[1] & 253) : (buf[1] | 2)); //b1
buf[1] = (byte)((arr[8] & 4) == 0 ? (buf[1] & 254) : (buf[1] | 1)); //b0
buf[2] = (byte)((arr[8] & 2) == 0 ? (buf[2] & 127) : (buf[2] | 128)); //c7
buf[2] = (byte)((arr[8] & 1) == 0 ? (buf[2] & 191) : (buf[2] | 64)); //c6
buf[2] = (byte)((arr[9] & 2) == 0 ? (buf[2] & 223) : (buf[2] | 32)); //c5
buf[2] = (byte)((arr[9] & 1) == 0 ? (buf[2] & 239) : (buf[2] | 16)); //c4
buf[2] = (byte)((arr[10] & 1) == 0 ? (buf[2] & 247) : (buf[2] | 8)); //c3
buf[2] = (byte)((arr[11] & 4) == 0 ? (buf[2] & 251) : (buf[2] | 4)); //c2
buf[2] = (byte)((arr[11] & 2) == 0 ? (buf[2] & 253) : (buf[2] | 2)); //c1
buf[2] = (byte)((arr[11] & 1) == 0 ? (buf[2] & 254) : (buf[2] | 1)); //c0
return buf;
}
/// <summary>
/// 執行信息提取操作
/// </summary>
/// <returns>執行成功返回true,失敗返回false</returns>
public bool ExecuteDecrypt()
{
int infoLen = GetInfoLength();
if (infoLen == -1)
{
return false;
}
_infoSaveStream = new FileStream(_infoSavePath, FileMode.Create, FileAccess.Write);
//置文件流位置
_camouflageStream.Position = 66;
_infoSaveStream.Position = 0;
//計算循環次數
int cycle = (infoLen % 3 == 0) ? (infoLen / 3) : (infoLen / 3 + 1);
//按12字節一組每次提取3個字節的隱藏信息并寫入文件
for (int i = 0; i < cycle; i++)
{
byte[] contentBlock = new byte[12];
_camouflageStream.Read(contentBlock, 0, contentBlock.Length);
byte[] contentBitArray = ExtractHidingBits(contentBlock);
_infoSaveStream.Write(contentBitArray, 0, contentBitArray.Length);
}
_infoSaveStream.Flush();
_camouflageStream.Close();
_infoSaveStream.Close();
return true;
}
}
}
?? 快捷鍵說明
復制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -