RSA(非对称)压缩加密/解压缩解密||AES(对称)压缩加密/解压缩解密
2013-07-26 17:28
567 查看
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); } }
相关文章推荐
- Java对称与非对称加密解密,AES与RSA
- Java对称与非对称加密解密,AES与RSA
- Java对称与非对称加密解密,AES与RSA
- Java对称与非对称加密解密,AES与RSA
- Android 中 非对称(RSA)加密和对称(AES)加密
- 对文件压缩加密,解密解压缩,非对称加密,RSA,AES算法
- [置顶] Android 中 非对称(RSA)加密和对称(AES)加密
- Android 中 非对称(RSA)加密和对称(AES)加密
- 对文件压缩加密,解密解压缩,非对称加密,RSA,AES算法
- Android 中 非对称(RSA)加密和对称(AES)加密
- 对称加密协议DES、3DES aes 和非对称加密协议(不用分发私钥 RSA)
- 对称加密之AES、压缩解压以及压缩加密解密解压综合实战
- 加密算法(对称加密)AES、DES (非对称加密)RSA、DSA
- rsa+aes非对称加密实例(两对公私钥)
- java对象序列化、gzip压缩解压缩、加密解密
- python 加密 解密 签名 验证签名 公钥 私钥 非对称加密 RSA
- android RSA加密 解密 非对称可逆加密
- 使用X.509数字证书加密解密实务(三)-- 使用RSA证书结合对称加密技术加密长数据
- .net core AES加密解密及RSA 签名验签
- js前端加密java后台解密(对称与非对称)