zoukankan      html  css  js  c++  java
  • 非对称加密RSA加密文件

    RSA加密文件

       关于RSA非对称加密很多地方都有讲解。

      下面是AES

       AES 类

    import java.io.File;
    import java.io.FileInputStream;
    import java.io.FileOutputStream;
    import java.io.InputStream;
    import java.io.OutputStream;
    import java.security.Key;
    import java.security.SecureRandom;
    
    import javax.crypto.Cipher;
    import javax.crypto.CipherInputStream;
    import javax.crypto.CipherOutputStream;
    import javax.crypto.KeyGenerator;
    import javax.crypto.SecretKey;
    import javax.crypto.spec.SecretKeySpec;
    
    /**
     * <p>
     * AES加密解密工具包
     * </p>
     *
     * @author IceWee
     * @date 2012-5-18
     * @version 1.0
     */
    public class AESUtils {
    
        private static final String ALGORITHM = "AES";
        private static final int KEY_SIZE = 256;
        private static final int CACHE_SIZE = 1024;
    
        /**
         * <p>
         * 生成随机密钥
         * </p>
         *
         * @return
         * @throws Exception
         */
        public static String getSecretKey() throws Exception {
            return getSecretKey(null);
            //return "X9qY3q630+wI/kLuKo1cBA==";
        }
    
        /**
         * <p>
         * 生成密钥
         * </p>
         *
         * @param seed 密钥种子
         * @return
         * @throws Exception
         */
        public static String getSecretKey(String seed) throws Exception {
            KeyGenerator keyGenerator = KeyGenerator.getInstance(ALGORITHM);
            SecureRandom secureRandom;
            if (seed != null && !"".equals(seed)) {
                secureRandom = new SecureRandom(seed.getBytes());
            } else {
                secureRandom = new SecureRandom();
            }
            keyGenerator.init(KEY_SIZE, secureRandom);
            SecretKey secretKey = keyGenerator.generateKey();
            System.out.println("密钥种子:"+Base64Utils.encode(secretKey.getEncoded()));
            return Base64Utils.encode(secretKey.getEncoded());
        }
    
        /**
         * <p>
         * 加密
         * </p>
         *
         * @param data
         * @param key
         * @return
         * @throws Exception
         */
        public static byte[] encrypt(byte[] data, String key) throws Exception {
            Key k = toKey(Base64Utils.decode(key));
            byte[] raw = k.getEncoded();
            SecretKeySpec secretKeySpec = new SecretKeySpec(raw, ALGORITHM);
            Cipher cipher = Cipher.getInstance(ALGORITHM);
            cipher.init(Cipher.ENCRYPT_MODE, secretKeySpec);
            return cipher.doFinal(data);
        }
    
        /**
         * <p>
         * 文件加密
         * </p>
         *
         * @param key
         * @param sourceFilePath
         * @param destFilePath
         * @throws Exception
         */
        public static void encryptFile(String key, String sourceFilePath, String destFilePath) throws Exception {
            File sourceFile = new File(sourceFilePath);
            File destFile = new File(destFilePath);
            if (sourceFile.exists() && sourceFile.isFile()) {
                if (!destFile.getParentFile().exists()) {
                    destFile.getParentFile().mkdirs();
                }
                destFile.createNewFile();
                InputStream in = new FileInputStream(sourceFile);
                OutputStream out = new FileOutputStream(destFile);
                Key k = toKey(Base64Utils.decode(key));
                byte[] raw = k.getEncoded();
                SecretKeySpec secretKeySpec = new SecretKeySpec(raw, ALGORITHM);
                Cipher cipher = Cipher.getInstance(ALGORITHM);
                cipher.init(Cipher.ENCRYPT_MODE, secretKeySpec);
                CipherInputStream cin = new CipherInputStream(in, cipher);
                byte[] cache = new byte[CACHE_SIZE];
                int nRead = 0;
                while ((nRead = cin.read(cache)) != -1) {
                    out.write(cache, 0, nRead);
                    out.flush();
                }
                out.close();
                cin.close();
                in.close();
            }
        }
    
        /**
         * <p>
         * 解密
         * </p>
         *
         * @param data
         * @param key
         * @return
         * @throws Exception
         */
        public static byte[] decrypt(byte[] data, String key) throws Exception {
            Key k = toKey(Base64Utils.decode(key));
            byte[] raw = k.getEncoded();
            SecretKeySpec secretKeySpec = new SecretKeySpec(raw, ALGORITHM);
            Cipher cipher = Cipher.getInstance(ALGORITHM);
            cipher.init(Cipher.DECRYPT_MODE, secretKeySpec);
            return cipher.doFinal(data);
        }
    
        /**
         * <p>
         * 文件解密
         * </p>
         *
         * @param key
         * @param sourceFilePath
         * @param destFilePath
         * @throws Exception
         */
        public static void decryptFile(String key, String sourceFilePath, String destFilePath) throws Exception {
            File sourceFile = new File(sourceFilePath);
            File destFile = new File(destFilePath);
            if (sourceFile.exists() && sourceFile.isFile()) {
                if (!destFile.getParentFile().exists()) {
                    destFile.getParentFile().mkdirs();
                }
                destFile.createNewFile();
                FileInputStream in = new FileInputStream(sourceFile);
                FileOutputStream out = new FileOutputStream(destFile);
                Key k = toKey(Base64Utils.decode(key));
                byte[] raw = k.getEncoded();
                SecretKeySpec secretKeySpec = new SecretKeySpec(raw, ALGORITHM);
                Cipher cipher = Cipher.getInstance(ALGORITHM);
                cipher.init(Cipher.DECRYPT_MODE, secretKeySpec);
                CipherOutputStream cout = new CipherOutputStream(out, cipher);
                byte[] cache = new byte[CACHE_SIZE];
                int nRead = 0;
                while ((nRead = in.read(cache)) != -1) {
                    cout.write(cache, 0, nRead);
                    cout.flush();
                }
                cout.close();
                out.close();
                in.close();
            }
        }
    
        /**
         * <p>
         * 转换密钥
         * </p>
         *
         * @param key
         * @return
         * @throws Exception
         */
        private static Key toKey(byte[] key) throws Exception {
            SecretKey secretKey = new SecretKeySpec(key, ALGORITHM);
            return secretKey;
        }
    
    }

    Base64Utils.java

    import java.io.ByteArrayInputStream;
    import java.io.ByteArrayOutputStream;
    import java.io.File;
    import java.io.FileInputStream;
    import java.io.FileOutputStream;
    import java.io.InputStream;
    import java.io.OutputStream;
    
    
    
    /**
     * <p>
     * BASE64编码解码工具包
     * </p>
     * <p>
     * 依赖javabase64-1.3.1.jar
     * </p>
     *
     * @author IceWee
     * @date 2012-5-19
     * @version 1.0
     */
    public class Base64Utils {
    
        /**
         * 文件读取缓冲区大小
         */
        private static final int CACHE_SIZE = 1024;
    
        /**
         * <p>
         * BASE64字符串解码为二进制数据
         * </p>
         *
         * @param base64
         * @return
         * @throws Exception
         */
        public static byte[] decode(String base64) throws Exception {
            return Base64.decode(base64);
        }
    
        /**
         * <p>
         * 二进制数据编码为BASE64字符串
         * </p>
         *
         * @param bytes
         * @return
         * @throws Exception
         */
        public static String encode(byte[] bytes) throws Exception {
            return new String(Base64.encode(bytes));
        }
    
        /**
         * <p>
         * 将文件编码为BASE64字符串
         * </p>
         * <p>
         * 大文件慎用,可能会导致内存溢出
         * </p>
         *
         * @param filePath 文件绝对路径
         * @return
         * @throws Exception
         */
        public static String encodeFile(String filePath) throws Exception {
            byte[] bytes = fileToByte(filePath);
            return encode(bytes);
        }
    
        /**
         * <p>
         * BASE64字符串转回文件
         * </p>
         *
         * @param filePath 文件绝对路径
         * @param base64 编码字符串
         * @throws Exception
         */
        public static void decodeToFile(String filePath, String base64) throws Exception {
            byte[] bytes = decode(base64);
            byteArrayToFile(bytes, filePath);
        }
    
        /**
         * <p>
         * 文件转换为二进制数组
         * </p>
         *
         * @param filePath 文件路径
         * @return
         * @throws Exception
         */
        public static byte[] fileToByte(String filePath) throws Exception {
            byte[] data = new byte[0];
            File file = new File(filePath);
            if (file.exists()) {
                FileInputStream in = new FileInputStream(file);
                ByteArrayOutputStream out = new ByteArrayOutputStream(2048);
                byte[] cache = new byte[CACHE_SIZE];
                int nRead = 0;
                while ((nRead = in.read(cache)) != -1) {
                    out.write(cache, 0, nRead);
                    out.flush();
                }
                out.close();
                in.close();
                data = out.toByteArray();
            }
            return data;
        }
    
        /**
         * <p>
         * 二进制数据写文件
         * </p>
         *
         * @param bytes 二进制数据
         * @param filePath 文件生成目录
         */
        public static void byteArrayToFile(byte[] bytes, String filePath) throws Exception {
            InputStream in = new ByteArrayInputStream(bytes);
            File destFile = new File(filePath);
            if (!destFile.getParentFile().exists()) {
                destFile.getParentFile().mkdirs();
            }
            destFile.createNewFile();
            OutputStream out = new FileOutputStream(destFile);
            byte[] cache = new byte[CACHE_SIZE];
            int nRead = 0;
            while ((nRead = in.read(cache)) != -1) {
                out.write(cache, 0, nRead);
                out.flush();
            }
            out.close();
            in.close();
        }
    
    
    }

    下面是RSA 

    import java.util.Collection;
    import java.util.Map;
    
    public abstract class Assert {
        public Assert() {
        }
    
        public static void isTrue(boolean expression, String message) {
            if (!expression) {
                throw new IllegalArgumentException(message);
            }
        }
    
        public static void isNull(Object object, String message) {
            if (object != null) {
                throw new IllegalArgumentException(message);
            }
        }
    
        public static void notNull(Object object, String message) {
            if (object == null) {
                throw new IllegalArgumentException(message);
            }
        }
    
        public static void hasLength(String text, String message) {
            if (!hasLength(text)) {
                throw new IllegalArgumentException(message);
            }
        }
    
        public static void hasText(String text, String message) {
            if (!hasText(text)) {
                throw new IllegalArgumentException(message);
            }
        }
    
        public static void doesNotContain(String textToSearch, String substring, String message) {
            if (hasLength(textToSearch) && hasLength(substring) && textToSearch.contains(substring)) {
                throw new IllegalArgumentException(message);
            }
        }
    
        public static void notEmpty(Object[] array, String message) {
            if (array == null || array.length == 0) {
                throw new IllegalArgumentException(message);
            }
        }
    
        public static void noNullElements(Object[] array, String message) {
            if (array != null) {
                Object[] var2 = array;
                int var3 = array.length;
    
                for (int var4 = 0; var4 < var3; ++var4) {
                    Object element = var2[var4];
                    if (element == null) {
                        throw new IllegalArgumentException(message);
                    }
                }
            }
    
        }
    
        public static void notEmpty(Collection<?> collection, String message) {
            if (isEmpty(collection)) {
                throw new IllegalArgumentException(message);
            }
        }
    
        public static void notEmpty(Map<?, ?> map, String message) {
            if (isEmpty(map)) {
                throw new IllegalArgumentException(message);
            }
        }
    
        public static void isInstanceOf(Class<?> type, Object obj, String message) {
            notNull(type, "Type to check against must not be null");
            if (!type.isInstance(obj)) {
                throw new IllegalArgumentException((hasLength(message) ? message + " " : "") + "Object of class [" + (obj != null ? obj.getClass().getName() : "null") + "] must be an instance of " + type);
            }
        }
    
        public static void isAssignable(Class<?> superType, Class<?> subType, String message) {
            notNull(superType, "Type to check against must not be null");
            if (subType == null || !superType.isAssignableFrom(subType)) {
                throw new IllegalArgumentException(message + subType + " is not assignable to " + superType);
            }
        }
    
        private static boolean hasLength(CharSequence str) {
            return str != null && str.length() > 0;
        }
    
        private static boolean hasText(CharSequence str) {
            if (!hasLength(str)) {
                return false;
            } else {
                int strLen = str.length();
    
                for (int i = 0; i < strLen; ++i) {
                    if (!Character.isWhitespace(str.charAt(i))) {
                        return true;
                    }
                }
    
                return false;
            }
        }
    
        private static boolean isEmpty(Collection<?> collection) {
            return collection == null || collection.isEmpty();
        }
    
        public static boolean isEmpty(Map<?, ?> map) {
            return map == null || map.isEmpty();
        }
    }
    import java.nio.charset.Charset;
    
    import org.apache.commons.codec.binary.Base64;
    
    public abstract class Base64Code {
        private static final int CACHE_SIZE = 1024;
        private static final Charset DEFAULT_CHARSET = Charset.forName("UTF-8");
        private static final Base64Delegate delegate = new CommonsCodecBase64Delegate();
    
        public Base64Code() {
        }
    
        private static void assertSupported() {
            Assert.isTrue(delegate != null, "Apache Commons Codec not found - Base64 encoding not supported````````");
        }
    
        public static byte[] encode(byte[] src) {
            assertSupported();
            return delegate.encode(src);
        }
    
        public static String encodeToString(byte[] src) {
            assertSupported();
            if (src == null) {
                return null;
            } else {
                return src.length == 0 ? "" : new String(delegate.encode(src), DEFAULT_CHARSET);
            }
        }
    
        public static byte[] decode(byte[] src) {
            assertSupported();
            return delegate.decode(src);
        }
    
        public static byte[] decodeFromString(String src) {
            assertSupported();
            if (src == null) {
                return null;
            } else {
                return src.length() == 0 ? new byte[0] : delegate.decode(src.getBytes(DEFAULT_CHARSET));
            }
        }
    
        private static class CommonsCodecBase64Delegate implements Base64Delegate {
            private final Base64 base64;
    
            private CommonsCodecBase64Delegate() {
                this.base64 = new Base64();
            }
    
            public byte[] encode(byte[] src) {
                return this.base64.encode(src);
            }
    
            public byte[] decode(byte[] src) {
                return this.base64.decode(src);
            }
        }
    
        private interface Base64Delegate {
            byte[] encode(byte[] var1);
    
            byte[] decode(byte[] var1);
        }
    }
    import java.io.ByteArrayInputStream;
    import java.io.ByteArrayOutputStream;
    import java.io.File;
    import java.io.FileInputStream;
    import java.io.FileOutputStream;
    import java.io.IOException;
    import java.io.InputStream;
    import java.io.OutputStream;
    import java.security.Key;
    import java.security.KeyFactory;
    import java.security.KeyPair;
    import java.security.KeyPairGenerator;
    import java.security.NoSuchAlgorithmException;
    import java.security.interfaces.RSAPrivateKey;
    import java.security.interfaces.RSAPublicKey;
    import java.security.spec.PKCS8EncodedKeySpec;
    import java.security.spec.X509EncodedKeySpec;
    import java.util.HashMap;
    import java.util.Map;
    
    import javax.crypto.Cipher;
    import javax.crypto.CipherInputStream;
    import javax.crypto.CipherOutputStream;
    import javax.crypto.SecretKey;
    import javax.crypto.spec.SecretKeySpec;
    
    /**
     * RSA加解密方法。
     * 
     * @author yangw
     * @since 1.0.0
     */
    public class RSACode {
        
        /** 加解密算法关键字 */
        public static final String KEY_ALGORITHM = "RSA";
        
        /** 公钥关键字 */
        private static final String PUBLIC_KEY = "RSAPublicKey";
        
        /** 私钥关键字 */
        private static final String PRIVATE_KEY = "RSAPrivateKey";
        
        /** *//**
         * RSA最大加密明文大小
         */
        private static final int MAX_ENCRYPT_BLOCK = 117;
        
        /** *//**
         * RSA最大解密密文大小
         */
        private static final int MAX_DECRYPT_BLOCK = 128;
        /** 
         * 私钥解密。
         * @param data 对应公钥加密后的密文。
         * @param keyBytes 私钥。
         * @return 明文。    
         */      
        public static byte[] decryptByPrivateKey(byte[] data, byte[] keyBytes) throws Exception {      
            // 取得私钥      
            PKCS8EncodedKeySpec pkcs8KeySpec = new PKCS8EncodedKeySpec(keyBytes);      
            KeyFactory keyFactory = KeyFactory.getInstance(KEY_ALGORITHM);      
            Key privateKey = keyFactory.generatePrivate(pkcs8KeySpec);      
         
            // 对数据解密      
            Cipher cipher = Cipher.getInstance(keyFactory.getAlgorithm());      
            cipher.init(Cipher.DECRYPT_MODE, privateKey);      
         
            return cipher.doFinal(data);      
        }       
          
        /** 
         * 公钥解密。
         * @param data 对应私钥加密后的密文。
         * @param keyBytes 公钥。
         * @return 明文。    
         */      
        public static byte[] decryptByPublicKey(byte[] data, byte[] keyBytes) throws Exception {
            // 取得公钥      
            X509EncodedKeySpec x509KeySpec = new X509EncodedKeySpec(keyBytes);      
            KeyFactory keyFactory = KeyFactory.getInstance(KEY_ALGORITHM);      
            Key publicKey = keyFactory.generatePublic(x509KeySpec);      
         
            // 对数据解密      
            Cipher cipher = Cipher.getInstance(keyFactory.getAlgorithm());      
            cipher.init(Cipher.DECRYPT_MODE, publicKey);      
         
            return cipher.doFinal(data);      
        }
          
        /** 
         * 公钥加密。
         * @param data 明文。
         * @param keyBytes 公钥。
         * @return 密文。     
         */      
        public static byte[] encryptByPublicKey(byte[] data, byte[] keyBytes) throws Exception {      
            // 取得公钥      
            X509EncodedKeySpec x509KeySpec = new X509EncodedKeySpec(keyBytes);      
            KeyFactory keyFactory = KeyFactory.getInstance(KEY_ALGORITHM);      
            Key publicKey = keyFactory.generatePublic(x509KeySpec);      
         
            // 对数据加密      
            Cipher cipher = Cipher.getInstance(keyFactory.getAlgorithm());      
            cipher.init(Cipher.ENCRYPT_MODE, publicKey);      
         
            return cipher.doFinal(data);      
        }       
          
        /**   
         * 私钥加密。
         * @param data 明文。
         * @param keyBytes 私钥。
         * @return 密文。      
         */      
        public static byte[] encryptByPrivateKey(byte[] data, byte[] keyBytes) throws Exception {          
            // 取得私钥      
            PKCS8EncodedKeySpec pkcs8KeySpec = new PKCS8EncodedKeySpec(keyBytes);      
            KeyFactory keyFactory = KeyFactory.getInstance(KEY_ALGORITHM);      
            Key privateKey = keyFactory.generatePrivate(pkcs8KeySpec);      
         
            // 对数据加密      
            Cipher cipher = Cipher.getInstance(keyFactory.getAlgorithm());      
            cipher.init(Cipher.ENCRYPT_MODE, privateKey);      
         
            return cipher.doFinal(data);      
        }       
          
        /** 
         * 取得私钥。     
         */      
        public static byte[] getPrivateKey(Map<String, Object> keyMap) throws Exception {      
            Key key = (Key) keyMap.get(PRIVATE_KEY);      
            return key.getEncoded();      
        }       
          
        /** 
         * 取得公钥。      
         */      
        public static byte[] getPublicKey(Map<String, Object> keyMap)       
                throws Exception {      
            Key key = (Key) keyMap.get(PUBLIC_KEY);      
            return key.getEncoded();      
        }       
          
        /**
         * 初始化密钥。    
         */      
        public static Map<String, Object> initKey() throws NoSuchAlgorithmException {      
            KeyPairGenerator keyPairGen = KeyPairGenerator .getInstance(KEY_ALGORITHM);      
            keyPairGen.initialize(1024);      
            KeyPair keyPair = keyPairGen.generateKeyPair();      
          
            RSAPublicKey publicKey = (RSAPublicKey) keyPair.getPublic();    // 公钥                
            RSAPrivateKey privateKey = (RSAPrivateKey) keyPair.getPrivate();  // 私钥         
            Map<String, Object> keyMap = new HashMap<String, Object>(2);      
         
            keyMap.put(PUBLIC_KEY, publicKey);      
            keyMap.put(PRIVATE_KEY, privateKey);      
            return keyMap;      
        }
        
        /**
         * 将密钥用BASE64加密成字符形式。
         */
        public static String encryptBASE64(byte[] encoded){
            if(encoded==null){
                return null;
            }
            return Base64Code.encodeToString(encoded);
        }
        
        /**
         * 将以BASE64加密的密钥还原为字节数组。
         */
        public static byte[] decryptBASE64(String key) throws IOException{
            if(key==null){
                return null;
            }
            return Base64Code.decodeFromString(key);
        }  
        
        
        
        /**
         * 使用私钥进行分段加密
         * @param dataStr 要加密的数据
         * @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;  
        } 
        
      
    
    }

    如有疑问请留言!

  • 相关阅读:
    【MySQL】DBA必备的10款最佳MySQL GUI工具
    【MySQL】获取MySQL崩溃时的core file
    字符串经常用的
    centos 系统上如何把python升级为3
    centos6 升级安装openssh7
    多进程
    队列
    线程池,锁,事件
    thread
    进程、线程
  • 原文地址:https://www.cnblogs.com/jinxinblogs/p/10880917.html
Copyright © 2011-2022 走看看