使用 Visual Studio 2012 进行隐写术编程(No-Steganography 范式)
一种无噪声隐写术范式,用于通过 Excel 图形秘密传输消息。
1. 范围
本项目旨在创建一个简单而简洁的隐写术应用程序,使用户能够将消息隐藏在看似“枯燥”的数据中。这样,监视你的“竞争对手”(或间谍……)将无法注意到该消息,你的极其宝贵的秘密将是安全的。为了使应用程序尽可能简单,使用了通用技术来创建它。
2. 关于隐写术
隐写术是隐藏秘密通信存在的科学艺术。一般来说,隐写术方法将消息隐藏在载体(例如,文本、图像、音频文件等)中,使其看起来无害,从而不会引起怀疑。从根本上说,隐写术的目标不是阻止对手解码隐藏的消息,而是阻止对手怀疑秘密通信的存在。
隐写术有许多类型。举例来说:
- 文本隐写术可以分为文本格式操作(TFM)和文本伪造(TF)。在 TFM 中,比较原始文本和修改后的文本将揭示隐藏的消息。另一方面,文本伪造技术通过生成完整的文本载体,采用空密码和模仿函数等方法,或者使用 NICETEXT 和 SCRAMBLE、基于翻译的技术等方法来处理现有文本来隐藏消息。
- 图像隐写术基于操纵数字图像来隐藏消息。这种操作通常会将消息视为噪声。
- 音频载体也得到了探索。音频隐写术技术的例子包括 LSB、扩频编码、相位编码和回声隐藏。
然而,当代的隐写术方案要么在用作载体的原始文档中引入噪声,要么在数据隐藏过程中利用噪声。这会带来各种问题,以及对手能够通过各种技术(例如,通过分析图像并发现你放入其中的“噪声”)检测到消息的危险。例如,图像隐写术存在一些问题,如失真可能性、可嵌入消息的大小限制很大以及通过当代图像处理技术检测的漏洞增加。
这就是为什么开发了新的无噪声隐写术方法。 Nostega 将数据隐藏在一个看起来合法的隐写术载体中,该载体与其他普通材料一样。然后,通过已建立的秘密通道(例如,发送者和接收者之间合法且无辜的关系)传输载体。
这是一个无噪声隐写术(Nostega)范式。
我用来实现这一点的方法称为GraphStega:Graph Steganography Methodology (Graphstega) 是在秘密通信中避免引起怀疑的科学和艺术,通过将消息隐藏在一种新颖的载体类型中,即图载体。我们将使用一个简单的 Excel 图来完成此操作。
Nostega 的其他方法包括:
- 国际象棋隐写术方法(Chestega)利用国际象棋、跳棋、填字游戏、多米诺骨牌等流行游戏来嵌入数据到隐写术游戏载体中。
- 基于自动笑话生成的隐写术(Jokestega)。谁不讲笑话?显而易见的答案是没有人。然而,当有人开玩笑时,什么都可以说。这合法化了基于笑话的隐写术的使用。Jokestega 方法利用自动笑话生成(AJG)技术的最新进展来自动化文本隐写术载体的生成。
- 基于摘要的隐写术方法(Sumstega)利用自动摘要技术的最新进展来生成文本载体[23,34]。Sumstega 不利用噪声(错误)来嵌入消息,也不产生可检测的噪声。相反,它利用自动摘要技术输出之间的差异来隐藏数据。
- 等等……
[来源:“无噪声隐写术:秘密通信的关键”,作者:Abdelrahman Desoky,Auerbach Publications © 2012]
3. 应用程序描述
该应用程序包含两种主要功能
1. 将输入的文本消息隐藏到 Excel 图中。[发送消息]
2. 从 Excel 图(以前由应用程序生成)中读取信息以破译隐藏的消息。[接收消息]
3.1 发送消息
要发送消息,用户必须首先将其输入到可用的文本框中。然后,他只需按下“Hide message in Graph”按钮。
发生这种情况时,程序将执行以下操作:
1. 它会创建一个新的 Excel 文件。
Excel.Application xlApp;
Excel.Workbook xlWorkBook;
Excel.Worksheet xlWorkSheet;
object misValue = System.Reflection.Missing.Value;
xlApp = new Excel.Application();
xlWorkBook = xlApp.Workbooks.Add(misValue);
xlWorkSheet = (Excel.Worksheet)xlWorkBook.Worksheets.get_Item(1);
2. 它会逐个读取消息中的每个字母。
3. 获取该字母的 ASCII 码值。
4. 将该值存储在 Excel 文件中的图表中。
Byte[] encodedBytes = ascii.GetBytes(userMessage);
// Store the ASCII value of each letter of the message as "data" in the Excel graph
foreach (Byte b in encodedBytes)
{
xlWorkSheet.Cells[rowCounter, 1] = generalCounter.ToString();
xlWorkSheet.Cells[rowCounter, 2] = b.ToString();
rowCounter++;
generalCounter++;
}
这样,消息就实际隐藏在图表的数据中,如下图所示。
然后程序保存文件,“隐写术”操作即完成。
如果有人看到 Excel 文件,他们只会“看到”一个看似“无害”的图表,显示博客的页面浏览量统计数据(顺便说一句,Harmonia Philosophica 是我的哲学博客——如果哲学是你的兴趣,不妨看看……)。谁会在乎?
对吗?
错了!
3.2 接收消息
重要消息的接收者会关心!
他要做的就是在程序所在的同一目录中放置文件并执行程序,即可读取隐藏的消息。
然后应用程序将:
1. 打开 Excel 文件。
2. 读取图表中的值(这些是之前存储的 ASCII 值)。
// Read the Excel file (from current directory)
var fileName = string.Format("{0}\\fileNameHere", Directory.GetCurrentDirectory());
var connectionString = string.Format("Provider=Microsoft.Jet.OLEDB.4.0; data source={0}; Extended Properties=Excel 8.0;", "skakos-steganography.xls");
var adapter = new OleDbDataAdapter("SELECT * FROM [Sheet1$]", connectionString);
var ds = new DataSet();
// Put all data of the Sheet into a data table
adapter.Fill(ds, "anyNameHere");
DataTable data = ds.Tables["anyNameHere"];
3. 从 ASCII 值创建相应的字符。
for (counter = 0; counter < data.Rows.Count; counter++)
{
valueReadFromExcel = data.Rows[counter][1].ToString();
MessageBox.Show(string.Concat("Reading inside Excel: ", valueReadFromExcel));
asciiValue = Int32.Parse(data.Rows[counter][1].ToString());
completeMessageDecoded = string.Concat(completeMessageDecoded, Convert.ToChar(asciiValue).ToString());
MessageBox.Show(string.Concat("Message up to now is: ", completeMessageDecoded));
}
4. 将破译的消息呈现给用户。
代码非常简单直观。
它有注释,尽管不太需要。
4. 可能的改进
使用 ASCII 值是一种非常简单的方法,也是出于教育目的。
程序可以改进其将数据编码到 Excel 文件中的方式。
例如,它可以某种算法来更改 ASCII 值,以避免轻易检测。例如,它可以将这些 ASCII 值转换为其他东西,通过获取消息的二进制值(目前为教育目的显示在消息框中),然后将该二进制值分成 7 个字符的段,然后使用这些值来创建 Excel 图。
可能性是无限的。
历史
文章第一版发布时间:2012 年 9 月。