Update原来的问题不再是这个问题的适当问题,所以我将单独保留这个问题来演示我尝试/学到的内容和背景。很明显,这不仅仅是一个“Base64 变体”,而且涉及更多一些。
背景:我使用 python 3.x 进行编程主要是为了与开源程序 Blender 一起使用。我是一名新手/业余级程序员,但我对大概念了解得相当好
我已阅读与我的问题相关的这些文章。
- 维基百科上的 Base64 http://en.wikipedia.org/wiki/Base64
- Base64 可以让你被捕 (pdf) http://www.sans.org/reading-room/whitepapers/auditing/base64-pwned-33759
- 堆栈溢出讨论 https://stackoverflow.com/questions/4070693/why-base64-encryption
- 其他一些
Problem:我有一个二进制文件,其中包含与每个顶点(浮点数)的 x、y、z 坐标相对应的 3d 网格数据(浮点数列表和整数列表)以及构成网格面的顶点索引(整数) 。该文件以 xml 的方式组织......
<SomeFieldLabel and header like info>**thensomedatabetween**</SomeFieldLabel>
这是“顶点”字段中的示例
<Vertices vertex_count="42816" base64_encoded_bytes="513792" check_value="4133547451">685506bytes of b64 encoded data
</Vertices>
- "之间有685506个字节的数据Vertices" and "/顶点"
- 这些字节仅包含 a-a、A-Z、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
- 未修改的文件 http://dl.dropbox.com/u/2586482/Mesh%20Data%20Demo/model2.mesh
- 顶点二进制: http://dl.dropbox.com/u/2586482/Mesh%20Data%20Demo/model2_base64vertices.data
- 面二进制: http://dl.dropbox.com/u/2586482/Mesh%20Data%20Demo/model2_base64faces.data
-
解密数据: http://dl.dropbox.com/u/2586482/decrypted%20data.zip这是一个 .zip,包含解密的顶点字段和解密的面字段(分别为 mesh2.vertices 和 mesh2.faces)。它还包含一个 .stl 网格文件,可以在许多应用程序中查看/打开。
示例文件2
- 未修改的文件 http://dl.dropbox.com/u/2586482/Mesh%20Data%20Demo/model3.mesh
- 顶点二进制: http://dl.dropbox.com/u/2586482/Mesh%20Data%20Demo/model3_base64vertices.data
- 面二进制: http://dl.dropbox.com/u/2586482/Mesh%20Data%20Demo/model3_base64faces.data
- 边界框:最小值[-4.6, -40.3, -7.3] 最大值[7.5, -23.1, 2.6]
关于“顶点”字段的注释
- 标头指定 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 字节整数。
因此,要么压缩该字段,要么保存模型三角条 http://en.wikipedia.org/wiki/Triangle_strip, 或两者 :-/
更多窥探
我打开了公司提供的viewer.exe(在十六进制编辑器中)来查看这些文件(也是我获取边界框信息的地方)。以下是一些我觉得有趣并且可以进一步搜索的片段。
f_LicenseClient...Ì[电子邮件受保护] /cdn-cgi/l/email-protection[电子邮件受保护] /cdn-cgi/l/email-protection[电子邮件受保护] /cdn-cgi/l/email-protection[电子邮件受保护] /cdn-cgi/l/email-protection_bLoadXXXXXX内部加密...¼[电子邮件受保护] /cdn-cgi/l/email-protection_strSiteKey....í†......
在LoadXXXXXXInternalEncrypted和SaveXXXXXXInternalEncrypted中,我用XX屏蔽了公司名称。看起来除了简单的 Base64 表变体之外,我们肯定还有一些加密。
SaveEncryptedModelToStream.................自...pUx....模型...ˆàC....流....
对我来说,这看起来像是关于如何保存加密模型的函数定义。
DefaultEncryptionMethod¼!@........ÿ.......€...€ÿÿ.DefaultEncryptionKey€–†....ÿ...ÿ.......€... .ÿÿ.DefaultInincludeModelData –†....ÿ...ÿ.......€...€ÿÿ.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 http://dl.dropbox.com/u/2586482/Mesh%20Data%20Demo/basic_mesh_read.py
这是我用来尝试标准 Base64 库的所有“合理”变体的代码。try_all_b64_tables.py http://dl.dropbox.com/u/2586482/mesh%20data%20demo/try_all_b64_tables.py