如何在Java中解压加密的ODT OpenDocument文件

4
我有一个加密的ODT(Open Document Text)文件,需要解压缩。ODT是一个ZIP文件。加密的ODT是一个普通的ZIP文件,只是ZIP文件中的一些文件被加密了。
在测试中使用ZipFile可以正常工作,但我不能真正使用ZipFile,因为我有一个内存中的流,我不想使用文件。
因此我使用ZipInputStream。但是使用ZipInputStream.getNextEntry()会抛出可怕的“只有DEFLATED条目才能有EXT描述符”异常。
据我所知,它会在ZIP包中第一个加密文件(例如content.xml)上抛出异常。因为OpenOffice已经加密了xml文件,可能没有压缩它的必要,并且它以未压缩的形式存储在ZIP包中。
但是ZipInputStream似乎有问题,我看不到解决的方法。
是有什么建议吗?
注:加密的ODT文件由OpenOffice Writer 3.2.1创建。是的,标准ZipInputStream甚至无法枚举其中的条目。

你尝试理解为什么ZipFile起作用并模仿这段代码了吗? - AlexR
ZipFile非常快地调用本地代码来处理文件。不幸的是,我需要将其放在内存流中。 - romeok
3个回答

1

好主意。看起来很有前途。 - David J. Liszewski

1
问题与加密无关,而是因为ZipInputStream不希望(也不知道如何处理)在相关数据未被压缩(即存储为未压缩的原始数据)时出现EXT描述符。这可能是ZipInputStream中的一个缺陷(“错误”),但我对zip规范不够熟悉,无法确定。
一种不优雅、甚至非常丑陋的解决方法是将流持久化到临时文件中,然后作为ZipFile进行处理。
(我是ODFind的作者,也是上述“解密ODF文件”文档的作者。)

0

你是否曾经了解过RinglordODFind中是如何读取加密的ODF文件的?这个ODF文档(可以通过Google查看HTML 这里)声称仅依靠Java库无法解密OpenOffice.org文档。然而,作者解释了如何利用ODF清单RFC 2989JBoss3中的PBKDF2Engine以及作者的一些原创发现来解密ODF文件的content.xml负载。

祝一切顺利。

免责声明:尽管上面的每个链接都指向Ringlord内容,但我与Ringlord没有任何关联。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接