很多示例只能加密小文件 这个可以加密大点的文件 文件越大加解密时间越长
package com.harp.oa.utils;import org.bouncycastle.jce.provider.BouncyCastleProvider;import javax.crypto.Cipher;import java.io.*;import java.math.BigInteger;import java.security.*;import java.security.interfaces.RSAPrivateKey;import java.security.interfaces.RSAPublicKey;import java.security.spec.*;import java.util.Date;public class RSAFileUtil {/** 加解密算法关键字 */public static final String KEY_ALGORITHM = "RSA";/*** RSA最大加密明文大小*/private static final int MAX_ENCRYPT_BLOCK = 117;/*** RSA最大解密密文大小*/private static final int MAX_DECRYPT_BLOCK = 128;public static KeyPair generateKeyPair() {try {KeyPairGenerator keyPairGen = KeyPairGenerator.getInstance(KEY_ALGORITHM,new BouncyCastleProvider());final int KEY_SIZE = 1024;keyPairGen.initialize(KEY_SIZE, new SecureRandom());KeyPair keyPair = keyPairGen.genKeyPair();return keyPair;} catch (Exception e) {return null;}}/*** 生成公钥* @param modulus* @param* @return RSAPublicKey* @throws*/public static RSAPublicKey generateRSAPublicKey(byte[] modulus,byte[] publicExponent) {KeyFactory keyFac = null;try {keyFac = KeyFactory.getInstance(KEY_ALGORITHM,new org.bouncycastle.jce.provider.BouncyCastleProvider());} catch (NoSuchAlgorithmException ex) {}RSAPublicKeySpec pubKeySpec = new RSAPublicKeySpec(new BigInteger(modulus), new BigInteger(publicExponent));try {return (RSAPublicKey) keyFac.generatePublic(pubKeySpec);} catch (InvalidKeySpecException ex) {return null;}}/*** 生成私钥* @param modulus* @param privateExponent* @return RSAPrivateKey* @throws*/public static RSAPrivateKey generateRSAPrivateKey(byte[] modulus, byte[] privateExponent) {KeyFactory keyFac = null;try {keyFac = KeyFactory.getInstance(KEY_ALGORITHM,new org.bouncycastle.jce.provider.BouncyCastleProvider());} catch (NoSuchAlgorithmException ex) {}RSAPrivateKeySpec priKeySpec = new RSAPrivateKeySpec(new BigInteger(modulus),new BigInteger(privateExponent));try {return (RSAPrivateKey) keyFac.generatePrivate(priKeySpec);} catch (InvalidKeySpecException ex) {return null;}}/*** 使用公钥进行分段加密* @param* @return 公钥base64字符串* @throws Exception*/public static byte[] encryptByPublicKeyToFile(byte[] filebyte,byte[] key)throws Exception {//要加密的数据PKCS8EncodedKeySpec pkcs8KeySpec = new PKCS8EncodedKeySpec(key);KeyFactory keyFactory = KeyFactory.getInstance(KEY_ALGORITHM);Key privateKey = keyFactory.generatePrivate(pkcs8KeySpec);// 对数据加密Cipher cipher = Cipher.getInstance(keyFactory.getAlgorithm());cipher.init(Cipher.ENCRYPT_MODE, privateKey);int inputLen = filebyte.length;ByteArrayOutputStream out = new ByteArrayOutputStream();int offSet = 0;byte[] cache;int i = 0;// 对数据分段加密while (inputLen - offSet > 0) {if (inputLen - offSet > MAX_ENCRYPT_BLOCK) {cache = cipher.doFinal(filebyte, offSet, MAX_ENCRYPT_BLOCK);} else {cache = cipher.doFinal(filebyte, offSet, inputLen - offSet);}out.write(cache, 0, cache.length);i++;offSet = i * MAX_ENCRYPT_BLOCK;}byte[] encryptedData = out.toByteArray();out.close();return encryptedData;}/*** 使用私钥进行分段解密* @param dataStr 使用base64处理过的密文* @return 解密后的数据* @throws Exception*/public static byte[] decryptByPrivateKeyFile(byte[] dataStr ,byte[] pubKey)throws Exception {X509EncodedKeySpec x509KeySpec = new X509EncodedKeySpec(pubKey);KeyFactory keyFactory = KeyFactory.getInstance(KEY_ALGORITHM);Key publicKey = keyFactory.generatePublic(x509KeySpec);Cipher cipher = Cipher.getInstance(keyFactory.getAlgorithm());cipher.init(Cipher.DECRYPT_MODE, publicKey);int inputLen = dataStr.length;ByteArrayOutputStream out = new ByteArrayOutputStream();int offSet = 0;byte[] cache;int i = 0;// 对数据分段解密while (inputLen - offSet > 0) {if (inputLen - offSet > MAX_DECRYPT_BLOCK) {cache = cipher.doFinal(dataStr, offSet, MAX_DECRYPT_BLOCK);} else {cache = cipher.doFinal(dataStr, offSet, inputLen - offSet);}out.write(cache, 0, cache.length);i++;offSet = i * MAX_DECRYPT_BLOCK;}byte[] decryptedData = out.toByteArray();out.close();return decryptedData;}/*** @param keyPair* @param path1 原文件* @param path2 加密文件* @throws Exception*/public static void encrypt(KeyPair keyPair,String path1,String path2) throws Exception{// 读取要加密的文件RSAPrivateKey priKey = (RSAPrivateKey) keyPair.getPrivate();File file = new File(path1);FileInputStream in = new FileInputStream(file);ByteArrayOutputStream bout = new ByteArrayOutputStream();byte[] tmpbuf = new byte[1024];int count = 0;while ((count = in.read(tmpbuf)) != -1) {bout.write(tmpbuf, 0, count);tmpbuf = new byte[1024];}in.close();// 对数据文件进行加密处理byte[] orgData = bout.toByteArray();byte[] priModBytes = priKey.getModulus().toByteArray();byte[] priPriExpBytes = priKey.getPrivateExponent().toByteArray();RSAPrivateKey recoveryPriKey = RSAFileUtil.generateRSAPrivateKey(priModBytes, priPriExpBytes);// 对文件进行加密byte[] raw = encryptByPublicKeyToFile(orgData,priKey.getEncoded());file = new File(path2);OutputStream out = new FileOutputStream(file);out.write(raw);out.close();}/**** @param keyPair* @param path1 加密文件* @param path2 解密文件* @throws Exception*/public static void decrypt(KeyPair keyPair,String path1,String path2) throws Exception{// 对文件进行解密RSAPublicKey pubKey = (RSAPublicKey) keyPair.getPublic();byte[] pubModBytes = pubKey.getModulus().toByteArray();byte[] pubPubExpBytes = pubKey.getPublicExponent().toByteArray();RSAPublicKey recoveryPubKey = RSAFileUtil.generateRSAPublicKey(pubModBytes, pubPubExpBytes);File file = new File(path1);FileInputStream in = new FileInputStream(file);ByteArrayOutputStream bout = new ByteArrayOutputStream();byte[] tmpbuf = new byte[1024];int count = 0;while ((count = in.read(tmpbuf)) != -1) {bout.write(tmpbuf, 0, count);tmpbuf = new byte[1024];}in.close();byte[] orgData1 = bout.toByteArray();byte[] data = decryptByPrivateKeyFile(orgData1,recoveryPubKey.getEncoded());file = new File(path2);FileOutputStream out = new FileOutputStream(file);out.write(data);out.flush();out.close();}public static void main(String[] args) throws Exception {System.out.println("加密开始:"+DateUtils.getAllStringDate(new Date()));KeyPair keyPair = RSAFileUtil.generateKeyPair();encrypt(keyPair,"D:\\zhr\\image\\123.pdf","D:\\zhr\\image\\encrypt.ms");System.out.println("加密结束 解密开始:"+DateUtils.getAllStringDate(new Date()));decrypt(keyPair,"D:\\zhr\\image\\encrypt.ms","D:\\zhr\\image\\456.pdf");System.out.println("解密结束:"+DateUtils.getAllStringDate(new Date()));}}