`
尘枉_yjava
  • 浏览: 73865 次
  • 性别: Icon_minigender_2
  • 来自: 北京
社区版块
存档分类
最新评论

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

    博客分类:
  • java
阅读更多
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
分享到:
评论

相关推荐

    RSA加密/解密实验

    同时,实验还包括对一个磁盘文本文件进行加密和解密的实际应用,以检验算法的可行性。 实验内容虽然提及了AES加密/解密,但主要关注点应是RSA算法。AES(Advanced Encryption Standard)是对称加密算法,与RSA不同...

    RSA加密解密工具,用于文件的加密和解密* RSA加密解密:私钥解密,公钥加密

    在本压缩包中,提供了RSA加密解密的工具——PRO_TDES_RSA.exe,这是一个执行程序,能够帮助用户对文件进行加密和解密操作。结合"RSATool工具简易操作指南 .doc",用户可以详细了解如何使用这个工具来保护他们的敏感...

    文件加密/解密的例子(5KB)...

    标题中的“文件加密/解密的例子”提示我们这是一个关于如何在VB(Visual Basic)环境中实现文件加密和解密的编程示例。这个压缩包可能包含了用于演示加密和解密过程的源代码、用户界面(UI)文件以及相关文档。下面...

    Java实现文件的RSA和DES加密

    Java 实现文件的 RSA 和 DES 加密 在现代密码技术中,根据密钥类型的不同,可以将其分为两类:对称加密算法(秘密钥匙加密)和非对称加密算法(公开密钥加密)。对称加密算法用来对敏感数据等信息进行加密,常用的...

    c/c++实现的基于文件的DES加解密

    "main.cpp"文件通常是程序的入口点,其中包含了调用DES加密和解密函数的代码,可能包括读取文件、生成或加载密钥、执行加密或解密操作、以及将结果写回文件的功能。开发者可能使用标准库中的文件I/O函数,如`fopen`...

    [CryptAPI]纯windowsAPI计算AES/DEA/3DES,RSA加密解密,RSA签名验签,HMAC,散列等

    RSA公钥加密/私钥解密。RSA签名/验签。各种散列:MD2/MD4/MD5,SHA/SHA1/SHA256/SHA384/SHA512。HMAC算法,支持 hmac-md5 hmac-sha1 hmac-sha256 hmac-384 hmac-sha512。PEM文件纯易语言解析,载入,导出。FPX文件...

    又一个加密/解密字符串的例子(3KB)...

    通过这些文件,我们可以学习到加密解密操作如何与用户交互。 "README.TXT"文件通常包含项目的基本信息、使用说明或开发者留下的备注。在这个上下文中,它可能解释了加密解密算法的选择、实现细节以及如何运行或测试...

    加密和解密文件

    对称加密如DES、3DES、AES等,其特点是加密和解密使用相同的密钥,速度快,适用于大量数据的加密。而非对称加密,如RSA、ECC,采用一对公钥和私钥,公钥用于加密,私钥用于解密,安全性更高,但计算复杂度相对较大,...

    文件加密/解密的例子(345KB)...

    总的来说,这个压缩包提供的示例可能涵盖了从用户交互到实际加密解密的完整流程,对于学习VB编程技巧和理解文件加密原理非常有帮助。通过分析和运行这些源代码,开发者可以更好地理解和掌握如何在VB中实现文件的安全...

    DES 加密,RSA 加密,DES 文件加密

    本文将深入探讨标题中提及的两种主要加密算法:DES(Data Encryption Standard)和RSA,并介绍如何利用它们对文件进行加密。我们将结合描述中的“提供了方便文件加密接口”来阐述如何在实际应用中实现这些加密方法。...

    C#加密解密DeEncryptHelper.zip

    MD5 单向加密 SHA1 单向加密 DES 双向,可解密 加密字符串 ...RSA加密解密及RSA签名和验证 RSA 的密钥产生 产生私钥 和公钥 RSA 方式加密 RSA的解密函数 获取Hash描述表 RSA签名 RSA 签名验证

    MD5 & DES & RSA 加密解密

    winform做的一个小工具(源码),包括MD5加密、DES加密解密,RSA公钥密钥生成,RSA加密解密这几个功能。 pc6上找到的,不知道原作者是谁,感谢之。

    姬小兵的加密/解密小程序.aps

    常见的加密算法有对称加密(如DES、3DES、AES)和非对称加密(如RSA、ECC)。对称加密使用同一密钥进行加密和解密,而非对称加密则需要一对公钥和私钥,公钥用于加密,私钥用于解密。姬小兵的加密/解密小程序可能...

    简易的MD5.DES.RSA加密解密程序

    这个简易的加密解密程序结合了这三种算法,提供了对文本数据的加解密功能。下面将详细阐述这三种算法及其在程序中的作用。 1. **MD5(Message-Digest Algorithm 5)** MD5是一种广泛使用的哈希函数,它可以将任意...

    风吟PHP 字符串加密/解密.rar

    在处理加密和解密时,应始终遵循最佳实践,例如避免硬编码密钥,使用随机盐值,定期更换密钥,以及对敏感数据进行零填充等。 综上所述,“风吟PHP 字符串加密/解密.rar”中的代码可能涉及了PHP的加密技术,包括但不...

    RSA.rar_RSA加密文件_RSA加密解密和_rsa加密算法_对称 加密文件_对称加密

    10. **源代码与实践**:提供的RAR文件可能包含RSA加密和解密的源代码及可执行文件,这对于学习密码学理论和实践非常有价值。通过阅读和运行这些代码,可以深入理解RSA的工作机制。 总之,RSA加密算法是现代密码学的...

    MD5加密,DES,RSA加解密工具

    在给定的"MD5加密,DES,RSA加解密工具"中,用户可以通过Encoder.exe文件实现这三种加密方式的操作。MD5用于快速校验数据完整性,而DES和RSA则提供加密服务。DES适合大量数据的加密,因为其速度较快,但需要保证密钥...

    RSA加密和3DES加解密

    在项目`encryption_and_decryption`中,可能包含了使用JAVA实现RSA和3DES加密解密的示例代码,通过这些代码可以学习如何在实际开发中应用这两种加密技术。了解并掌握这些加密算法的原理和使用方法,对于提升应用程序...

    RSA结合DES加密解密大数据

    这里我们关注的是“RSA结合DES加密解密大数据”的主题。RSA和DES都是常见的加密算法,它们各自具有不同的特点和应用场景,而将两者结合使用则可以充分利用它们的优势,为大数据提供更高级别的安全保障。 RSA...

    DES 3DES RSA 的实现加密解密算法

    本文将详细介绍C#环境下如何实现DES、3DES和RSA这三种常见的加密解密算法,并基于VS2005开发一个Winform应用程序来演示其实现过程。 首先,DES(Data Encryption Standard)是一种对称加密算法,它使用56位的密钥对...

Global site tag (gtag.js) - Google Analytics