截止到2026.2.1 官方的mdxbuilder的加密几乎等于没有,并且新的4.0 builder 更易被破解
先来看mdx 2.0 文件不加密与加密的区别,mdx 2.0由mdxbuilder 3.0 制作
前面是文件头,可以看到在软件中使用加密密钥仅额外加密了哪哪数的部分(蓝底),比如对应的字节数块数还有词条数等,其他的也是所有实际的数据均不额外加密
可以看到78DA的zlib压缩的头部,正好zlib压缩末尾附带个原数据的adler32(红线),mdx 2.0 的block又有adler32,能看到出现了两次,由于词条较少只有1个索引块,红线前的数据用来定位词条在哪个索引块,始终经处理;
后面则是一些存储词条的数据块的信息,8字节,但数据不大高位都为0,接着是各个数据块了,还是能看到78DA的zlib压缩的头部,经解压就能得到原数据。
得出:没密码,寻找这些也很简单
现在来看看mdx 3.0 经加密后是什么样的。mdx 3.0 由mdxbuilder 4.0 rc 2 制作
依然是不同数据块,22表示被zlib压缩然后经过salsa20/8加密,10表示后面块中的前多少字节被加密,10》16也就是前16字节,无论是否填密码,都被加密,若有密码则用到密码解密
细心的可能发现了,后面被加密的部分的前两字节一样啊?!
因为 流加密算法(比如salsa)重用了key和nonce,key为密钥,加密算法经过key得出密钥流,再与明文D异或得到密文X,不同nonce保证得出的密钥流keyStream不重复,那重复了会发生什么?
X1 = D1 XOR keyStream
X2 = D2 XOR keyStream
可得出
X1 xor X2 = (D1 xor kS) xor (D2 xor kS)
如果密钥流相同,则被抵消,X1 xor X2 = D1 xor D2 ,虽然不能得到明文,但得到了明文的异或值,一些场景极易破解,比如直接加密文本文档
更严重的是,知道原始数据,则可异或算出密钥流,从而得到其他明文,mdx 3.0 不同部分的末尾有段固定的仅部分加密的xml,比如<RecordData encoding=……,知道了明文,则密钥流已知,其他密文不再是密文,哪怕没密钥。由于不涉及其他查找,破解几乎没有难度。


