对文件压缩加密/解密解压缩的例子,DES/RSA [转]

标签: 文件压缩 加密 解密 | 发表时间:2013-11-15 17:52 | 作者:尘枉_yjava
出处:http://www.iteye.com
RSA压缩加密/解压缩解密
import java.io.File;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.ObjectInputStream;
import java.io.ObjectOutputStream;
import java.security.Key;
import java.security.KeyPair;
import java.security.KeyPairGenerator;
import java.security.PrivateKey;
import java.security.PublicKey;
import java.security.SecureRandom;
import java.util.Properties;
import java.util.UUID;
import java.util.zip.ZipEntry;
import java.util.zip.ZipInputStream;
import java.util.zip.ZipOutputStream;

import javax.crypto.Cipher;

/**
* 对文件压缩加密/解密解压缩 对象类
*
*/
public class ZipEncrypt {
private static PrivateKey privateKey;
private static PublicKey publicKey;
private static void directoryZip(ZipOutputStream out, File f, String base)
   throws Exception {
  // 如果传入的是目录
  if (f.isDirectory()) {
   File[] fl = f.listFiles();
   // 创建压缩的子目录
   out.putNextEntry(new ZipEntry(base + "/"));
   if (base.length() == 0) {
    base = "";
   } else {
    base = base + "/";
   }
   for (int i = 0; i < fl.length; i++) {
    directoryZip(out, fl[i], base + fl[i].getName());
   }
  } else {
   // 把压缩文件加入rar中
   out.putNextEntry(new ZipEntry(base));
   FileInputStream in = new FileInputStream(f);
   byte[] bb = new byte[2048];
   int aa = 0;
   while ((aa = in.read(bb)) != -1) {
    out.write(bb, 0, aa);
   }
   in.close();
  }
}

/**
  * 压缩文件
  * @param zos
  * @param file
  * @throws Exception
  */
private static void fileZip(ZipOutputStream zos, File file)
   throws Exception {
  if (file.isFile()) {
   zos.putNextEntry(new ZipEntry(file.getName()));
   FileInputStream fis = new FileInputStream(file);
   byte[] bb = new byte[2048];
   int aa = 0;
   while ((aa = fis.read(bb)) != -1) {
    zos.write(bb, 0, aa);
   }
   fis.close();
   System.out.println(file.getName());
  } else {
   directoryZip(zos, file, "");
  }
}

/**
  * 解压缩文件
  *
  * @param zis
  * @param file
  * @throws Exception
  */
private static void fileUnZip(ZipInputStream zis, File file)
   throws Exception {
  ZipEntry zip = zis.getNextEntry();
  if (zip == null)
   return;
  String name = zip.getName();
  File f = new File(file.getAbsolutePath() + "/" + name);
  if (zip.isDirectory()) {
   f.mkdirs();
   fileUnZip(zis, file);
  } else {
   f.createNewFile();
   FileOutputStream fos = new FileOutputStream(f);
   byte b[] = new byte[2048];
   int aa = 0;
   while ((aa = zis.read(b)) != -1) {
    fos.write(b, 0, aa);
   }
   fos.close();
   fileUnZip(zis, file);
  }
}

/**
  * 对directory目录下的文件压缩,保存为指定的文件zipFile
  *
  * @param directory
  * @param zipFile
  */
private static void zip(String directory, String zipFile) {
  try {
   ZipOutputStream zos = new ZipOutputStream(new FileOutputStream(
     zipFile));
   fileZip(zos, new File(directory));
   zos.close();
  } catch (Exception e) {
   e.printStackTrace();
  }
}

/**
  * 解压缩文件zipFile保存在directory目录下
  *
  * @param directory
  * @param zipFile
  */
private static void unZip(String directory, String zipFile) {
  try {
   ZipInputStream zis = new ZipInputStream(
     new FileInputStream(zipFile));
   File f = new File(directory);
   f.mkdirs();
   fileUnZip(zis, f);
   zis.close();
  } catch (Exception e) {
   e.printStackTrace();
  }
}

/**
  * 根据key的路径文件获得持久化成文件的key
  * <P>
  * 例子: RsaEncrypt.getKey("c:/systemkey/private.key");
  *
  * @param keyPath
  * @return
  */
public static Key getKey(String keyPath) throws Exception {
  Key key = null;
  FileInputStream fis = new FileInputStream(keyPath);
  ObjectInputStream ofs = new ObjectInputStream(fis);
  key = (Key) ofs.readObject();
  return key;
}

/**
  * 把文件srcFile加密后存储为destFile
  *
  * @param srcFile
  * @param destFile
  */
private static void encrypt(String srcFile, String destFile, Key privateKey)
   throws Exception {
  Cipher cipher = Cipher.getInstance("RSA");
  cipher.init(Cipher.ENCRYPT_MODE, privateKey);
  FileInputStream fis = new FileInputStream(srcFile);
  FileOutputStream fos = new FileOutputStream(destFile);
  byte[] b = new byte[53];
  while (fis.read(b) != -1) {
   fos.write(cipher.doFinal(b));
  }
  fos.close();
  fis.close();
}

/**
  * 把文件srcFile解密后存储为destFile
  *
  * @param srcFile
  * @param destFile
  * @param privateKey
  * @throws Exception
  */
private static void decrypt(String srcFile, String destFile, Key privateKey)
   throws Exception {
  Cipher cipher = Cipher.getInstance("RSA");
  cipher.init(Cipher.DECRYPT_MODE, privateKey);
  FileInputStream fis = new FileInputStream(srcFile);
  FileOutputStream fos = new FileOutputStream(destFile);
  byte[] b = new byte[64];
  while (fis.read(b) != -1) {
   fos.write(cipher.doFinal(b));
  }
  fos.close();
  fis.close();
}

/**
  * 对目录srcFile下的所有文件目录进行先压缩后操作,然后保存为destfile
  *
  * @param srcFile
  *            要操作的目录 如c:/test/test
  * @param destfile
  *            压缩加密后存放的文件名 如c:/加密压缩文件.zip
  * @param keyfile
  *            公钥存放地点
  */
public static void encryptZip(String srcFile, String destfile, String keyfile) throws Exception {
  SecureRandom sr = new SecureRandom();
  KeyPairGenerator kg = KeyPairGenerator.getInstance("RSA");
  kg.initialize(512, sr);
  //产生新密钥对
  KeyPair kp = kg.generateKeyPair();
  //获得私匙
  ZipEncrypt.privateKey = kp.getPrivate();
  //获得公钥
  ZipEncrypt.publicKey = kp.getPublic();
  File f = new File(keyfile);
  f.createNewFile();
  FileOutputStream fos = new FileOutputStream(f);
  ObjectOutputStream dos = new ObjectOutputStream(fos);
  dos.writeObject(ZipEncrypt.publicKey);
 
  File temp = new File(UUID.randomUUID().toString() + ".zip");
  temp.deleteOnExit();
  // 先压缩文件
  zip(srcFile, temp.getAbsolutePath());
  // 对文件加密
  encrypt(temp.getAbsolutePath(), destfile, privateKey);
  temp.delete();
}

/**
  * 对文件srcfile进行先解密后解压缩,然后解压缩到目录destfile下
  *
  * @param srcfile
  *            要解密和解压缩的文件名 如c:/目标.zip
  * @param destfile
  *            解压缩后的目录 如c:/abc
  * @param publicKey
  *            公钥
  */
public static void decryptUnzip(String srcfile, String destfile,
   Key publicKey) throws Exception {
  // 先对文件解密
  File temp = new File(UUID.randomUUID().toString() + ".zip");
  temp.deleteOnExit();
  decrypt(srcfile, temp.getAbsolutePath(), publicKey);
  // 解压缩
  unZip(destfile, temp.getAbsolutePath());
  temp.delete();
}

public static void main(String args[]) throws Exception {
  File f = new File(".");
  Properties prop = new Properties(); ;
  FileInputStream fis = new FileInputStream("./conf.properties");
  prop.load(fis);
  //要压缩的目录
  String srcPath = prop.getProperty("SRC_PATH");
  //压缩后的存放文件
  String destZip = prop.getProperty("DEST_FILE");
  //压缩加密后的publickey
  String keyfile = prop.getProperty("KEY_FILE");
  ZipEncrypt.encryptZip(srcPath, destZip,keyfile);
 
  /*解密
  ZipEncrypt.decryptUnzip("e:/comXXX/comxxxx.zip", "d:/comxxx", ZipEncrypt
    .getKey("e:/comXXX/public.key"));
  */
}
}








AES压缩加密/解压缩解密,网上一般用base64来对byte[]编码,其实不需要,指定AES/CBC/PKCS5Padding
来指定加密解密时候位数不对的情况下,用pkcs5padding来附加位数,不过这个时候读解密的文件的时候,要多读16位的验证位就不会报异常

import java.io.File;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.ObjectInputStream;
import java.security.Key;
import java.security.SecureRandom;
import java.util.UUID;
import java.util.zip.ZipEntry;
import java.util.zip.ZipInputStream;
import java.util.zip.ZipOutputStream;

import javax.crypto.Cipher;
import javax.crypto.KeyGenerator;
import javax.crypto.SecretKey;
import javax.crypto.spec.IvParameterSpec;
import javax.crypto.spec.SecretKeySpec;

/**
* 对文件加密/解密和压缩/解压缩对象类
* @author 赵成明
*/
public class ZipEncrypt {
        private  void directoryZip(ZipOutputStream out, File f, String base)
                        throws Exception {
                // 如果传入的是目录
            if (f.isDirectory()) {
                File[] fl = f.listFiles();
                // 创建压缩的子目录
                out.putNextEntry(new ZipEntry(base + "/"));
                if (base.length() == 0) {
                    base = "";
                } else {
                    base = base + "/";
                }
                for (int i = 0; i < fl.length; i++) {
                    directoryZip(out, fl[i], base + fl[i].getName());
                }
            } else {
                    // 把压缩文件加入rar中
                out.putNextEntry(new ZipEntry(base));
                FileInputStream in = new FileInputStream(f);
                byte[] bb = new byte[2048];
                int aa = 0;
                while ((aa = in.read(bb)) != -1) {
                        out.write(bb, 0, aa);
                }
                in.close();
            }
        }

        /**
         * 压缩文件
         * @param zos
         * @param file
         * @throws Exception
         */
        private void fileZip(ZipOutputStream zos, File file)
                        throws Exception {
            if (file.isFile()) {
                zos.putNextEntry(new ZipEntry(file.getName()));
                FileInputStream fis = new FileInputStream(file);
                byte[] bb = new byte[2048];
                int aa = 0;
                while ((aa = fis.read(bb)) != -1) {
                        zos.write(bb, 0, aa);
                }
                fis.close();
                System.out.println(file.getName());
            } else {
                directoryZip(zos, file, "");
            }
        }

        /**
         * 解压缩文件
         *
         * @param zis
         * @param file
         * @throws Exception
         */
        private void fileUnZip(ZipInputStream zis, File file)
                        throws Exception {
            ZipEntry zip = zis.getNextEntry();
            if (zip == null)
                return;
            String name = zip.getName();
            File f = new File(file.getAbsolutePath() + "/" + name);
            if (zip.isDirectory()) {
                f.mkdirs();
                fileUnZip(zis, file);
            } else {
                f.createNewFile();
                FileOutputStream fos = new FileOutputStream(f);
                byte b[] = new byte[2048];
                int aa = 0;
                while ((aa = zis.read(b)) != -1) {
                    fos.write(b, 0, aa);
                }
                fos.close();
                fileUnZip(zis, file);
            }
        }

        /**
         * 对directory目录下的文件压缩,保存为指定的文件zipFile
         *
         * @param directory
         * @param zipFile
         */
        private void zip(String directory, String zipFile) {
            try {
                ZipOutputStream zos = new ZipOutputStream(new FileOutputStream(
                                zipFile));
                fileZip(zos, new File(directory));
                zos.close();
            } catch (Exception e) {
                e.printStackTrace();
            }
        }

        /**
         * 解压缩文件zipFile保存在directory目录下
         *
         * @param directory
         * @param zipFile
         */
        private void unZip(String directory, String zipFile) {
            try {
                ZipInputStream zis = new ZipInputStream(new FileInputStream(zipFile));
                File f = new File(directory);
                f.mkdirs();
                fileUnZip(zis, f);
                zis.close();
            } catch (Exception e) {
                e.printStackTrace();
            }
        }

        /**
         * 根据key的路径文件获得持久化成文件的key
         * <P>
         * 例子: RsaEncrypt.getKey("c:/systemkey/private.key");
         *
         * @param keyPath
         * @return
         */
        private Key getKey(String keyPath) throws Exception {
            FileInputStream fis = new FileInputStream(keyPath);
            byte[] b = new byte[16];
            fis.read(b);
            SecretKeySpec dks = new SecretKeySpec(b,"AES");
            fis.close();
            return dks;
        }

        /**
         * 把文件srcFile加密后存储为destFile
         *
         * @param srcFile
         * @param destFile
         */
        private void encrypt(String srcFile, String destFile, Key privateKey)
                        throws Exception {
         SecureRandom sr = new SecureRandom();
            Cipher cipher = Cipher.getInstance("AES/CBC/PKCS5Padding");
            IvParameterSpec spec=new IvParameterSpec(privateKey.getEncoded());
            cipher.init(Cipher.ENCRYPT_MODE, privateKey,spec,sr);
            FileInputStream fis = new FileInputStream(srcFile);
            FileOutputStream fos = new FileOutputStream(destFile);
            byte[] b = new byte[2048];
            while (fis.read(b) != -1) {
                fos.write(cipher.doFinal(b));
            }
            fos.close();
            fis.close();
        }

        /**
         * 把文件srcFile解密后存储为destFile
         *
         * @param srcFile
         * @param destFile
         * @param privateKey
         * @throws Exception
         */
        private void decrypt(String srcFile, String destFile, Key privateKey)
                        throws Exception {
   SecureRandom sr = new SecureRandom();
         Cipher ciphers = Cipher.getInstance("AES/CBC/PKCS5Padding");
         IvParameterSpec spec=new IvParameterSpec(privateKey.getEncoded());
         ciphers.init(Cipher.DECRYPT_MODE,privateKey,spec,sr);  
            FileInputStream fis = new FileInputStream(srcFile);
            FileOutputStream fos = new FileOutputStream(destFile); 
            byte[] b = new byte[2064];
            while (fis.read(b) != -1) {                
                fos.write(ciphers.doFinal(b));
            }
            fos.close();
            fis.close();
        }

        /**
         * 对目录srcFile下的所有文件目录进行先压缩后操作,然后保存为destfile
         *
         * @param srcFile
         *            要操作的目录 如c:/test/test
         * @param destfile
         *            压缩加密后存放的文件名 如c:/加密压缩文件.zip
         * @param keyfile
         *            公钥存放地点
         */
        public void encryptZip(String srcFile, String destfile, String keyfile) throws Exception {
            SecureRandom sr = new SecureRandom();
            KeyGenerator  kg = KeyGenerator.getInstance("AES");
            kg.init(128,sr);
            SecretKey key = kg.generateKey();
            File f = new File(keyfile);
            if (!f.getParentFile().exists())
             f.getParentFile().mkdirs();
            f.createNewFile();
            FileOutputStream fos = new FileOutputStream(f);
            fos.write(key.getEncoded());
            File temp = new File(UUID.randomUUID().toString() + ".zip");
            temp.deleteOnExit();
            // 先压缩文件
            zip(srcFile, temp.getAbsolutePath());
            // 对文件加密
            encrypt(temp.getAbsolutePath(), destfile, key);
            temp.delete();
        }

        /**
         * 对文件srcfile进行先解密后解压缩,然后解压缩到目录destfile下
         *
         * @param srcfile
         *            要解密和解压缩的文件名 如c:/目标.zip
         * @param destfile
         *            解压缩后的目录 如c:/abc
         * @param publicKey
         *            公钥
         */
        public void decryptUnzip(String srcfile, String destfile,
                        String keyfile) throws Exception {
            // 先对文件解密
            File temp = new File(UUID.randomUUID().toString() + ".zip");
            temp.deleteOnExit();
            decrypt(srcfile, temp.getAbsolutePath(), this.getKey(keyfile));
            // 解压缩
            unZip(destfile, temp.getAbsolutePath());
            temp.delete();
        }

        public static void main(String args[]) throws Exception {
      long a = System.currentTimeMillis();
            new ZipEncrypt().encryptZip("e:/com", "e:/comXXX/page.zip","e:/comXXX/public.key");
           
            System.out.println(System.currentTimeMillis()-a);
            a = System.currentTimeMillis();
           
            new ZipEncrypt().decryptUnzip("e:/comXXX/page.zip", "e:/comxxx", "e:/comXXX/public.key");
            System.out.println(System.currentTimeMillis()-a);
        }
}


</script>


出自:http://www.blogjava.net/zhaochengming/archive/2007/09/03/142396.html

已有 0 人发表留言,猛击->> 这里<<-参与讨论


ITeye推荐



相关 [文件压缩 加密 解密] 推荐:

对文件压缩加密/解密解压缩的例子,DES/RSA [转]

- - 行业应用 - ITeye博客
RSA压缩加密/解压缩解密. * 对文件压缩加密/解密解压缩 对象类.   // 如果传入的是目录.    // 创建压缩的子目录.    // 把压缩文件加入rar中.   * 对directory目录下的文件压缩,保存为指定的文件zipFile.   * 解压缩文件zipFile保存在directory目录下.

JAVA实现RSA加密解密

- - CSDN博客推荐文章
提供加密,解密,生成密钥对等方法. RSA加密原理概述   :. RSA的安全性依赖于大数的分解,公钥和私钥都是两个大素数(大于100的十进制位)的函数. 据猜测,从一个密钥和密文推断出明文的难度等同于分解两个大素数的积   .  1.选择两个大素数 p,q ,计算 n=p*q;   .  2.随机选择加密密钥 e ,要求 e 和 (p-1)*(q-1)互质   .

tomcat如何使用Gzip对静态文件压缩

- - 开源软件 - ITeye博客
tomcat7配置gzip没有效果 http://www.oschina.net/question/142859_70497. tomcat7里面js的mime类型改了,新版的是: web.xml. Tomcat配置改为: server.xml . Tomcat 采用的是 HTTP/1.1 的 GZIP 压缩协议,它会根据浏览器送过来的请求中的 accept-encoding 值是否包含 gzip 来判断浏览器是否支持 gzip 压缩协议,如果浏览器支持就启用 gzip 压缩,否则就不进行任何压缩处理.

Java加解密艺术之DES对称加密算法

- - CSDN博客推荐文章
加密的时候使用密钥对数据进行加密,解密的时候使用同样的密钥对数据进行解密 * @see DES是美国国家标准研究所提出的算法. 由于加解密的数据安全性和密钥长度成正比,故DES的56位密钥已经形成安全隐患 * @see 后来针对DES算法进行了改进,有了三重DES算法(也称DESede或Triple-DES).

iOS中使用RSA对数据进行加密解密

- - ITeye博客
RSA算法是一种非对称加密算法,常被用于加密数据传输.如果配合上数字摘要算法, 也可以用于文件签名.. 本文将讨论如何在iOS中使用RSA传输加密数据.. openssl-1.0.1j, openssl需要使用1.x版本, 推荐使用[homebrew](http://brew.sh/)安装.. RSA使用"秘匙对"对数据进行加密解密.在加密解密数据前,需要先生成公钥(public key)和私钥(private key)..

java 实现文件内容的加密和解密

- - 编程语言 - ITeye博客
转载: http://xiaoxiaokuang.iteye.com/blog/1440031. getKey(str);//生成密匙. * 文件file进行加密并保存目标文件destFile中. * @param file 要加密的文件 如c:/test/srcFile.txt. * @param destFile 加密后存放的文件名 如c:/加密后文件.txt.

理清弄透:加密&解密、签名&验签_Bob

- -
加密&解密、签名&验签,在区块链、钱包等领域应用甚广,背后的原理或细节是什么. 这里通过图文并茂的故事,外加撸代码的方式,一起理清弄透这4个概念. 正式开始之前,先介绍一下本文的主人翁Bob. 他有2把秘钥:公钥、私钥;生活中,他会遇到3种类型的人:朋友Alice、骗子Doug、可信任的公证人CA.

公钥私钥加密解密数字证书数字签名详解

- - 忘我的追寻
决心花一些时间,将这些概念和使用的过程彻底弄清楚. 最先找到的文章是: 数字签名是什么. (阮一峰博客),读了一遍,又找了一些资料,终于把这些概念弄清楚了,这里整理记录一下. 1、密钥对,在非对称加密技术中,有两种密钥,分为私钥和公钥,私钥是密钥对所有者持有,不可公布,公钥是密钥对持有者公布给他人的.

RSA加密、解密、签名、验签的原理及方法 - PC君 - 博客园

- -
  RSA加密是一种非对称加密. 可以在不直接传递密钥的情况下,完成解密. 这能够确保信息的安全性,避免了直接传递密钥所造成的被破解的风险. 是由一对密钥来进行加解密的过程,分别称为公钥和私钥. 两者之间有数学相关,该加密算法的原理就是对一极大整数做因数分解的困难性来保证安全性. 通常个人保存私钥,公钥是公开的(可能同时多人持有).

解密Groupon

- Felix - 月光博客
  编者注:本文节选自Nicholas Carlson的文章《INSIDE GROUPON: The Truth About The World’s Most Controversial Company》,有删节.   Groupon是一个全球性的团购网站,于2008年创立,每日提供不同的优惠券供客户选购.