RSA加密

package com.yinhoo.ca.utils;

import java.io.ByteArrayOutputStream;
import java.io.File;
import java.util.Arrays;

import javax.crypto.Cipher;

import org.apache.commons.io.FileUtils;
import org.bouncycastle.jce.provider.BouncyCastleProvider;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

import com.yinhoo.ca.helper.KeyPairLoader;

/**
 * 用于进行文件的RSA加密
 * 
 * @author ming.chen
 * @date 2011-2-14
 * @version $Revision$
 */
public class RSAUtils {

    private static Logger logger = LoggerFactory.getLogger(RSAUtils.class);
    private static final int ECODE_EACH_READ_SIZE = 100;
    private static final int DECODE_EACH_READ_SIZE = 128;

    /**
     * 对文件进行RSA加密
     * 
     * @param ip
     *            要加密的客户端ip
     * @param srcFilePath
     *            要加密文件的完整路径
     */
    public static void encryptFile(String ip, String srcFilePath) {
        if (KeyPairLoader.getKeyPairByIp(ip) == null) {
            logger.warn("No Encode key bind on ip:" + ip);
            return;
        }

        File file = new File(srcFilePath);
        if (!file.exists() || !file.isFile()) {
            logger.warn(String.format("%s is not file.", srcFilePath));
            return;
        }

        try {
            Cipher cipher = Cipher.getInstance("RSA/ECB/PKCS1Padding", new BouncyCastleProvider());
            cipher.init(Cipher.ENCRYPT_MODE, KeyPairLoader.getKeyPairByIp(ip).getPrivate());

            ByteArrayOutputStream baos = new ByteArrayOutputStream();
            byte[] bytes = FileUtils.readFileToByteArray(file);
            for (int i = 0; i < bytes.length; i += ECODE_EACH_READ_SIZE) {
                int end = i + ECODE_EACH_READ_SIZE;
                byte[] toEncrypt = Arrays.copyOfRange(bytes, i, end < bytes.length ? end : bytes.length);
                byte[] segment = cipher.doFinal(toEncrypt);
                baos.write(segment, 0, segment.length);
            }
            baos.flush();
            byte[] result = baos.toByteArray();
            FileUtils.writeByteArrayToFile(file, result);
        }
        catch (Exception e) {
            logger.error(String.format("Error occur when encrypt file: %s", srcFilePath), e);
        }
    }

    /**
     * 对文件进行RSA解密
     * 
     * @param ip
     *            要解密的客户端ip
     * @param srcFilePath
     *            要解密文件的完整路径
     */
    public static void decryptFile(String ip, String srcFilePath) {

        if (KeyPairLoader.getKeyPairByIp(ip) == null) {
            logger.warn("No Encode key bind on ip:" + ip);
            return;
        }

        File file = new File(srcFilePath);
        if (!file.exists() || !file.isFile()) {
            logger.warn(String.format("%s is not file.", srcFilePath));
            return;
        }

        try {
            Cipher cipher = Cipher.getInstance("RSA/ECB/PKCS1Padding", new BouncyCastleProvider());
            cipher.init(Cipher.DECRYPT_MODE, KeyPairLoader.getKeyPairByIp(ip).getPublic());

            ByteArrayOutputStream baos = new ByteArrayOutputStream();
            byte[] bytes = FileUtils.readFileToByteArray(file);
            for (int i = 0; i < bytes.length; i += DECODE_EACH_READ_SIZE) {
                int end = i + DECODE_EACH_READ_SIZE;
                byte[] toDecrypt = Arrays.copyOfRange(bytes, i, end < bytes.length ? end : bytes.length);
                byte[] segment = cipher.doFinal(toDecrypt);
                baos.write(segment, 0, segment.length);
            }
            baos.flush();
            byte[] result = baos.toByteArray();
            FileUtils.writeByteArrayToFile(file, result);
        }
        catch (Exception e) {
            logger.error(String.format("Error occur when decrypt file: %s", srcFilePath), e);
        }
    }

}

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值