隐写术-数字水印的原理、实现及应用

导语

前段时间有一则阿里员工外泄信息被捕获的报道。大致内容是阿里的某位员工,在内部办公软件截图,使用PS工具修掉截图上的可见水印,然后传播出去,但阿里通过图片携带的不可见水印,解读了截图员工的员工编码,从而找到了泄漏图片的员工。一时间,图片的盲水印技术受到了广泛关注。本文针对盲水印技术,搜集有关它的基础原理,主要加密手段以及广泛的应用场景。

隐写术-隐藏你的信息

 


概述

数字水印(Digital Watermarking)技术是将一些标识信息(即数字水印)直接嵌入数字载体(包括多媒体、文档、软件等)当中,但不影响原载体的使用价值,也不容易被人的知觉系统(如视觉或听觉系统)觉察或注意到,只 有 通 过 专 用 的 检 测 器 或 阅读器才能提取。数字水印是一个崭新的信息隐藏技术,首次提出这个概念至今也不到20年。

衡量水印好坏的标准

  • 隐蔽性
    在数字作品中嵌入数字水印,不会引起明显的降质,并且不易被察觉。
  • 鲁棒性
    鲁棒性是指在经历多种无意或有意的信号处理过程后 ,数字水印仍能保持完整性或仍能被准确鉴别 。可以利用的信号处理过程包括信道噪 声 、滤 波 、数 /模 与 模 /数 转 换 、重 采 样 、剪 切 、位 移 、尺 度变化及有损压缩编码等 。

数字水印的分类

  • 按水印的特性
  • 鲁棒数字水印:要求嵌入的水印能够经受各种常用的编辑处理
  • 脆弱数字水印:需要对信号的改动足够敏感,是人们能够根据脆弱水印的状态判断出数据是否被篡改。
  • 按水印的检测过程
  • 明文水印:检测工程中,需要原始数据。普遍来讲,鲁棒性较之盲水印要好。
  • 盲水印:只需要秘钥,不需要原始数据
  • 按水印的内容
  • 有意义水印:水印是商标、音频片段等
  • 无意义水印:序列号,仅检测是否含水印
  • 按水印的隐藏位置
  • 空域
  • 频域
  • 时域

数字水印的技术实现

空域-LSB

LSB方法是最简单的嵌入水印的方法。事实上 ,任何一幅 图片都具备一定的容噪性 ,这表现在像素数据的最低有效位(Least Significant Bit,LSB)对 人 眼的视觉影响很 小,秘密信息就隐藏在图像每一个像素的最低位或次低位 ,实现其不 可见性。

相关帖子推荐

频域

将图片的灰度强弱,视为图片的频域。通过某种变换手段(傅里叶变换,离散余弦变换,小波变换等)将图像变换到频域(小波域),在频域对图像添加水印,再通过逆变换,将图像转换为空间域。相对于空域手段,频域手段隐匿性更强,抗攻击性更高。

相关帖子推荐

DCT

DCT以8x8的像素为单位进行,生成的是8x8的DCT系数数据块。DCT变换的最大特点是对于一般的图像都能够将像块的能量集中于少数低频DCT系数上,即生成8x8DCT系数块中,仅左上角的少量低频系数数值较大,其余系数的数值很小,这样就可能只编码和传输少数系数而不严重影响图像质量。

相关帖子推荐

小波变换

“小波”就是小区域、长度有限、均值为0的波形。小波变换就是选择适当的基本小波或母小波ψ(t),通过对基本小波的平移、伸缩而形成一系列的小波,这簇小波作为基可以构成一系列嵌套的(信号)子空间,然后将欲分析的信号(例如图像)投影到各个大小不同的(信号)子空间之中,以观察相应的特性。这样,就相当于我们用不同的焦距去观察一个物体,可从宏观到微观,从概貌到细节观察得十分详尽。所以小波变换又被称为“数学显微镜”。

相关帖子推荐

空域+频域

该算法通过混沌置乱水印图像,建立水印与载体数据之间的Hash单向映射函数,使用两种不同的嵌入方法,先后嵌入水印到空域和DFT域。水印被多次嵌入,实现了水印的盲提取。

相关帖子推荐

数字水印的应用场景

  • 多媒体作品盗版追溯:利用数字水印的不可见性,在不影响作品的情况下,加入版权信息的数字水印,可抗击拷贝,剪切。
  • 证件的防伪认证:如学历证,合同,票据等,携带数字水印后,可通过制定的方式提取水印,验证证件等数字文件是否被涂改;
  • 阿里事件:阿里追查泄密员工的时间本身,说明,水印可以有效的追溯信息的释放源;
  • 隐蔽信息传递:水印可携带加密信息后,藏在多媒体文件中传播,并通过特定的提取方式获取水印。可以作为一种隐蔽信息的通信方式。

 

出处:https://www.jianshu.com/p/08041bcf0f23

=======================================================================================

文件数字水印,附一种纯文本隐写术数字水印方法

数字水印(Digital Watermark)是一种在数字媒体文件中嵌入隐藏信息的技术。这些数字媒体可以是图片、音频、视频或文本等。数字水印不会对原始文件造成明显的视觉或听觉变化,但可以在一定程度上保护知识产权,追踪数据来源,或提供其他形式的认证和鉴别。

数字水印可以分为可见水印和不可见水印:

  1. 可见水印:这种水印是明显可见的,通常在图像的边缘或重要区域添加文字、图形或标志。可见水印通常用于版权信息或广告目的,并不用于隐藏机密信息。

  2. 不可见水印:不可见水印是嵌入在媒体文件的低频部分或不易察觉的细微改动。这种水印技术通常使用数字信号处理和加密算法,以确保水印在不损坏原始文件的情况下能够抵抗攻击。

数字水印的主要目的是:

  1. 版权保护:数字水印可以嵌入版权信息,使得如果有人在未经授权的情况下复制、传播或使用该文件,可以通过数字水印追踪到来源。

  2. 内容认证:数字水印可以用于验证内容的真实性和完整性。在数字内容传输中,接收者可以通过提取水印来验证接收到的内容是否被篡改。

  3. 权属鉴定:数字水印可以用于鉴定文件的所有者或原始作者,这对于知识产权和法律责任方面有重要意义。

  4. 追踪源头:数字水印可以在数字媒体传播途径中追踪内容的传播路径,有助于追查信息泄露和盗版行为。

需要注意的是,数字水印技术并非绝对安全,一些高级技术攻击仍然可能破坏或移除水印。因此,数字水印通常结合其他安全措施来提高保护级别。

1. 各类文件数字水印生成方法

1.1. 文本文件

1.1.1. 纯文本文件

  1. 嵌入文字

在原始文本中插入特定标识符或识别码,这些标识符不会影响文本内容,但可以用于标记该文本的来源或所有权。例如,在文本的开头或结尾添加特殊字符序列。

  1. 字体或格式变化

使用不常见的字体、大小或格式来标记文本。例如,在文本中使用不常见的Unicode字符或将特定单词或短语设置为斜体、加粗或下划线。

1.1.2. Word文本文件

  1. 文本字节固定位置插入水印信息

1.2. 图片文件

在图片文件中增加水印是一种常见的方法,用于标识图片的来源、版权信息或进行品牌宣传。水印可以是文本、图像或其他标识,被透明地嵌入到图片中。下面是一些常见的方法来在图片中增加水印:

1.2.1. 文本水印

在图片上叠加文字水印,通常包括版权信息、网址或品牌名称。可以选择合适的字体、颜色、大小和透明度来确保水印既显眼又不干扰图片内容。

1.2.2. 图像水印

在图片上叠加另一张图像作为水印。这可以是品牌标志、Logo或其他标识。同样,调整透明度和位置以确保水印不遮挡重要的图片内容。

1.2.3. 透明水印

在图片的低频区域或不显眼的位置添加透明水印。透明水印可以是特定图案或文字,仅在特定条件下才能被看到,如在特定软件或特定光照下。

1.2.4. 数字水印

嵌入隐藏信息的数字水印可以用于追踪图片的来源和版权信息。数字水印在视觉上不可见,但可以通过特定的解码方法提取出信息。

1.2.5. 防止盗用

将图片的分辨率调整到适当大小,降低图片质量或添加模糊效果,以防止盗用高质量图片。

1.2.6. 版权信息嵌入

将版权信息或拍摄者的姓名等元数据嵌入图片的EXIF信息中,这样即使图片被剪切或修改,版权信息仍然保留。

请注意,虽然水印可以在一定程度上保护图片的版权和来源,但并不能完全阻止图片被盗用或未经授权使用。对于高度安全性要求的图片,还可以考虑使用数字签名和加密技术来进一步保护图片的完整性和真实性。

1.3. 视频文件

在视频中增加水印是一种常见的方式,用于标识视频的来源、版权信息或进行品牌宣传。水印可以是图像、文本或其他标识,被透明地嵌入到视频中。以下是一些常见的方法来在视频中增加水印:

1.3.1. 静态图像水印

在视频的某个固定位置叠加静态的图像水印,通常包括版权信息、品牌标志或Logo。可以调整水印的透明度和位置来确保水印不干扰视频内容。

1.3.2. 动态图像水印

类似于静态图像水印,但在视频中动态移动或改变大小的图像水印。这样做可以增加水印的难度,使得更难被剪裁或遮挡。

1.3.3. 文本水印

在视频中叠加文字水印,通常包括版权信息、网址或品牌名称。可以选择合适的字体、颜色、大小和透明度来确保水印的可读性。

1.3.4. 透明水印

在视频的低频区域或不显眼的位置添加透明水印。透明水印可以是特定图案或文字,仅在特定条件下才能被看到,如在特定软件或特定光照下。

1.3.5. 数字水印

嵌入隐藏信息的数字水印可以用于追踪视频的来源和版权信息。数字水印在视觉上不可见,但可以通过特定的解码方法提取出信息。

1.3.6. 防止盗用

调整视频的分辨率和画质,添加模糊效果或进行加密,以防止盗用高质量视频。

1.3.7. 动态水印

在视频中嵌入动态的、时序变化的水印,使得水印更加难以剪裁或删除。

请注意,视频水印的添加通常需要使用专业的视频编辑软件或水印工具。在添加水印时,需要注意水印的可见性和透明度,以确保水印不影响观看体验和视频内容的质量。同时,要注意不同平台和设备上水印的表现,以确保在各种情况下水印都能被正确显示。

1.4. 音频文件

在音频文件中增加水印是一种常见的方式,用于标识音频的来源、版权信息或进行品牌宣传。水印可以是声音片段、音频标记或其他标识,被透明地嵌入到音频中。以下是一些常见的方法来在音频文件中增加水印:

1.4.1. 声音片段水印

在音频文件中嵌入特定的声音片段,通常是短暂的声音标识,如特定音效、声音标记或唱片标志。这样的声音片段通常在音频中不易察觉。

1.4.2. 数字水印

将隐藏信息嵌入到音频文件中,形成数字水印。数字水印在听觉上不可见,但可以通过特定的解码方法提取出信息。

1.4.3. 频域水印

在音频文件的频域信息中嵌入隐藏信息。这涉及使用离散傅里叶变换(Discrete Fourier Transform, DFT)或其他频域变换算法,将隐藏信息嵌入到频域中。

1.4.4. 音频标记

在音频中嵌入特定的音频标记,这可以是特定音符、频率或节奏。音频标记在听觉上可能不易察觉,但可以用于标识音频的来源。

1.4.5. 时域水印

在音频文件的时域信息中嵌入隐藏信息。这涉及使用一些时域处理技术,将隐藏信息嵌入到时域信号中。

1.4.6. 频率移位

通过微调音频文件的频率,将隐藏信息嵌入到音频中。这样的频率移位通常不会显著改变音频的声音质量。

请注意,音频水印的添加通常需要使用专业的音频编辑软件或水印工具。在添加水印时,需要注意水印的可听性和透明度,以确保水印不影响音频的质量和可欣赏性。同时,要注意不同播放设备和音频格式对水印的影响,以确保在各种情况下水印都能被正确播放。

3. 文本水印的一种解决方案

3.1. 纯文本水印效果

  • 加密前文本文件

在这里插入图片描述

  • 加密后文本文件

在这里插入图片描述

  • 加密文本真实存储信息

在这里插入图片描述

3.2. 代码

using System;
using System.Collections.Generic;
using System.IO;
using System.Linq;
using System.Text;

namespace ConsoleAppDigitalWaterMarking
{
    internal class Program
    {
        static void Main(string[] args)
        {
            // 指定文件路径和文件名
            string filePath = @"E:\sample.txt";

            //readTextContent2WriteTxtFile(filePath);

            //writeTextContent2TxtFile(filePath);

            readTextContent4TxtFile(filePath);

            Console.ReadLine();
        }


        private static void readTextContent2WriteTxtFile(string filePath)
        {
            Random random = new Random(DateTime.Now.Millisecond);

            // 读取文本文件内容
            string originalText = File.ReadAllText(filePath);

            // 要添加的固定字符
            char zeroWidthSpace = '\u200B';
            char zeroWidthNoSpace = '\u200D';

            // 创建 StringBuilder 对象来存储处理后的文本
            StringBuilder processedText = new StringBuilder();

            // 在每个字符前增加固定字符
            foreach (char c in originalText)
            {
                if (random.Next(10) / 2 == 1)
                {
                    processedText.Append(zeroWidthSpace);
                }
                else
                {
                    processedText.Append(zeroWidthNoSpace);
                }
                processedText.Append(c);
            }

            // 使用 StreamWriter 创建新文件并写入处理后的内容
            using (StreamWriter writer = new StreamWriter(filePath))
            {
                writer.Write(processedText.ToString());
            }

            Console.WriteLine("文件处理成功,已创建新文件。");
        }

        private static void readTextContent4TxtFile(string filePath)
        {
            StreamReader sr = new StreamReader(filePath);
            string text = sr.ReadToEnd();
            foreach (var item in text)
            {
                if (item == '\u200B')
                {
                    Console.WriteLine($"这是一个水印字符: u200B");
                }
                else if (item == '\u200D')
                {
                    Console.WriteLine($"这是一个水印字符: u200D");
                }
                else
                {
                    Console.WriteLine(item);
                }
            }
            sr.Close();
            Console.WriteLine(text);
        }

        private static void writeTextContent2TxtFile(string filePath)
        {
            try
            {
                // 要写入文件的信息
                string content = "这是要写入文件的信息。\n" +
                             "你可以在这里写入更多内容。\n" +
                             "Hello, World!";

                // 创建 StringBuilder 对象来存储处理后的文本
                StringBuilder processedText = new StringBuilder();

                // 零宽度空格的 Unicode 编码为 U+200B
                char zeroWidthSpace = '\u200B';

                // 在每个字符前增加零宽度空格
                foreach (char c in content)
                {
                    processedText.Append(zeroWidthSpace);
                    processedText.Append(c);
                }
                content = processedText.ToString();
                Console.WriteLine(content);

                // 使用 StreamWriter 创建文件并写入内容
                using (StreamWriter writer = new StreamWriter(filePath))
                {
                    writer.Write(content);
                }

                Console.WriteLine("文件创建并写入成功。");
            }
            catch (Exception ex)
            {
                Console.WriteLine("出现错误:" + ex.Message);
            }
        }
    }
}

3.3. 实现展开

可以将水印信息加密后形成0101纯数值信息,每隔一个字符用一种无宽度字符插入其中。

 

2024-01-29 17:01:45【出处】:https://qlygmwcx.blog.csdn.net/article/details/132183758

=======================================================================================

posted on 2024-01-29 15:12  jack_Meng  阅读(462)  评论(0编辑  收藏  举报

导航