RSA自用加解密,公钥私钥,密文测试(copy用)

import org.apache.commons.codec.binary.Base64;

import java.io.ByteArrayOutputStream;
import java.security.Key;
import java.security.KeyFactory;
import java.security.spec.PKCS8EncodedKeySpec;
import java.security.spec.X509EncodedKeySpec;

import javax.crypto.Cipher;

/**
 * RSA 加密和解密
 * RSA加密可以通过公钥加密私钥解密和私钥加密公钥解密两种方式
 * TODO 一般为了数据安全性会使用公钥加密,私钥解密的方式进行加密
 * @author LinCh
 **/
public class RSACXUtil {

    /** 分段最大加密长度 */
    private static final int MAX_ENCRYPT_BLOCK = 117;
    /** 分段最大解密长度 */
    private static final int MAX_DECRYPT_BLOCK = 128;

    /**
     * 使用私钥进行解密
     * @param privateKeyText 私钥秘钥文本
     * @param cipherText 密文
     * @return 明文
     */
    public static String decryptByPrivateKey(String privateKeyText, String cipherText) throws Exception {
        byte[] encPriKey = Base64.decodeBase64(privateKeyText);
        PKCS8EncodedKeySpec encPriKeySpec = new PKCS8EncodedKeySpec(encPriKey);
        return decrypt(KeyFactory.getInstance("RSA").generatePrivate(encPriKeySpec), cipherText);
    }

    /**
     * 解密
     * @param key 公钥
     * @param cipherText 密文
     * @return 明文
     */
    private static String decrypt(Key key, String cipherText) throws Exception {
        Cipher cipher = Cipher.getInstance("RSA/ECB/PKCS1Padding");
        cipher.init(Cipher.DECRYPT_MODE, key);
        if (cipherText == null || cipherText.length() == 0) {
            return cipherText;
        }
        byte[] encryptedData = Base64.decodeBase64(cipherText);
        int inputLen = encryptedData.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(encryptedData, offSet, MAX_DECRYPT_BLOCK);
            } else {
                cache = cipher.doFinal(encryptedData, offSet, inputLen - offSet);
            }
            out.write(cache, 0, cache.length);
            i++;
            offSet = i * MAX_DECRYPT_BLOCK;
        }
        byte[] decryptedData = out.toByteArray();
        out.close();
        return new String(decryptedData);
    }

    /**
     * 根据公钥进行加密
     * @param publicKeyText 公钥秘钥文本
     * @param cipherText 明文
     * @return 密文
     */
    public static String encryptByPublicKey(String publicKeyText, String cipherText) throws Exception {
        byte[] publicKeyBytes = Base64.decodeBase64(publicKeyText);
        X509EncodedKeySpec x509KeySpec = new X509EncodedKeySpec(publicKeyBytes);
        return encrypt(KeyFactory.getInstance("RSA").generatePublic(x509KeySpec), cipherText);
    }

    /**
     * 加密
     * @param key 公钥
     * @param plainText 明文
     * @return 密文
     */
    private static String encrypt(Key key, String plainText) throws Exception {
        Cipher cipher = Cipher.getInstance("RSA/ECB/PKCS1Padding");
        cipher.init(Cipher.ENCRYPT_MODE, key);
        byte[] data = plainText.getBytes("UTF-8");
        int inputLen = data.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(data, offSet, MAX_ENCRYPT_BLOCK);
            } else {
                cache = cipher.doFinal(data, offSet, inputLen - offSet);
            }
            out.write(cache, 0, cache.length);
            i++;
            offSet = i * MAX_ENCRYPT_BLOCK;
        }
        byte[] encryptedData = out.toByteArray();
        out.close();
        return Base64.encodeBase64String(encryptedData);
    }

    public static void main(String[] args) throws Exception {
        // 运行测试
        // 公钥
        String MY_PUBLIC_KEY_STRING = "MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQC9vBlCW+Erzqflo6fKhJslqSWnLMx6MN7ud+Oon" +
                "fkFx7qIpPlJq4hmwVFsueIfef4gCt7RwWjQZRl3piSY5Q0UjkXmTM27nETippF+sSFfsHeIDgM6Tn" +
                "ZAZw3IXhK5AxPFa9IhSr/vh3wSu5yI7XO3ribKXpRBfZ57AnrKiwXZd7UwIDAQAB";
        // 私钥
        String MY_PRIVATE_KEY_STRING = "MIICeQIBADANBgkqhkiG9w0BAQEFAASCAmMwggJfAgEAAoGBAL28GUJb4SvOp+Wjp8qEmyWpJacsn" +
                "zHow3u5346h+QXHuoik+UmriGbBUWy54h95/iAK3tHBaNBlGXemJJjlDRSOReZMzbucROKmkX6xIn" +
                "V+wd4gOAzpNkBnDcheErkDE8Vr0iFKv++HfBK7nIjtc7euJspelEF9nnsCesqLBdl3tTAgMBAAECn" +
                "gYEAnBpGLfKqMAC24pjjVBwGCdZAxGp3UZEj2c+J3vcBoVtUz9oWtRmRSSIeYv2Hy+fhX1sFeeq9n" +
                "Mo5SdfIBINvX5R2WWKrhZrC+qVHX8plTVDQ0DWGSzAboz8+mODQ9RI5o6rASPUJJHe4m8aRuD5XFn" +
                "PjX9rjczos0kyaj3qU3VigECQQD82S6u6fgQcUAdFn6uL9Gn8LIaxyE+229qTBCEs5TIy8O7F9Ygn" +
                "Mit1k26uU6qY2M7HOFv1Ij8qaV3EQvCbpDKbAkEAwBmGsiBF+Npudrg3jCar+QSa+zjo+76SkvAXn" +
                "oPyM5i9k2WeT/NODym6qdbGVcq05f8TkHNBpDhEMsO/q4RnpqQJBAIbs7jhwqes8Q9ZB1r/kzKAtn" +
                "lR0s/dSpDD9Q78+gdNjhw0TnZ2Au5XoMfpeQFg0SROWScZ/R8psTNvIwNm0XpdkCQQCyV0BooHO1n" +
                "q7x/9ViEgeaIghEMCHKsPOnBBqs5Jx38GaXr/DA0uX2R8xnHuD1BwLYv+2+3nHjbuVJp9eK+Zps5n" +
                "AkEAu+hFwglPRWApHnnNmhkKsU+toP8QLvmVHOdVuIC5RQ2a7vpLKx8RQ6rvjMqJ8f7MA6wMD+FGn" +
                "tqOX+I3YrySnBA==";
        // 加密密文
        String text1 = RSACXUtil.encryptByPublicKey(MY_PUBLIC_KEY_STRING, new String("df7afab62f8f4f1a80f43894716ad7f8".getBytes("UTF-8")));
        System.out.println(text1);
        // 解密内容
        String text2 = RSACXUtil.decryptByPrivateKey(MY_PRIVATE_KEY_STRING, text1);
        System.out.println(java.net.URLDecoder.decode(text2, "utf-8"));
    }
}

本图文内容来源于网友网络收集整理提供,作为学习参考使用,版权属于原作者。
THE END
分享
二维码
< <上一篇

)">
下一篇>>