【问题标题】:Defense against approximate string matching防御近似字符串匹配
【发布时间】:2016-03-28 19:11:26
【问题描述】:

如何更改字符串,使近似字符串匹配的变体无法与原始字符串匹配?

我制作了一个 IRCbot,它根据频道的日志文件运行游戏。它从日志中打印报价,玩家通过猜测“谁说的”来收集积分。该频道相当令人讨厌,其中一名玩家花费不超过 30 分钟的时间构建了一个每次都赢得比赛的机器人。我意识到手动作弊也很容易而且不可能防御,但认为这是自动机器人之间的竞争。我想更新我的机器人,这样任何全自动机器人都无法玩游戏:)

我考虑过从引号中随机删除一个字符,但agrep 仍然能够匹配该字符串。我考虑过用外观相似的替代字符替换一些字符,但这对于逆向工程来说是微不足道的。我正在寻找更难打破的想法。

示例行:

[14:15] <baobot> [QUOTE 13/15] Who famously declared "minulla ainakin paperin tekemisessä 1% ajasta menee algon suunnitteluun ja 99% menee paperin kirjoittamiseen"?

【问题讨论】:

  • 只要输出是纯文本,你就不太可能想出一种既能被人类理解又不容易被近似字符串匹配算法破坏的方法。
  • Google 将报价翻译成随机语言并恢复为原始语言。

标签: string algorithm string-matching irc


【解决方案1】:

将您的报价打印为 ascii-art。

使用类似于命令行工具 figlet 或厕所 (explaination) 的东西。

这里有一个简单的例子:比如string2ascii-generator

为了让您开始,您可能需要从 figlet 复制源代码。

【讨论】:

  • 这是个好主意,但还不够实用。 Ascii 艺术无法在具有不同字体的系统上正确显示,而且如果不使用大量行,很难容纳多个单词。
  • 我怀疑将其制作成 ASCII 艺术只是一个小障碍。机器人编写者只需检查输出,然后编写他的机器人进行解码。
【解决方案2】:

使用谷歌翻译。

例如,我将您的报价转换为俄语,然后转换为英语,然后再转换为芬兰语,然后得到

ainakin 上的 Minulla 1% ajasta kirjassa otetaan suunnittelussa Algon ja 99% menee kirjoituspaperia

我不知道这是否是正确的芬兰语;据 可以说它仍然有些可识别。如果您认为它对于近似搜索来说太容易识别,请进行更多中间翻译。

【讨论】:

  • 那是开箱即用的想法! :) 不幸的是,结果经常是乱码太多。此外,其中一部分乐趣在于从一个人的写作风格中识别出一个人。
【解决方案3】:

任何可以用来打乱的东西很可能都可以被打乱。以下是一些针对您的实验的建议:

  • 如果第一个和最后一个字母都在适当的位置并且内部部分被打乱,人类可以阅读单词。

  • 您还可以进行替换,例如用数字替换某些字符。

  • 您也许可以找到其他语言中的其他字符,这些字符与所使用的字母看起来也很相似,这意味着您也可以随机替换它们。

  • 您也可以尝试随机化空格的位置。所以把它们从原来的位置移开,然后四处移动,或者完全移开。

  • 颠倒一些单词。

  • 找到拼音单词的方法...在英语中,“ph”听起来像“f”,因此您可以找到并替换其中的一些。

  • 尝试组合上述不同的东西,删除所有空格、CaMEl CaSE 单词,然后进行字符替换等。

总体而言,有很多方法可以帮助您提高难度,但是如果您每次都遵循一套模式,那么编写一些东西来撤消它会更容易。如果你随机做不同的事情,那么一个输入可以产生几个不同的输出,那么有人编写一个程序来反转这个过程会更难。

【讨论】:

    猜你喜欢
    • 2011-05-11
    • 2013-07-10
    • 1970-01-01
    • 2010-09-08
    • 2013-04-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-12-30
    相关资源
    最近更新 更多