如何使用C#隐藏mp3数据帧中的数据

时间:2010-12-22 07:37:59

标签: c# mp3 steganography

读取标题成名后,数据帧开始,我想知道mp3播放器读取的数据帧大小是什么,这样如果我改变每帧的单个位而不会对文件的声音造成太大影响,如何更改单个位(最后一位),因此在C#中效果最小。 请帮帮我

3 个答案:

答案 0 :(得分:3)

您正在寻找的技术称为'steganography'.

这不是C#(这比人们想象的复杂得多),但是this is related.。您可能希望使用p / invoke使用它,或将其移植到C#代码中。

答案 1 :(得分:0)

我也正在开展一个类似的项目......首先你必须了解mp3文件结构...我希望this link可以帮助你解决mp3文件结构......一旦你清楚了关于文件结构你自己编写代码很容易...将mp3文件作为流文件并从中提取每一帧(一旦你了解了mp3文件结构,这应该很简单...事实上,它只需要几个小时让我写一个代码来做那个)...以及关于你的算法的建议。一个5 MB的mp3文件或多或少有15,000个帧......所以,如果你想要每帧替换一个位,你可以存储的最大数据是2KB ......

我尝试过相同的但我每帧更改了一个BYTE ...这会在生成的文件中引入一些噪音...有关如何降低噪音的任何建议......!?!?!??希望我的回答可以帮助你...... :)

答案 2 :(得分:0)

我能够弄清楚并想出了我自己的算法,Rzr你所说的是对的。

mp3文件是高度压缩的文件,任何帧中的任何位变化都会引入巨大的噪音。

有办法解决这个问题,

Soln_1: Hide the text data and in any of the bit of each byte and reconstruct the frame using humming code 

Soln_2: which i was able to do it, using Layer III, BitRate=128000, SampleRate=441000, Padding=0

缺点:文件大小会因非预期用户无法预测而增加,除非他拥有原始mp3文件的确切副本。

能够实现:没有噪音我能够在3mb mp3文件中隐藏高达5kb的文本数据

解决方法

step1: scan every 8 bytes in each frame
step2: take a 8 bits from the text data

预先定义每个框架中每个文本数据位置的位置,例如:第四个位置。

step3:  check every 4th bit location of each byte of the frame is same as the each bit of the text data are same

例如为: 文本数据一个字节为01110001

来自mp3数据帧的第1个8字节

byte_1: 01101111 -->4th location bit is 0
byte_2: 01111111 -->4th location bit is 1
byte_3: 01111001 -->4th location bit is 1
byte_4: 01111011 -->4th location bit is 1
byte_5: 01100011 -->4th location bit is 0
byte_6: 01101100 -->4th location bit is 0
byte_7: 01101011 -->4th location bit is 0
byte_8: 01110011 -->4th location bit is 1

所以这个字节来自帧,每个4th位的位置都有与文本数据位相同的位。

Step4: note down the location of the byte in the mp3 data frame, in this case its "1" that is 1st location

如果来自mp3数据帧的字节与数据位不匹配,则跳过该字节并继续下一个字节,继续执行相同操作直到隐藏整个文本数据。

Step5:now take all the locations where the text data is present and add these as a byte to the data frame of mp3.

这是我能够成功实施的一个解决方案。