3 个版本

0.1.2 2024年2月19日
0.1.1 2024年2月19日
0.1.0 2023年2月9日

#1326命令行工具

MIT/Apache

180KB
735

SubSolver

替换密码求解器

一个命令行工具,使用单词列表而不是统计分析来解决替换密码。在文本是另一种语言或非常短时,统计分析有时不可行。通常需要手动分析猜测单词,查找与特定模式相匹配的单词。此工具自动化了该过程!

使用单词列表,它可以尝试所有位置的所有单词,并利用对重复字母和空格的知识来确定可能的明文和密钥。但这意味着明文中的所有单词都必须在给定的单词列表中。因此,建议使用大单词列表,因为这个工具可以轻松处理它。

它用 Rust 编写,旨在追求 速度。使用高效的算法,只检查绝对必要的内容,大多数密文都能在几秒钟内破解。它将输出所有可能的明文和密钥,最后您可以自己查看是否有任何解决方案是有意义的。

算法的实现取自 此仓库,作者:@wjmolina这篇 MIT 论文 介绍了算法的所有想法以及为什么它们有效。

安装

cargo install sub-solver

或者从 发布 页面下载并解压预编译的二进制文件。

用法

$ sub-solver --help
Substitution Cipher Solver

Usage: sub-solver [OPTIONS] <--string <STRING>|--file <FILE>>

Options:
  -s, --string <STRING>      Ciphertext string to solve
  -f, --file <FILE>          Path to the ciphertext file
  -w, --wordlist <WORDLIST>  Path to the wordlist file (default: built-in english.txt)
  -k, --key <KEY>            Starting key, letter mapping (default: empty, example: "a:b,c:d,e:f", "ab,cd,ef", "b?d?f?????????????????????")
  -F, --fill-key             Fill in unknowns in solution with random unused letters (default: false)
  -n, --no-cache             Disable dictionary cache (default: false)
  -h, --help                 Print help

示例

  • 明文: "some english text to showcase my tool in action"
  • 密钥: IYFWDQZMRVJHXLCKOUTEAGPBSN (CyberChef)
  • 密文: "Tcxd dlzhrtm edbe ec tmcpfitd xs ecch rl ifercl"

使用 -s 直接输入密文字符串,或使用 -f 指定包含密文的文件路径。

$ time ./target/release/sub-solver -s "Tcxd dlzhrtm edbe ec tmcpfitd xs ecch rl ifercl"
[*] Using empty starting key
[*] Using built-in english wordlist
[+] Loaded 13255 unique patterns
[+] Saved dictionary cache
[*] Input string: "Tcxd dlzhrtm edbe ec tmcpfitd xs ecch rl ifercl"
[+] Parsed 9 input words
[+] Pruned impossible words
[*] Starting to find solutions...
?xoetc?la??nh??w?iys???m?g -> some english text to showcase my tool in action
?xoetc?la??nh??w?irs???m?g -> some english text to showcase mr tool in action
?xoetc?la??nh??w?ius???m?g -> some english text to showcase mu tool in action
[+] Finished! (3 solutions)

real    0m0.117s

如果密文非常短,可能有大量可能的解决方案。但如果你知道密钥的任何部分,你可以使用 - 参数来指定起始密钥,从而将搜索范围缩小到只匹配该起始密钥。

  • 明文: "一些简单示例"
  • 密钥: IYFWDQZMRVJHXLCKOUTEAGPBSN (CyberChef)
  • 密文: "tcxd trxkhd dbixkhd"

根据您的理解,起始密钥有多种格式。您可以使用两个字符为一组的逗号分隔列表,将密文字母映射到明文字母。如果我们在这个例子中知道 "dbixkhd" 单词是 "example",我们知道 'd' 必须是 'e','b' 必须是 'x' 等。在这种情况下,起始密钥将是 de,bx,ia,xm,kp,hl,对所有我们知道的字符。

$ sub-solver -s "tcxd trxkhd dbixkhd" -k 'de,bx,ia,xm,kp,hl'
[*] Using starting key: "de,bx,ia,xm,kp,hl"
...
[*] Starting to find solutions...
?xoe???la?p??????i?d???m?? -> dome dimple example
?xoe???la?p??????u?r???m?? -> rome rumple example
?xie???la?p??????u?r???m?? -> rime rumple example
?xoe???la?p??????i?s???m?? -> some simple example
[+] Finished! (4 solutions)

其他选项的工作方式如下

  • ---wordlist = 指定您自己的单词列表路径,而不是内置的 58,000 个单词的英语单词列表
  • ---fill-key = 使用对未知字符可能是什么的猜测来填充最终打印的密钥中的未知字符(例如: "?xoe???la?p??????i?s???m??" -> "bxoecdflagphjknqritsuvwmyz")
  • ---no-cache = 关闭从文件缓存中保存和加载字典。通常,每当将单词列表转换为字典时,它都会被缓存在文件中,这样就不必在多次运行中再次执行

依赖关系

~5MB
~120K SLoC