Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Add base carrier data support? #3

Open
jabbany opened this issue May 31, 2014 · 20 comments
Open

Add base carrier data support? #3

jabbany opened this issue May 31, 2014 · 20 comments

Comments

@jabbany
Copy link
Contributor

jabbany commented May 31, 2014

隐写一般要有载体数据,一个看起来比较正当的含有杂质的数据流。现在LVDO仅仅是把文件DCT重排到了视频里面,下一步是不是要加入数据载体。

比如提供一个视频,然后把数据载在看似正当的视频上。

@m13253
Copy link
Owner

m13253 commented Jun 1, 2014

如果是那样的话,数据量非常大。
建议看看 Video Steganography with Perturbed Motion Estimation.pdf,一帧只能存几个字节。

现在的lvdo实现在100%还原的情况下数据量会增加3倍,已经不让我满意了。

我的目的不是让别人看不出来我在存东西,而是让视频过审核。

先close了。如果有异议你可以再open。

@m13253 m13253 closed this as completed Jun 1, 2014
@m13253 m13253 added question and removed question labels Jun 1, 2014
@jabbany
Copy link
Contributor Author

jabbany commented Jun 1, 2014

我觉得这样不好,没有隐写就没有意义了,完全可以生成一个基础key图片,然后把每一帧的颜色(HSV或者RGB)对Key的每一个像素做XOR,也能产生出抗压的乱码图片(压缩只干扰色彩还原)。视频审查完全可以见到这种类似乱码的视频立刻删掉。现在做DCT不是真正的加密,而是一种混乱化编码 (Obfuscation)。

不过要是能载到一个已有的视频上,让视频本身看起来好像没压缩好,那么被删可能性会大大降低。我认为既然说要做Steganography就好好做咯。。。Obfuscation真的不难。把视频切成小方框重新排列都可以让人看不出原来的内容╮(╯_╰)╭还是线性映射抗干扰很高。。。

有关数据量我觉得首先声音和视频并用,加上error checking和LSB校验应该很好,用DCT载主要的视频图像块(类似JPEG压缩可以不断清晰化的解码),然后通过LSB增加画面细节。二压的话LSB就没了,但是还能保证粗略低分辨率视频。

@m13253
Copy link
Owner

m13253 commented Jun 1, 2014

我想到一个兼容现有实现的方法。

LVDO 有两个参数:--qmin 和 --qmax。可以调整好这两个参数让 LVDO 只使用 DCT 中高频部分。低频部分使用别的画面。而解码器仍然可以直接解码。但是不太好绕过 me,只能自己指定 merange=0。这样的效果大概就和低质量 JPEG 差不多。

事实上音频的话,你不了解编码器对相位的处理。听说 MP3 也是使用 DCT的,AAC 和 OGG/Vorbis 是使用我不熟悉的小波变换。可以保证频率和振幅,不能保证相位。这样一样只能使用 FM 和 AM,不能使用 QAM,效率很低。所以在有限的码率下只用视频就够了。音频随便填点东西。

还有你把问题想得太简单了。LSB 会挂得很惨,尤其是走 H.264 一趟。重新排列会死在 me。

LVDO 还没有在 H.265 上测试,其中一个原因是我不熟悉的小波变换。战 YouTube 要考虑 VP9,VP9 是用 DCT + DST 的听说,会陨 LVDO 的相位。

@m13253 m13253 reopened this Jun 1, 2014
@m13253
Copy link
Owner

m13253 commented Jun 1, 2014

你给我的音频加密的三种方式。

首先,LSB 编码相当于加上一个振幅为 1/65536,频率为 22050Hz 或其约数的高频正弦波。如此高的频率在压缩的时候丝毫不剩。

相位编码我上一帖已说了。你我都不了解编码器对相位的处理。

回音编码,在 OGG/Vorbis 上会挂得很惨,因为 Vorbis 的 pre-echo 效应。YouTube 的音频有 AAC-LC、OGG/Vorbis、OGG、OPUS 的。只要会挂就不是好方案。

@m13253
Copy link
Owner

m13253 commented Jun 1, 2014

而且,LVDO 有一个黑白模式,就是只使用 Y 通道,UV 全部填 0x80。当然可以有一个只使用 UV 的模式。这样 Y 通道填别的视频。

这是第一点。第二点是 LVDO 可以不使用低频部分(--qmin),把低频让给别的视频用。由其是 DCT 的 0 号系数,是 8x8 格的亮度、色度平均值。即使是只使用这个系数,就可以让只看缩略图的审查者看不出破绽了。

但是,LVDO 的目的不是仅仅混淆视频,而是混淆任意数据。当然,媒体文件为主。正因为这样,吞吐量要非常大才可以。我目前的测试是,一个 480p 的视频至少要 720p 1Mbps 同等时长,才可以正确编码。大概编码后的文件大小是原来的 3~8 倍。所以和一般的隐写不同,LVDO 更追求吞吐量,所以不太有空间用来放一个明文的画面了。

总之,LVDO 也只是提供一个机制,而不是实现。LVDO 很多地方都没有优化,但是在目前的情况下来看,速度也够了。如果你有兴趣可以自己制作兼容或不兼容的、更快或更好的实现。

@jabbany
Copy link
Contributor Author

jabbany commented Jun 1, 2014

现在主要问题是没有底层的衬托视频就没意义了。反正都是产生乱码,把数据扔到MSB都可以。 DCT的意义不就是载到已有信号上,把隐藏的数据扔到噪音里同时让噪音可压缩。

@m13253
Copy link
Owner

m13253 commented Jun 1, 2014

所以,用-qmin限制中高频就好了。
而且扔到MSB是没有那么高的吞吐量的。

@jabbany
Copy link
Contributor Author

jabbany commented Jun 1, 2014

填入别的视频要是也能通过一个stream流进去就可以了。。。我对C苦手没办法。希望LVDO能支持读取一个named pipe读入raw视频和文件一起压。

我是改不出的,但是那样作用会大很多。

@jabbany
Copy link
Contributor Author

jabbany commented Jun 1, 2014

我以前有一个叫HMShuffle的程序会把视频的每一帧切成20x20的方块,根据一个key重新排列,然后产生输出。也能耐压缩无非是压缩后还原就在格子边框有损伤。但是一直不能解的就是载到载体视频上。

我觉得LVDO的专注目标应该是利用DCT载到任意一个载体视频上,那样功用就比传统obfuscation大很多了。

@m13253
Copy link
Owner

m13253 commented Jun 1, 2014

我的意思是,让 LVDO 的这个实现变成一个 Reference Implementation 好了,保证 100% 正确,别的实现可以有优化,比如针对优酷和 YouTube 以及渣浪(是唯一可以自己压制的)的不同优化。

我在 #4 里提到说要在 LVDO Transport Layer 上建一个 Transmission Control Layer。

我是想再建立一个实现。把这些功能在那里完成。

@m13253
Copy link
Owner

m13253 commented Jun 1, 2014

我以前有一个叫HMShuffle的程序会把视频的每一帧切成20x20的方块,根据一个key重新排列,然后产生输出。也能耐压缩无非是压缩后还原就在格子边框有损伤。但是一直不能解的就是载到载体视频上。

格子边框损伤的原因是你切的是 20x20 而不是 16x16……哈哈哈哈哈

@jabbany
Copy link
Contributor Author

jabbany commented Jun 1, 2014

我是想再建立一个实现。把这些功能在那里完成。

也好。不过总觉得双输入的合并应该LVDO归这部分,协议主要保证数据损失恢复就好了。

格子边框损伤的原因是你切的是 20x20 而不是 16x16……哈哈哈哈哈

我写那个的时候差不多是写hmode那个文章之后不久。。。比较naive啦。。。不过好处是canvas也能很好的支持。。。就是不容易过审核。。。

@m13253
Copy link
Owner

m13253 commented Jun 1, 2014

协议还要管优酷水印的问题啊。说白了就是绕过水印的区域。

总之在短期内打算对现有的 LVDO 找 bug。保证 bitstream freeze 之后才开新的实现。
BBC 的 Dirac 编码器的 libschrodinger 也是在 libdirac 写好之后才开始的啦。

@m13253 m13253 removed the wontfix label Jun 1, 2014
@m13253
Copy link
Owner

m13253 commented Jun 1, 2014

因为我和你那个 H-Mode 以及 HMShuffle 的出发点不同。你是加密模拟数据,我是加密数字数据。数字数据很容易受悬崖效应的影响。所以对于流量的控制要更复杂。但是更灵活,也很不错了。

话说你 C 语言苦手,那么你擅长什么语言呢?下一个实现要么换语言?(但是 FFT 库就没有现成的咯)

@jabbany
Copy link
Contributor Author

jabbany commented Jun 1, 2014

嘛我觉得现在这个实现也挺好。。。别的语言没有这么高的效率估计做不了流处理器。
上层协议的话用Python估计比C好对付。Python有对fftw3的接口。

@m13253
Copy link
Owner

m13253 commented Jun 3, 2014

我想到一个问题,如果 carrier data 用动态画面的话,可能会触发 x264 的 motion estimation。如果是自己压制还好,上传优酷的话就不好说了。

我的想法是用静态的,比如10秒一换的图片,配上音乐,设置合适的 --qmin 和 --qmax。让视频看起来是配乐图片幻灯一样。当然不能这么死板,在这么个架构的基础上可以发挥很大的想象空间。

@jabbany
Copy link
Contributor Author

jabbany commented Jun 3, 2014

有道理,换图的时候会不会触发运动检测?其实我都不知道那些网站是怎么处理的,不过据说有招数避免被二压?好像如果你视频本身就符合某个拟定帧率什么的。。。(不清楚

说不定可以用后黑技术之类的。。。

@m13253
Copy link
Owner

m13253 commented Jun 3, 2014

有道理,换图的时候会不会触发运动检测?其实我都不知道那些网站是怎么处理的,不过据说有招数避免被二压?好像如果你视频本身就符合某个拟定帧率什么的。。。(不清楚

说不定可以用后黑技术之类的。。。

我前几天查了相关资料。YouTube 一定 会二压,无法避免。优酷会加水印,怎么可能不二压?
而且视频网站的压制参数都很低。YouTube是 High@L2.2 虽然码率很高(高你妹,卡爆了)但是效率很低。这对lvdo要求就更高了。

@m13253
Copy link
Owner

m13253 commented Jun 13, 2014

换图的时候会不会触发运动检测

其实是只有换图的时候才没有运动检测。你对 H.264 了解太少。

而且 H.264 是基于频域的,所以什么 LSB MSB 这样基于时域的是会失败的。

@m13253
Copy link
Owner

m13253 commented Mar 8, 2016

你还在关注这个项目吗?最近这几天似乎很多外国人开始关注这个项目。

我是没有时间继续开发了。但是如果你想实现数据载体,给你一个提示(不需要使用 DCT 变换的,但是能达到比较“能用”的结果):

  1. 载体视频每 8x8 像素,取平均值(相当于只保留 DCT 结果数组的 [0, 0] 位)
  2. LVDO 的 --qmin 参数使用比 0 大的值
  3. 把 LVDO 的输出和取平均值之后的视频相加起来
  4. 尽量让帧率低,比如图片幻灯片,而不是动图

更好的方法是第一步用真正的 DCT 来替代取平均,这样你可以利用 [0, 0] 之外的数据。

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Projects
None yet
Development

No branches or pull requests

2 participants