更新 原来的问题不再是这个问题的合适问题,所以我将不理会这个问题,以展示我尝试/学到的内容和背景。很明显,这不仅仅是“Base64 变体”,而且涉及更多。
背景: 我在python 3.x中编程主要是为了与开源程序Blender一起使用。我是一名新手/业余级别的程序员,但我非常了解这些大概念,我已经阅读了与我的问题相关的这些文章。
问题: 我有一个二进制文件,其中包含对应于每个顶点(浮点数)的 x、y、z 坐标和构成网格面的顶点索引的 3d 网格数据(浮点数列表和整数列表)(整数)。该文件以一种xml'ish的感觉组织......
<SomeFieldLabel and header like info>**thensomedatabetween**</SomeFieldLabel>
这是“顶点”字段中的示例
<Vertices vertex_count="42816" base64_encoded_bytes="513792" check_value="4133547451">685506bytes of b64 encoded data
</Vertices>
- “ Vertices ”和“ /Vertices ”之间有685506字节的数据
- 这些字节仅包含 aa、AZ、0-9 和 +,/,这是 base64 的标准
- 当我抓取这些字节并在 python 中使用标准 base64decode 时,我得到了 513792 个字节
- 如果可以相信 vertex_count="42816",那么每个顶点应该需要 42816*12bytes 来表示 x,y,z。42816*12 = 513792。非常好。
- 现在,如果我尝试将解码的字节解压缩为 32 位浮点数,我会得到垃圾......所以有些东西是 ammis。
我在想某处有一个额外的加密步骤。也许有翻译表、旋转密码或某种流密码?奇怪的是字节数是正确的,但结果却不应该限制可能性。有任何想法吗?下面是两个文件扩展名更改为 *.mesh 的示例文件。我不想公开这种文件格式,只想为 Blender 编写一个导入器,以便我可以使用模型。
这是两个示例文件。我已经从 Vertices 和 Facets 字段中提取了原始二进制文件(不是 b64 解码的),并从公司提供的此类文件的“查看器”中提供了边界框信息。
示例文件 1
- 未修改的文件
- 顶点二进制:
- 方面二进制:
- 解密数据: 这是一个包含解密顶点字段和解密面字段(分别为mesh2.vertices 和mesh2.faces)的.zip。它还包含一个 .stl 网格文件,可以在许多应用程序中查看/打开。
示例文件 2
关于顶点字段的说明
- 标头指定 vertex_count
- 标头指定 base64_encoded_bytes,这是发生 base64 编码之前的字节数
- 标头指定了一个“check_value”,其重要性尚未确定
- 字段中的数据只包含标准的base64字符
- 在标准 base64 解码后,输出数据具有...长度 = vertex_count*12 = base64_encoded_bytes。b64 输出中偶尔会多出 4 个字节?- 编码/解码字节的比率是 4/3,这也是典型的 base64
关于 Facets 字段的说明
- 标头指定了一个 facet_count
标头 base64_encoded_bytes 是发生 base64 编码之前的字节数
base64_encoded_bytes/facet_count 的比率似乎变化很大。从 1.1 到大约 1.2。如果将它们编码为对应于顶点索引的 3x4 字节整数,我们预计比率为 12。所以要么这个字段被压缩,要么模型被 三角形带保存,或者两者兼而有之:-/
更多窥探
我打开了公司提供的 viewer.exe(在十六进制编辑器中)以查看这些文件(也是我获得边界框信息的地方)。这里有一些我觉得有趣的片段,可以进一步搜索。
f_LicenseClient...Ì.@......m_wApplicationID......@......f_bSiteEncryptionActive......@......f_bSaveXXXXXXInternalEncrypted......@...... ..f_bLoadXXXXXXInternalEncrypted...¼!@......f_strSiteKey....í†......
在 LoadXXXXXXInternalEncrypted 和 SaveXXXXXXInternalEncrypted 中,我用 XX 屏蔽了公司名称。看起来除了简单的 base64 表变体之外,我们肯定还有一些加密。
SaveEncryptedModelToStream........Self...pUx....Model...^ÃC....Stream....
在我看来,这就像一个关于如何保存加密模型的函数定义。
DefaultEncryptionMethod¼!@........ÿ.......€...€ÿÿ.DefaultEncryptionKey€–†..ÿ...ÿ.......€... .ÿÿ.DefaultIncludeModelData –†..ÿ...ÿ.......€...€ÿÿ.DefaultVersion.@
啊……现在这很有趣。默认加密密钥。请注意,每个描述符之间有 27 个字节,它们总是以“ÿÿ”结尾。这是 24 个字节,不包括“ÿÿ”。对我来说,这是一个 192 位的密钥……但谁知道是否所有 24 个字节都对应于密钥?有什么想法吗?
80 96 86 00 18 00 00 FF 18 00 00 FF 01 00 00 00 00 00 00 80 01 00 00 00
代码片段
为了节省这个线程的空间,我把这个脚本放在我的下拉框中以供下载。它读取字段,从顶点和面字段中提取基本信息,并打印出一堆东西。您可以取消注释末尾以使其将数据块保存到单独的文件中以便于分析。
basic_mesh_read.py
这是我用来在标准 base64 库上尝试所有“合理”变体的代码。 try_all_b64_tables.py