一、全局公钥(所有加密 MIX 共用)

RA2/YR 的加密 MIX 全部共用同一把西木(Westwood)类 RSA 公钥:

  • 模数(base64):AihRvNoIbTn85FZRYNZRcT+i6KpU+maCsEqr3Q5q+LDB5tH7Tz2qQ38V

  • 指数:0x10001

即 core/mixfile.py 里的 _PUBKEY_B64 + _EXP,2000 年起由 XCC 公开(公开知识)。

每个加密 MIX 头里还有一段 80 字节 key_source,用它(配合上面的全局公钥)推导出该文件专属的 56 字节 Blowfish 密钥。所以"公钥"全局只有一把,"密钥"每个加密文件各一把。

二、flags 含义

  • 0x00010000 = 带 SHA1 校验和尾(仍是明文包,可正常解析)

  • 0x00020000 = RSA + Blowfish 加密头部(ra2.mix / ra2md.mix / language.mix)

  • 0x30000 = 上面两者叠加(加密 + SHA1 尾)

  • 0xd4000010 / 0x02e0000a = MO 私有保护格式(索引被故意打乱,无标准公钥可解)

三、全部 MIX 文件一览

文件

大小(MB)

flags

类型

密钥

ra2.mix

281.9

0x30000

加密 + SHA1 尾

见第四节

ra2md.mix

204.5

0x30000

加密 + SHA1 尾

见第四节

language.mix

53.1

0x30000

加密 + SHA1 尾

见第四节

langmd.mix

84.9

0x10000

明文 + SHA1 尾

无(不加密)

Map Editor\marble.mix

11.0

0x10000

明文 + SHA1 尾

无

expandmo94.mix

260.4

0x0

明文

无

expandmo95.mix

326.7

0x0

明文

无

expandmo96.mix

281.6

0x0

明文

无

expandmo97.mix

301.7

0x0

明文

无

expandmo98.mix

6.8

0x0

明文

无

expandmo99.mix

11.0

0x0

明文

无(rulesmo.ini / artmo.ini 就在这里面)

expandmo10.mix

76.9

0xd4000010

MO 私有保护

无标准公钥(索引打乱,解析不了)

expandmo11.mix

46.9

0x02e0000a

MO 私有保护

无标准公钥

四、三把加密 MIX 各自的 key_source / Blowfish 密钥

ra2.mix

  • key_source (80B):
    7ad285eac52c40068ae8c3962366a5d1f77c4b04d335c190cadabb8c9b25e408654ba327d3db580a30a0d97a6005caa127c839c1f5a28094a6aa4b1ab91156ab881e3061afa04c614d96f580b5753e03

  • Blowfish (56B):
    32a29e4ba4231af6d70bd9181818181818181818181818181818181818181818372d57aa86c2ac04f454babbbbbbbbbbbbbbbbbbbbbbbbbb

ra2md.mix

  • key_source (80B):
    14b9ca52002b8edd5134483fdc97e4d3b692a017c649ca31649b5ce2532c740a7cbbed89b8ea13498ed103323fbe74980d7acdb586336a1dde055c7d44a922a5a9fd619330542d8a811f310ca8e34d4d

  • Blowfish (56B):
    86cc35620a8a8caa65e42b1ecc181818181818181818181818181818181818182c394e6db40a7042278e39fbfebbbbbbbbbbbbbbbbbbbbbb

language.mix

  • key_source (80B):
    fc32f26b9a1343437596415049ddd93f7b0ffe67d8ba79f87cc7d7daa1ac1a79b8a8a7871852cb46a4c1d80f931fe7fadd8bb2c62adfbc5268fbf88ba03c17b1c5830fa2f131ac45492cd96776bd4f12

  • Blowfish (56B):
    0f5c953018181818181818181818181818181818181818181818181818181818dd1de7cbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb

五、要点

  1. 被西木公钥 + RSA 加密的只有 ra2.mix / ra2md.mix / language.mix 三个核心包;其余 MO 扩展包(expandmo94~99)全是明文,因此项目能直接按名字 / CRC 抽取 rulesmo.ini、artmo.ini 和图标。

  2. expandmo10 / expandmo11 用 MO 自己的私有保护(flags 0xd4000010 / 0x02e0000a,索引被打乱),没有标准公钥可解 —— 这就是 gameres.py 所说"这些单位没有图标"的原因;上面那把 0x10001 全局公钥对它们无效。