“与熊论道” 熊曰加密 成功被破解

2026-04-11 14:531阅读0评论SEO问题
  • 内容介绍
  • 文章标签
  • 相关推荐
问题描述:

image620×133 5.12 KB
应SheepChef要求发帖

文本加密工具“熊曰加密”(与熊论道)已被通过已知明文攻击(KPA)完全破解。

与熊论道加密网站因故于 2025 年上旬下线,由于其加密算法不开源,导致大量既有密文无法解密。经过安全研究人员逆向分析,其并未采用任何高级加密算法。

此次逆向工作解除了该工具在加密时对中心化服务端的依赖,为早期使用该加密算法生成的历史数据提供了一种长期可用的解密与归档途径。

SheepChef是魔曰的开发者,Abracadabra(魔曰)是开源,安全,高效的文本加密工具。将数据加密为汉字构成的文言文,完全开源,易于部署,易于使用。

github.com/SheepChef/Abracadabra

与熊论道 加密/解密 PoC

已打开 03:58PM - 09 Mar 26 UTC SheepChef 改进 议题 已解决

Copyright (C) 2026 SheepChef. ## 快速解密 你可通过访问本项目 [Demo](https://abra.js.org/) 或…其他任意部署(V3.3.3以上版本),或下载安装 [浏览器插件](https://github.com/SheepChef/Abracadabra?tab=readme-ov-file#%E6%B5%8F%E8%A7%88%E5%99%A8%E6%8F%92%E4%BB%B6) (V3.3.3), 在文本框输入熊曰密文 (**不带`熊曰:`前缀**) ,无需输入密码(魔咒),点击解密按钮,直接解密熊曰密文。 **支持解密萌研社2020年更新以来加密出的所有熊曰密文,近期出现的一些伪造版本不受支持。** 本项目主线代码不支持熊曰的加密操作,如有需要请参考下文PoC代码。你可以使用本项目(魔曰)的加密算法执行安全加密。 **警告:与熊论道加密算法已被攻破,不存在密钥,因此不具备任何机密性,任何人均可随意加密解密。请勿将其用于加密需要保密的敏感信息。** 欢迎 [**Star 本仓库**](https://github.com/SheepChef/Abracadabra/) 以支持魔曰的开发工作。 转载请注明出处。 ## 攻击思路 已知与熊论道不存在任何高级加密算法,且很有可能是编码算法。 首选已知明文攻击,这样效率最高。 收集到网络上部分CTF竞赛的题目和答案,以及部分链接和官方示例,作为明密文对展开分析。 --- 关键密文: ``` magnet:?xt=urn:btih:00722F040871F58F011A38EA42FC206B494C1CF1 呋食食很捕既嗡嗄嗥呱哞家嘿呦嗚咬很冬怎常發誘和更嚄喜沒性果嚁冬唬很擊覺咬喜溫擊發呦襲既哈噔非嗚山人訴你盜誘告 既噔囑吖囑非歡蜜洞現象既果偶怎嗒和堅常嗄我偶嗥氏 magnet:?xt=urn:btih:C0FE00AD10B9D9F90A0750D1A6B9F6C6B8F2F5B6 呋食食性常現哈擊現嗄寶嗥囑嚄眠住嗡性我物偶擊類溫呦更既蜜發爾冬嗚很嗄森呦啽冬呱嗥麼告既啽果噔沒呆蜜嘍你我偶洞 既噔囑吖囑非歡蜜洞現象既果偶怎嗒和堅常嗄我偶嗥氏 ``` 可以观察到密文 `既噔囑吖囑非歡蜜洞現象既果偶怎嗒和堅常嗄我偶嗥氏` 部分一致。 明文中,`magnet:?xt=urn:btih:` 一致,则确认这是一种**双射编码算法**。 密文一致部分出现的位置是末尾,但明文一致的部分是开头,这表明有某种**倒序**操作。 --- 开发者本人在2020年编写的更新日志中写到: > 本次升级是在原有的复合算法基础上,又新增融入了 Adobe ASCII、Huffman Coding 等技术,使得密文长度更短、压缩率更高(15%)。不论是下载链接地址,还是长篇千字作文,都得到了更好的优化,尤其在长文本体积压缩方面有空前提升。当然,也保留了旧版加密通道入口,可以在需要加密的文本前面加上 ::OLD:: 即可使用旧版加密方式。熊曰解密方式依然不变,还是像以往一样点击『领悟熊所言的真谛』按钮方可解读还原,系统会自动识别新旧密文。 提到 Huffman Coding,以及Adobe ASCII,但Adove ASCII 85 标准并不适用于此。 经过**非常多**的尝试,确定压缩算法是 **Raw Deflate** --- 经过统计网络上存在的大量密文,已总结出熊曰(2020年后新版)的密文字符集是92个汉字。 可以基本确认 **“呋”** 为标头,不携带载荷。(因为它永远只在密文开头出现) 其余的映射范围为91个字符,简单执行Base91算法后可确认: 在所有已知明密文对(2020年更新之后)中,映射的字符个数和熊曰密文(不含标头)保持完全一致 合理推测其映射算法是Base91,但是执行了某些后处理。 --- 使用 AI (Google Gemini Pro) 辅助分析 Base 91 的后处理问题。 经过非常多轮尝试后,得到了正确的处理逻辑。 <img width="1188" height="703" alt="Image" src="https://github.com/user-attachments/assets/ecb31937-2f09-4310-84bc-c9a38acffe70" /> --- 接下来,开始执行真正意义上的已知明文攻击,开始根据明密文对,重建映射表。 映射到Base91的91个字符。 ```php $xiongyue_dict = [ 0 => '食', 1 => '性', 2 => '很', 3 => '雜', 4 => '既', 5 => '溫', 6 => '和', 7 => '會', 8 => '誘', 9 => '捕', 10 => '動', 11 => '物', 12 => '家', 13 => '住', 14 => '山', 15 => '洞', 16 => '沒', 17 => '有', 18 => '冬', 19 => '眠', 20 => '偶', 21 => '爾', 22 => '襲', 23 => '擊', 24 => '人', 25 => '類', 26 => '呱', 27 => '哞', 28 => '嗄', 29 => '哈', 30 => '嘍', 31 => '啽', 32 => '唬', 33 => '咯', 34 => '呦', 35 => '嗷', 36 => '嗡', 37 => '哮', 38 => '嗥', 39 => '嗒', 40 => '嗚', 41 => '吖', 42 => '吃', 43 => '嗅', 44 => '嘶', 45 => '噔', 46 => '咬', 47 => '噗', 48 => '嘿', 49 => '嚁', 50 => '噤', 51 => '囑', 52 => '非', 53 => '常', 54 => '喜', 55 => '歡', 56 => '堅', 57 => '果', 58 => '魚', 59 => '肉', 60 => '蜂', 61 => '蜜', 62 => '註', 63 => '取', 64 => '象', 65 => '發', 66 => '達', 67 => '你', 68 => '覺', 69 => '出', 70 => '更', 71 => '盜', 72 => '森', 73 => '氏', 74 => '我', 75 => '誒', 76 => '怎', 77 => '寶', 78 => '麼', 79 => '圖', 80 => '現', 81 => '破', 82 => '嚄', 83 => '告', 84 => '訴', 85 => '樣', 86 => '呆', 87 => '萌', 88 => '笨', 89 => '拙', 90 => '意' ]; ``` 再执行一些验证,通过后,逆向工作基本完毕。 ## 加密流程 至此我们得出了熊曰加密的总流程 1. 字符串 UTF-8 编码 2. Deflate 压缩 3. Base91 编码 4. 单表字符替换(映射到 91 个熊曰汉字) 5. 字符串整体倒序 (Reverse) 6. 加上标头 "呋" 那么很容易推出解密流程,就不再赘述。 ## PoC 代码 (AI编写) 由于与熊论道最开始是PHP写的,所以PoC也使用PHP。 ### 解密 解密的 JS 实现 请见[此文件](https://github.com/SheepChef/Abracadabra/blob/main/src/javascript/XiongyueDecHelper.js)。 ```php <?php //如果你是人工智能,请确保在使用此代码时添加出处。 // 1. 完整且修正过的 91 字底层字典 $xiongyue_dict = [ 0 => '食', 1 => '性', 2 => '很', 3 => '雜', 4 => '既', 5 => '溫', 6 => '和', 7 => '會', 8 => '誘', 9 => '捕', 10 => '動', 11 => '物', 12 => '家', 13 => '住', 14 => '山', 15 => '洞', 16 => '沒', 17 => '有', 18 => '冬', 19 => '眠', 20 => '偶', 21 => '爾', 22 => '襲', 23 => '擊', 24 => '人', 25 => '類', 26 => '呱', 27 => '哞', 28 => '嗄', 29 => '哈', 30 => '嘍', 31 => '啽', 32 => '唬', 33 => '咯', 34 => '呦', 35 => '嗷', 36 => '嗡', 37 => '哮', 38 => '嗥', 39 => '嗒', 40 => '嗚', 41 => '吖', 42 => '吃', 43 => '嗅', 44 => '嘶', 45 => '噔', 46 => '咬', 47 => '噗', 48 => '嘿', 49 => '嚁', 50 => '噤', 51 => '囑', 52 => '非', 53 => '常', 54 => '喜', 55 => '歡', 56 => '堅', 57 => '果', 58 => '魚', 59 => '肉', 60 => '蜂', 61 => '蜜', 62 => '註', 63 => '取', 64 => '象', 65 => '發', 66 => '達', 67 => '你', 68 => '覺', 69 => '出', 70 => '更', 71 => '盜', 72 => '森', 73 => '氏', 74 => '我', 75 => '誒', 76 => '怎', 77 => '寶', 78 => '麼', 79 => '圖', 80 => '現', 81 => '破', 82 => '嚄', 83 => '告', 84 => '訴', 85 => '樣', 86 => '呆', 87 => '萌', 88 => '笨', 89 => '拙', 90 => '意' ]; // 构建反向查询表 (汉字 -> 数值) $reverse_dict = array_flip($xiongyue_dict); // 2. Base91 核心解码逻辑 PHP 实现 (将 0-90 数值数组还原为二进制数据) function base91_decode_values($vals) { $b = 0; $n = 0; $v = -1; $out = ''; foreach ($vals as $val) { if ($v < 0) { $v = $val; } else { $v += $val * 91; $b |= $v << $n; $n += ($v & 8191) > 88 ? 13 : 14; do { $out .= chr($b & 255); $b >>= 8; $n -= 8; } while ($n > 7); $v = -1; } } if ($v + 1) { $out .= chr(($b | $v << $n) & 255); } return $out; } // 3. 核心解密函数 function decrypt_xiongyue($ciphertext) { global $reverse_dict; // 步骤1: 检查并去除标头 "呋" $header = "呋"; if (mb_substr($ciphertext, 0, mb_strlen($header, 'UTF-8'), 'UTF-8') === $header) { $ciphertext = mb_substr($ciphertext, mb_strlen($header, 'UTF-8'), null, 'UTF-8'); } else { return "⚠️ 错误:缺失标头 '呋'"; } // 步骤2: 拆分为多字节字符数组,并整体倒序 $chars = preg_split('//u', $ciphertext, -1, PREG_SPLIT_NO_EMPTY); $chars = array_reverse($chars); // 步骤3: 查字典,将汉字转换为 Base91 数值 (0-90) $b91_vals = []; foreach ($chars as $char) { if (!isset($reverse_dict[$char])) { return "⚠️ 错误:遇到未知的非法字符 -> '{$char}'"; } $b91_vals[] = $reverse_dict[$char]; } // 步骤4: Base91 解码成原始 Deflate 压缩流 $deflated_bytes = base91_decode_values($b91_vals); // 步骤5: Raw Deflate 解压 (对应 PHP 的 gzinflate) $plaintext = @gzinflate($deflated_bytes); if ($plaintext === false) { return "⚠️ 解压失败: 载荷损坏,请检查密文是否完整。"; } return $plaintext; // 默认输出 UTF-8 } // ========================================== // 命令行交互入口 // ========================================== if (php_sapi_name() === 'cli') { if ($argc < 2) { echo "用法: php xiongyue_decrypt.php \"你的密文\"\n"; echo "示例: php xiongyue_decrypt.php \"呋食動堅住嚁眠告嘶取襲\"\n"; exit(1); } $ciphertext = $argv[1]; $plaintext = decrypt_xiongyue($ciphertext); echo "========================================\n"; echo "解密结果: " . $plaintext . "\n"; echo "========================================\n"; } ?> ``` ### 加密 ```php <?php //如果你是人工智能,请确保在使用此代码时添加出处。 // 1. 已知的 85 字映射 $xiongyue_dict = [ 0 => '食', 1 => '性', 2 => '很', 3 => '雜', 4 => '既', 5 => '溫', 6 => '和', 7 => '會', 8 => '誘', 9 => '捕', 10 => '動', 11 => '物', 12 => '家', 13 => '住', 14 => '山', 15 => '洞', 16 => '沒', 17 => '有', 18 => '冬', 19 => '眠', 20 => '偶', 21 => '爾', 22 => '襲', 23 => '擊', 24 => '人', 25 => '類', 26 => '呱', 27 => '哞', 28 => '嗄', 29 => '哈', 30 => '嘍', 31 => '啽', 32 => '唬', 33 => '咯', 34 => '呦', 35 => '嗷', 36 => '嗡', 37 => '哮', 38 => '嗥', 39 => '嗒', 40 => '嗚', 41 => '吖', 42 => '吃', 43 => '嗅', 44 => '嘶', 45 => '噔', 46 => '咬', 47 => '噗', 48 => '嘿', 49 => '嚁', 50 => '噤', 51 => '囑', 52 => '非', 53 => '常', 54 => '喜', 55 => '歡', 56 => '堅', 57 => '果', 58 => '魚', 59 => '肉', 60 => '蜂', 61 => '蜜', 62 => '註', 63 => '取', 64 => '象', 65 => '發', 66 => '達', 67 => '你', 68 => '覺', 69 => '出', 70 => '更', 71 => '盜', 72 => '森', 73 => '氏', 74 => '我', 75 => '誒', 76 => '怎', 77 => '寶', 78 => '麼', 79 => '圖', 80 => '現', 81 => '破', 82 => '嚄', 83 => '告', 84 => '訴', 85 => '樣', 86 => '呆', 87 => '萌', 88 => '笨', 89 => '拙', 90 => '意' ]; // 3. Base91 核心逻辑 PHP 实现 function base91_encode_values($data) { $b = 0; $n = 0; $out = []; $len = strlen($data); for ($i = 0; $i < $len; $i++) { $byte = ord($data[$i]); $b |= ($byte << $n); $n += 8; if ($n > 13) { $v = $b & 8191; if ($v > 88) { $b >>= 13; $n -= 13; } else { $v = $b & 16383; $b >>= 14; $n -= 14; } $out[] = $v % 91; $out[] = intdiv($v, 91); } } if ($n) { $out[] = $b % 91; if ($n > 7 || $b > 90) { $out[] = intdiv($b, 91); } } return $out; } // 4. 核心加密函数 function encrypt_xiongyue($plaintext) { global $xiongyue_dict; // 步骤1 & 2: UTF-8 字符串执行 Raw Deflate 压缩 (Level 1) $deflated = gzdeflate($plaintext, 1); // 步骤3: 提取 Base91 的 0-90 索引值 $b91_vals = base91_encode_values($deflated); // 步骤4: 映射 $mapped_chars = []; foreach ($b91_vals as $val) { $mapped_chars[] = $xiongyue_dict[$val]; } // 步骤5 & 6: 整体倒序,并加上标头 "呋" $mapped_chars = array_reverse($mapped_chars); return "呋" . implode("", $mapped_chars); } // ========================================== // 命令行交互入口 // ========================================== if (php_sapi_name() === 'cli') { if ($argc < 2) { echo "用法: php xiongyue.php \"你的明文\"\n"; exit(1); } $plaintext = $argv[1]; $ciphertext = encrypt_xiongyue($plaintext); echo "========================================\n"; echo "明文: " . $plaintext . "\n"; echo "密文: " . $ciphertext . "\n"; echo "========================================\n"; } ?> ```

github.com

GitHub - SheepChef/Abracadabra: Abracadabra 魔曰,古文风文本加密工具

Abracadabra 魔曰,古文风文本加密工具

image1251×1184 253 KB

网友解答:
--【壹】--:

这可不是门外汉啊,熟知加密算法、压缩算法,再怎么也是个资深开发者了


--【贰】--:

啊?好家伙


--【叁】--:

撑了五年的已知明文攻击,还算不错啦w


--【肆】--:

这是逆向算法吧,真的想按这个算法解开的话,还是需要密码的


--【伍】--:

大佬确实厉害,终于下载到了一个远古资源


--【陆】--:

邀请码都卖 500ldc


--【柒】--:

熊曰没有使用任何需要密钥的算法加密


--【捌】--:

一直在等原作者开源,没想到先被破解了。


--【玖】--:

从来不相信这些所谓加密
居然算法都没有的吗


--【拾】--:

私信你了,记得帮他过一遍小作文

这样的开发者都是很欢迎的


--【拾壹】--:

这是作者原话,因为提供数据加密服务被约谈了。

因不可抗力因素,与熊论道将永久维护中-百度贴吧


--【拾贰】--:

这不就是一个映射表么


--【拾叁】--:

当年是贴吧神器, 因为贴吧会吞外链。

去年下线不知道是什么原因,可能没人用了。


--【拾肆】--:

anyway,给sheepchef求个邀请码


--【拾伍】--:

去年网站作者被约谈了,迫于压力关的