`
xjlsgcjdtc
  • 浏览: 7179 次
  • 性别: Icon_minigender_1
  • 来自: 常州
社区版块
存档分类
最新评论

winzipaes文件名乱码解决方案

阅读更多
winzipaes是一个开源的基于javaZip的加密压缩工具
目前代码托管在google上(http://code.google.com/p/winzipaes)
需要依赖bcprov的包,去maven上拿吧(http://search.maven.org/remotecontent?filepath=bouncycastle/bcprov-jdk16/140/bcprov-jdk16-140.jar)

用过的人可能都会发现当使用它,往压缩包里添加的文件名有汉字时,会出现乱码
这是因为winzipaes默认使用的iso-8859-1编码格式,不乱吗才怪啊。。

下面是我的修改方法,基于的是(winzipaes_src_20120104.zip)不对的地方,大虾别拍我啊

首先在ExtZipOutputStream里添加一个设置编码格式的方法,如下:
public void setEncoding(String encoding) {
		this.encoding = encoding;
		utf8Flg |= isUTF8(encoding);
	}

protected boolean isUTF8(String encoding) {
        if (encoding == null) {
            // check platform's default encoding
            encoding = System.getProperty("file.encoding");
        }
        return "UTF8".equalsIgnoreCase(encoding)
            || "UTF-8".equalsIgnoreCase(encoding);
    }

这里有个地方需要注意,当文件名是utf8编码格式的时候,需要设置Zip包的通用位标志
第十一个比特为1,代码修改如下:

修改ExtZipEntry类的initEncryptedEntry方法
public void initEncryptedEntry(boolean utf8Flg) {
		setCrc(0); // CRC-32 / for encrypted files it's 0 as AES/MAC checks integritiy

		this.flag |= 1; // bit0 - encrypted
		
		if (utf8Flg) {
			this.flag |=(1 << 11);  // 通用位标志第十一个比特为1
		}
		//flag |= 8; // bit3 - use data descriptor

		....
	}

另附上ZIP包的压缩格式,想深入研究的同学可以参考下:http://www.pkware.com/documents/casestudies/APPNOTE.TXT


然后将ExtZipOutputStream的134行和158行的iso-8859-1替换成上面设置的编码格式
接着,再将106行文件名长度取得的代码改成entry.getName().getBytes(encoding).length

以上就是大致的修改点。
把完整的修改代码也打了个包,省得大家再去修改啦,希望对大家有帮助。

写个简单的使用sample吧:

AESEncrypterBC bc = new AESEncrypterBC();
AesZipFileEncrypter azfe = new AesZipFileEncrypter(
	new File("要生成的zip包名.zip"), bc);
azfe.setEncoding("UTF-8");  // 编码格式是在这传进去的
azfe.add(new File("要往zip包里添加的文件路径"), "zip包里显示的文件名字", "密码");
azfe.close();
分享到:
评论
3 楼 jn-river 2012-07-27  
感觉LZ有些地方没写全。

这里我来帮忙补充一下,
我看了LZ的source,ZipEntry类中LZ改用了一个引用,
原先是java.util.zip.ZipEntry,
被LZ换为了org.apache.tools.zip.ZipEntry,
(这里我引用的是ant-1.6.jar,版本不确定,但应该就是这个jar了)

非常感谢LZ分享,
帮助很大,也学到了很多。
多谢,多谢!

2 楼 xjlsgcjdtc 2012-04-22  
kellyLin 写道
public void initEncryptedEntry(boolean utf8Flg)

想问下 上面的方法什么时候用到了?   utf8Flg是什么时候传入的?

设置编码的地方在ExtZipOutputStream  用的地方在ExtZipEntry

想问下 是怎么传递utf8Flg 的

我在上面补充了一个使用的例子,希望对你有帮助!
1 楼 kellyLin 2012-04-16  
public void initEncryptedEntry(boolean utf8Flg)

想问下 上面的方法什么时候用到了?   utf8Flg是什么时候传入的?

设置编码的地方在ExtZipOutputStream  用的地方在ExtZipEntry

想问下 是怎么传递utf8Flg 的

相关推荐

    winzipaes20120809.jar

    winzipaes20120809.jar

    java使用winzipaes打包必须包

    Java 使用 WinZipAES 打包是一项技术操作,它涉及到Java编程、加密算法和第三方库的集成。WinZipAES是WinZip软件中的一种高级加密标准,提供了比传统ZIP格式更强的数据安全性,尤其在处理包含敏感信息的文件时。下面...

    Java使用winzipaes对zip文件的操作,支持中文

    winzipaes是Java操作ZIP文件的开源项目,支持密码,但不支持中文文件名。此文件中包含修改后的源码、文档、jar包、依赖包及示例程序等文件。可以压缩文件名含有中文的文件,修改之处可以参看博客...

    Java对zip文件的操作winzipaes源码,支持中文

    winzipaes是Java操作ZIP文件的开源项目,支持密码,但不支持中文文件名,此文件中是修改后的源码,可以压缩文件名含有中文的文件,修改之处可以参看博客http://xjlsgcjdtc.iteye.com/blog/1439514或者...

    winzipaes.rar

    "winzipaes.rar"这个压缩包文件似乎包含了解决Java环境中ZIP文件加解密问题的相关资源。让我们深入探讨一下这个主题。 首先,ZIP是一种广泛使用的文件压缩格式,它允许用户将多个文件打包成一个单一的档案,以便于...

    winziaes.jar(winzipaes_src_20110222.zip)

    本文将聚焦于名为"winziaes.jar"的文件,该文件来源于"winzipaes_src_20110222.zip"压缩包,这是一款与WinZip AES加密技术相关的源代码库。我们将深入探讨WinZip AES加密技术的原理、应用以及其在源代码中的实现。 ...

    winzipaes文件加密和解压的工具包,已做了源码修改和jar包整合

    《深入理解WinZip AES文件加密与解压:Java实现与应用》 WinZip AES(Advanced Encryption Standard)是一种广泛应用于文件加密的标准,它以其强大的安全性在众多加密算法中脱颖而出。AES的采用使得用户能够对文件...

    winzipaes的java对文件加密和解密的方法以及中文文件的支持,亲测可用

    winzipaes支持的java springboot的文件加密和解密的方法以及对中文文件名文件的上传的utf-8编码支持,已全部代码做了二次代码优化,需要自己手动导入包。以及pom的支持,有需要的可以看下源码,或者联系我本人,博客...

    Java解压和压缩带密码的zip文件过程详解

    为了解决ZIP压缩文件的密码问题,可以使用winzipaes开源项目,该项目支持AES压缩和解压zip文件(This library only supports Win-Zip's 256-Bit AES mode.)。winzipaes项目依赖bcprov的jar包,该项目可以解决ZIP...

    JAVA带密码的压缩.zip

    Java 个人练习Demo ,由于JDK自带的ZIP操作接口并不支持密码、中文文件名,这里使用了winzipaes开源项目作为解压,其支持带密码压缩和解压。源码、文档、jar包、依赖包及示例程序等文件。可以压缩文件名含有中文的...

    zip压缩算法原理与实现

    ZIP文件由一系列称为“存档项”的记录组成,每个存档项包含文件的元数据(如文件名、创建日期等)和压缩数据。ZIP格式支持多种不同的压缩算法,最常见的是DEFLATE,它是ZIP的标准压缩方法。 **二、DEFLATE压缩算法*...

    dotnetzip

    "dotnetzip"是一个在.NET平台上用于创建、读取和修改ZIP文件的开源库。它为C#、VB.NET、F#等.NET语言提供了方便的API,使得...无论是简单的日常任务还是复杂的自动化脚本,dotnetzip都能提供高效且灵活的解决方案。

    文件压缩加密(AES)

    另一方面,`winzipaes_zh_CN_supported.zip`可能包含了关于WinZip AES加密的中文文档或示例。WinZip是Windows平台上的知名压缩软件,它引入了AES加密,增强了压缩文件的安全性。WinZip AES支持128位和256位的密钥...

Global site tag (gtag.js) - Google Analytics