SheepChef Blog
何時までも夢へ求めてる
SheepChef Blog

Abracadabra 魔曰 - 防和谐解决方案

引言

你好,我是SheepChef。

这篇文章将介绍一个我主导的开源项目——Abracadabra,一个文本防和谐的工具。

既然这篇文章是发在我的博客里,那么除介绍技术细节外,还将说说开发本项目时的一些幕后故事。

话不多说,我们开始吧。

为什么要防和谐?

国内社交平台或多或少有一些针对内容的和谐措施,意在屏蔽一些链接和关键词。

通过对敏感词、不良链接进行过滤,平台能够遏制某些内容的传播,意在维护社会稳定,防止利用网络进行违法犯罪活动。

但它存在诸多弊端 —— 过度的审查将导致信息封锁,限制用户获取多样化信息的权利,从而阻碍思想的自由交流。审查机制的复杂性也可能导致误判率升高,误杀无辜内容,影响用户体验。

开发一个用来防止内容和谐的工具,早已成为许多程序员的共识。

已有的轮子不行?

的确,在防止内容审核的领域已有许多现成工具,即所谓“轮子”,最早可以追溯到2010年。它们大多是闭源的,且在各种意义上不够安全,不够好,这也是为什么我想开发一个开源,安全,易用的防和谐工具。

以此前流行的“与熊论道”为例,它的实现不开源,加密过程在其服务器上完成,且其似乎并不能被称为“加密”工具,本质上是一种结合了压缩的编码工具。其输出的“密文”固定,易受选择密文/选择明文/已知明文攻击,其密文也容易被直接模式匹配。

佛曰加密的确有AES加密,但是其密钥不是用户指定的(内置密钥),密文冗长,生僻字多。

至于其他的工具,比如“兽音”,其本质大同小异,无非是编码规则有些出入。

青空的祝福

与熊论道(唯一密文):
呋食取啽吃堅和吖既森寶蜂眠森告發沒破吖歡嘶盜註

佛曰(等效密文,非用户指定密钥):
皤諸隸皤僧降皤吽皤諸皤陀摩隸僧缽薩皤嚤伏咒蜜皤眾蜜皤嘚咒皤叻陀皤莊吶僧吶咒吽咤祗陀皤愍訶哆皤色皤聞如皤如囑囑皤
諸隸僧降吽閦諸陀摩隸閦僧缽閦薩嚤伏閦咒閦蜜閦眾蜜嘚咒叻陀莊吶僧吶咒吽咤祗陀愍訶哆色閦聞閦如如囑囑

兽音(唯一密文):
~呜喵啊呜啊喵呜~呜呜啊~~~~呜喵呜~~~~喵啊~~喵~呜啊喵~~喵呜~啊啊啊啊喵啊啊

Abracadabra 魔曰(等效密文,默认密钥):
钠裕讲给半筱天绣杸南瞐蓬事铂揽绪带网红派页裳羧之饶住凛岩込较
涌频传达表题珏妥型此囍暑罗瓢场钌凪向振遨遨嵩呀走面兰跟捷接阑
霞有筱店汐掉珏暑展快金被诚檀亦长句羧钯帮铁踵桨对猫実纺闭风鹂

//——> 这是一个各加密工具的简单横向对比,后文中还将有更多对比。
Plaintext

那么,我的目标便很明确了:首先是撇除所有诡异的生僻字,其次提供耐打的密文随机性,再次让密文尽可能地短,最后确保基于密钥保密的安全性,而不是加密算法保密的安全性(加密算法公开,由密钥提供安全性)。

知己知彼:平台到底如何识别?

根据实测,大多数平台的“文本内容审查”都局限在速度快,性价比更高的 分词+正则库+算法打分 体系。

很多人谣传平台要部署LLM(大语言模型)来审查内容,其实仔细思考,这是相当不可能的做法。

固然,LLM能够比正则更准确地理解一句话的意思,显著降低误判率,大幅提升精确度,但它完全不具备成本效益

首先是速度慢,即使是最快最轻量的LLM,输出结果的耗时也得半秒以上,而且由于其算力消耗比正则匹配大很多,无法承受高并发量。

其次是算力成本,运行LLM的各项成本(电费,计算设备等)是正则匹配的至少百倍(根据文本量的不同,可达上千倍)。对于一个月活用户很多,用户产出内容数量庞大的平台,如果全部用LLM来审核其内容,开销将会相当惊人,以至于完全不具备这么做的成本效益。

所以,目前(2024年),你可以很自信地相信,大平台的机器审核措施,将停留在正则(关键词)匹配上。也许在流程上,对“疑似”违规会引入人工审核。但对本项目而言,其密文能够通过绝大多数商业”文本内容安全”的自动审核,这就足够了。

Abracadabra 魔曰

这一节将主要介绍Abracadabra(魔曰)的实现细节,优势,以及一些附属的故事。

取名

一开始,本项目并没有中文名,仅有 Abracadabra 这个英文名。

Abracadabra

Abracadabra(阿布拉卡达布拉),是一个古老的咒语,常用于魔术表演或护身符上。它的起源并不完全确定,可能来自亚拉姆语,意为 “I will create as I speak” (如我所说一样创造)。历史上,人们相信它具有神奇的治愈力量,能驱散疾病。如今,它更多地被当作一种魔术咒语,象征着神秘和不可思议。

以上内容是百科全书给出的定义,但我取这个名的时候并没有想那么多,只是想起来小时候学英语的时候,老师在课堂活动中经常使用 Abracadabra 来“变魔术”。我希望本项目的密文就像魔法一样不可预测,具备良好的性能,于是本项目便以此为名。

至于 “魔曰”,则是仿照着同类工具取的中文别名,和Abracadabra这个词本身的意思契合。

密本:殚精竭虑

魔曰的密本不同于任何同类型的工具,它由数百个《通用规范汉字表》中的一级字和二级字构成,也有一些非常常见的 日本和制汉字(Kanji),比如 桜(Sakura);但没有任何可能造成关键词屏蔽的汉字,也不存在笔画超过二十二画的生僻字。均是我手动从汉字表里选的夹杂了一些对使用没有任何影响的私货

密本的一小部分,你能发现“私货”吗?

为了增加审查难度,本工具的密表中增加了部分化学专业字(氢/氦/锂/氧…),自然鸟名(鸢/鹤/莺/鸳/鸯/鹂/雀),自然植物名(兰/竹),寓意无贬义的动物名(鲤/猫),自然事物(灯/花/火/铃/琴/月…)。

你可能要问:它是如何增加审核难度的?

本工具的核心目标在于 增加审核的成本到不可接受的程度,由于使用的所有汉字都是汉语中的常用字,机械屏蔽它们中的任何一个或几个都会导致日常/专业交流中灾难性的词汇缺失,以至于不得不被叫停。密本也不存在组成敏感关键词的可能,关键词识别将不会奏效。

基于人工智能的识别也显然完全无法理解这些字符的含义,因为它们仅包含随机汉字,无法组成任何意义连贯的文字。我(开发者)使用 ChatGPT 和文心一言做过测试,测试显然成功,即使是资源开销很大的大语言模型也对这类密文无从下手,仅能给出十分模糊的判断意见。

比起任何一种密文单一且全是生僻字的类似工具,魔曰加密做到了优秀水准。

随机性:鱼与熊掌

相同原文,相同密钥的情况下,本程序的加密结果随机性很高,不同于其他类似工具的单一密文。第一重随机性来源于 AES-256-CTR 的两字节初始化向量,能够提供 255×255 共 65025 种可能密文。第二重随机性则来源于密本(不考虑转轮),每个字符至少有 10 种加密可能,那么最终密文的可能性就是 65025*10^N。

如果考虑转轮,那么每个字母都有 520 种加密可能,每个数字都有 100 种加密可能。最终的加密随机性可达数百万乃至上千万种。

随机性可以显著增强本工具的抗审查性能,使得针对密文的模式审查难以奏效。在明文和密钥都一样的情况下,每次加密出来的密文可以说是完全不同

当然,也有人反馈,质疑本项目的密文安全标准不够强。如果要实现绝对的安全性,至少需要16字节的初始化向量和16字节的密钥盐值(共三十二字节的额外数据),以及至少100000次哈希迭代。这对密文来说是不可接受的,膨胀率超出了日常使用的合理标准,效率太低。

目前本加密方案使用的IV为两字节,提供65025种可能。虽然显著少于标准长度,但不会对密文的长度造成显著影响,同时确保了相当程度的随机性,即使客观来说它是“不够”的。

AES加密:坚固后盾

AES-256 是业内公认的安全加密算法,久经考验。

魔曰使用 AES-256-CTR 作为密文的核心加密方案,使得密文的安全性有坚固的保证。

唯一的不足之处在于初始化向量(IV)的长度,标准长度是 16 字节,但是由于本项目的密文长度必须尽可能地短,便把 IV 长度压缩至两个字节,即使如此也能提供 65025 种随机性,在大多数情况下足够安全。

转轮加密:古为今用

转轮加密是我思考许久,对二战德军著名加密机Enigma(恩尼格玛)的现代升级版模拟实现,弥补了它的诸多不足之处。有很多人质疑我在“重新发明密码学”,考虑到这一点,我在其前加上了AES-256,确保即使在转轮加密被“攻破”时,仍有久经考验的AES加密作为“后盾”。

转轮加密之前的原文,是一个AES加密后产生的Base64字符串,转轮加密对其的处理为彻底打乱Base64字符串的字母/数字/符号,使其无法被正常解码为下一层AES256加密后的字节数据(包括两字节IV在内)

(转轮加密之前)
6Jgy9/iX1l2xk4A=

(转轮加密之后)
.GBQ~^Ct[E&Yw~F2
Plaintext

转轮加密是基于密钥的,通过对密钥进行SHA256哈希,生成一组操作数,这些操作数控制多个转轮的旋转。每个字符的加密都对应一次转轮操作,最终得到密文。

由于篇幅限制,我无法在这里完整地阐述转轮加密的实现细节,如果你对这部分的技术细节感兴趣,可以查阅我在Github上的详细阐述

压缩算法:高效传播

本项目使用了两种不同的压缩算法:Unishox2 和 Gzip。

大多数时候你只会用上Unishox2,它用来专门压缩1kb以下的短文本,对短文本压缩有相当好的效果。Gzip 则用来压缩更大的数据,一般情况下只用来处理文本文档之类的数据。

本项目的密文长度,总体上比与熊论道更短,但是如果处理的密文小于一定的字节数,由于本项目加密数据时引入的各种校验位会占用一定空间,密文会显得比与熊论道长。

青空的祝福

与熊论道(唯一密文):
呋食取啽吃堅和吖既森寶蜂眠森告發沒破吖歡嘶盜註

Abracadabra 魔曰(等效密文,默认密钥):
钠裕讲给半筱天绣杸南瞐蓬事铂揽绪带网红派页裳羧之饶住凛岩込较

/////——————

愿青空的祝福,与我的羽翼同在

与熊论道(唯一密文):
呋食食嘍嗡吖物吃訴吖物嗅喜達拙達發怎嘍襲現嗷既歡嚄類捕歡達哞呆麼出啽吃堅和吖既森寶蜂眠森告發沒破吖歡嘶盜達告爾取襲

Abracadabra 魔曰(等效密文,默认密钥):
最当芮进青栩或贴个鸳猫单将辉价人静翊版祥谜使汨奏沢霞米系钥敬蔬可骆笙裕他请啊畔城游铍珏赴见漫冰熙涨年莅曳先吗

/////——————

magnet:?xt=urn:btih:567b8a6ebac42ad001f6664cefeabfb37185938a

与熊论道(唯一密文):
呋食食很家盜呦告哮哮洞怎發哞有註哮很有哞魚襲我麼囑嗅森性喜性呱森很動出啽住既和我常肉囑氏啽噗類囑類拙森很常訴既噔囑吖囑非歡蜜洞現象既果偶怎嗒和堅常嗄我偶嗥氏

Abracadabra 魔曰(等效密文,默认密钥):
泪找踵绫畔绪除住骏在点上周汀铵奏凪璃鸠最悦四锄求钨们仍笙现蔬路桅奖看梦咫镉栀茉恋语鹦服鹂部设氮去请段门迷欤至硅组月泰最到那湍量协笑款
Plaintext

标志位:方便之门

标志位用来简化加解密操作流程,程序识别到加密标志位便会自动解密,无需用户手动指定解密,提高便利性。因此,魔曰通常只需要一个操作按钮,无需两个。

但标志位会引入少许密文特征,虽然被针对性识别的可能性很低,但本项目仍然增加了加密时不添加标志位的选项,提供更好的抗审查能力。

没有标志位的密文,在自动模式下将默认被再次加密,需要手动指定强制解密。

跨平台:高效便捷

我在开发本项目的时候,奉行内核和外壳分离的原则。

本项目的核心,是C++的CLI程序,和JavaScript库(npm),方便复用。C++ 拥有显著速度优势;Javascript 则可以提供最强的跨平台兼容性,让项目易于在各个平台使用。

目前项目的 Demo 页和浏览器插件已经开源,均基于JavaScript库,我自认为它们制作精美,拥有完善的配套功能和美观的视觉体验。你可以随时下载源码,在你喜欢的地方轻易地部署它。如果你不懂网页部署,也可以快速安装浏览器插件来使用本项目。

后记,杂言

魔曰从设想到成型,花了两个月时间。

这也是我写多年垃圾无用代码以来,尝试建立的第一个开源项目。如果你觉得它有不足,那是非常正常的,欢迎在Github提出Issue,当然也可以电邮联系我。这个项目的Logo是AI生成的,属于公有领域。

写代码作为我的业余爱好之一,一直仅限于我本人的自娱自乐,但这回我想要写一个能为他人所用的工具,将开源精神贯彻始终。

另外,本项目在编写的时候,正值“何同学抄袭源代码事件”发酵时。我并不喜欢别人“抄袭”代码,但是话说回来,开源项目不就是拿去给人抄的吗?真要打算彻底避免被人“抄袭”代码,不如做成一个黑盒,从一开始就不要把这个项目开源。

我打心里觉得,比起我花费心思写的代码很长时间无人问津,开源项目被人“抄”得越多,反而越能让我感到高兴。开源是公益的,希望不要被外行的评论搞得变了味。

5 2 投票数
文章评分
感谢您一直阅读到本文的最后!
如果您觉得本文写得不错,欢迎您转发支持我们。
# # # # # #
首页      IT技术      C++      Abracadabra 魔曰 - 防和谐解决方案
Avatar photo

SheepChef

文章作者

Webmaster

订阅评论
提醒
guest
2 评论
最新
最旧 最多投票
内联反馈
查看所有评论
退订八十一次

感谢站长

👁️👁️👁️

👍🏻

Image_1714847173890

SheepChef Blog

Abracadabra 魔曰 - 防和谐解决方案
开源项目 Abracadabra,文本防和谐工具。
扫描二维码继续阅读
2024-11-30