隐写术试图通过隐藏消息而不是(或除了加密之外)加密消息来防止非预期收件人读取消息。当您不仅想保持通信的私密性,还想隐藏您已经通信的事实时,可以使用隐写术。
有趣的事实:隐写术和剑龙这两个词是相关的 [1]。
著名的例子
隐写术的一个著名例子是耶利米·丹顿在越南战争期间发送的秘密信息。作为战俘时,丹顿被迫参加越南宣传视频。他通过闪烁单词中字母的莫尔斯电码来发送“酷刑”一词。您可以在此处找到该视频。
著名非典型
一些所谓的隐写术的例子被证明是apophenia,寻找不存在的模式。 《破解密码的女人》一书详细介绍了伊丽莎白·史密斯对密码学的介绍,她的任务是寻找隐藏在莎士比亚笔迹中不存在的微小变化中的信息。这本书接着描述了她在二战期间的密码工作,破译了肯定存在的信息。
顺便说一句,伊丽莎白·史密斯 [2] 与密码学家同事威廉·F·弗里德曼结婚。我不久前写过弗里德曼的巧合指数。
输入统一码
兰德尔·门罗 (Randall Monroe)表示:“我对 Unicode 联盟为自己创造的这项无望的任务感到无比高兴。”让他们的任务变得令人愉快和绝望的事情之一是试图区分语义和外观。
例如,罗马和希腊字母开头的大写字母具有不同的 Unicode 值,尽管它们看起来很相似。 A (U+0041) 是罗马字母,A (U+0391) 是希腊字母,所以它们不一样。此外,罗马字母 M (U+004D) 在语义上与表示 1,000 的罗马数字Ⅿ (U+216F) 不同。
但很快就不可能一致地进行这种区分,因此 Unicode 充满了妥协。字母i和虚数单位i应该有不同的代码点吗?电流的符号i和单位基向量i又如何呢?符号的每次使用不能有不同的代码点。
由于 Unicode 具有许多外观相同的字符对,因此可以通过使用一对字符中的一个成员表示 0,另一个成员表示 1 来隐藏 Unicode 文本中的二进制数据。因此,也许 d (U+0064 拉丁小写字母 D ) 代表 0,d (U+0501 西里尔小写字母 Komi De) 代表 1。
这个方案有一个潜在的问题。 Unicode 并不规定外观,印刷者完全有可能创建一种字体,该字体具有与其他字体中不明显的字符不同的字形。
安全
相似字符经常被用来创建恶意 URL。例如,有人可能会使用“Microsoft.com”并用罗马数字 Ⅿ 代替第一个字母,或者用希腊欧姆数词代替其中一个o 。
应将预期为 ASCII 的文本转换为 ASCII,以防止错误或恶意,或警告用户。 “您真的要访问这个包含九个罗马字母和一个西里尔字母的 URL 吗?”
当我阅读时,我想要具有广泛 Unicode 支持的字体。没有丢失符号,没有外来词字体的不和谐变化。但是当我调试时,最好有相反的字体,一种排外字体,以某种丑陋的方式显示非 ASCII 字符,使它们跳出来。我想有人已经开发了这样的字体,但很难找到,因为大多数人都在寻找更好的 Unicode 支持,而不是更差。
相关帖子
[1] 两者均源自希腊语“覆盖”一词。隐写文字是在隐藏的意义上被覆盖的。剑龙有看起来像屋顶瓦片的装甲板,即像房子的覆盖物。
[2] 这不是一个错字。她用“e”作为第五个字母拼写她的名字,而不是更常见的“a”。
后Unicode 隐写术首次出现在John D. Cook上。
原文: https://www.johndcook.com/blog/2025/01/02/unicode-stegonography/