RSA非对称加密工具JAVA实现

第三方服务与交易系统交互,需要对交易数据进行安全性较高的加密,采用RSA加密。
本文分享java实现的RSA加密工具类,及在linux环境中公私密钥对的生成

生成密钥对,在linux下
1. 生成私钥 (也可以用2048,但是加密过程负责)
openssl genrsa -out private.pem 1024
2. 生成公钥
openssl rsa -in private.pem -pubout -out public.pem
3. 私钥转码
(某些语言需要pkcs8格式的公钥, 否则报错
Java报错:java.security.spec.InvalidKeySpecException: java.security.InvalidKeyException: IOException : algid parse error, not a sequence)
openssl pkcs8 -topk8 -inform PEM -in private.pem -outform PEM -nocrypt

将1,2,3步后得到的密钥对作为公私密钥

直接上代码,注意可加密的长度,超出会报错 javax.crypto.IllegalBlockSizeException: Data must not be longer than 117 bytes



package cipher;


import java.security.KeyFactory;
import java.security.PrivateKey;
import java.security.PublicKey;
import java.security.spec.PKCS8EncodedKeySpec;
import java.security.spec.X509EncodedKeySpec;

import javax.crypto.Cipher;

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

public class RSACodeUtil {
	
    public static final String KEY_ALGORTHM = "RSA";
    
    private static final String publicKeyStr = "MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQC2R1XOJeXrCYAsKOHA7ELiIVzrfrFI7eD9LexmFe0Gs2i47zhoicTUP2MKvU5/s14Ze0fLeDe8hG8To+hL7oviTH4MF8SpY+lojj7vUMBzeu3v5Q1Px2VW1eNJ0aE7Bs1V7+LMYl/tjWIQbaFHxEXfguzb9X0o/SANSwS5cUyVzQIDAQAB";
    private static final String privateKeyStr = "MIICdgIBADANBgkqhkiG9w0BAQEFAASCAmAwggJcAgEAAoGBALZHVc4l5esJgCwo4cDsQuIhXOt+sUjt4P0t7GYV7QazaLjvOGiJxNQ/Ywq9Tn+zXhl7R8t4N7yEbxOj6Evui+JMfgwXxKlj6WiOPu9QwHN67e/lDU/HZVbV40nRoTsGzVXv4sxiX+2NYhBtoUfERd+C7Nv1fSj9IA1LBLlxTJXNAgMBAAECgYAFm2woS0InWMN4mElZhesIyb3yAJOzip3BLAh5m3MPIbW2+qThkltbrBd/3RLtGrdqUUCEIc6VHf3MvN4Id+4VmriQdTFi9SEr7GxVGJbHAstQrKfglyFPDhYTIFikDvxl4D98cEXy74Epr5wwgnQbQFi8+Z+Wp+vt5UW/MPSkgQJBAN9wT17D2rEW+VC8xJnJ8tAEfZDDUDvqfL8BQ0NXQri7HGYvsFMSax5rek5cjJVPangKUImOY3+5M/xf3geSbYMCQQDQ134F+a1c9t9KrqwfGx/1yoeqkXWDHJsunMrR38KC1q/OGR4fQOlcKDaILFXEucvXla2pUkqhpRgjg8hGs15vAkEAqj75ytvyMsKtfm4GYqN0Jjl1ryqSZMS6/hIpPRMs3HJ9JgMqF3HOOqRr0W9FErMrDYHWcakTeQsVaDNnil9wnwJAZ7Y8bXc6suoepZXtAF2WF5gGm5w1AXGZVyKiTmuSyysWj4FFxjuUKCIIQsPRrCqgomVAos+tJG06eZieQw4cnQJATuVeuGSu8zy8cm2r93KZ+mlqSu7ijwY2BjRI/1rqWF4dhScfZ+aLw72O7I8yPbeKEOWRZuHfzLEajOA3b4/wCg==";
    
	private static String encrypt(String content, PrivateKey privateKey) throws Exception{
		String encodeContent = null;
		Cipher cipher = Cipher.getInstance( "rsa" );
	    cipher.init(Cipher.ENCRYPT_MODE, privateKey);  
	    Base64 base64 = new Base64();
	    byte [] cipherData = cipher.doFinal(content.getBytes());
	    encodeContent = base64.encodeToString(cipherData);
		return encodeContent;
	}
	
	private static String decrypt(String content, PublicKey publicKey) throws Exception{
	    Base64 base64 = new Base64();
	    byte[] byteArray = base64.decodeBase64(content);
		String decodeContent = null;
		Cipher cipher = Cipher.getInstance( "rsa" );
	    cipher.init(Cipher.DECRYPT_MODE, publicKey);
	    byte [] cipherData = cipher.doFinal(byteArray);
		return new String(cipherData);
	}
	
	private static PrivateKey getPrivateKey(String privateKeyStr2) throws Exception {
		
        byte[] keyBytes = decryptBASE64(privateKeyStr2);

        PKCS8EncodedKeySpec pkcs8EncodedKeySpec = new PKCS8EncodedKeySpec(keyBytes);
        KeyFactory keyFactory;
		keyFactory = KeyFactory.getInstance(KEY_ALGORTHM);
		PrivateKey privateKey = keyFactory.generatePrivate(pkcs8EncodedKeySpec);
		return privateKey;
	}

	private static PublicKey getPublicKey(String publicKey) throws Exception{
		byte[] keyBytes = decryptBASE64(publicKey);
        //构造X509EncodedKeySpec对象
        X509EncodedKeySpec x509EncodedKeySpec = new X509EncodedKeySpec(keyBytes);
        //指定加密算法
        KeyFactory keyFactory;
		keyFactory = KeyFactory.getInstance(KEY_ALGORTHM);
		PublicKey publicKey2 = keyFactory.generatePublic(x509EncodedKeySpec);
		return publicKey2;
	}
	
	private static byte[] decryptBASE64(String keys) {
		Base64 base64 = new Base64();
		return base64.decode(keys);
	}
	
	public static String encode(String content) throws Exception{
		return encrypt(content, getPrivateKey(privateKeyStr));
	}
	
	public static String decode(String content) throws Exception{
		return decrypt(content, getPublicKey(publicKeyStr));
	}
	
	public static void main(String[] args) {
		try {
			String content = "abcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyz";
//			String content = "abcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyz";
			String code = encode(content);
			System.out.println("code:"+code);
			String content2 = decode(code);
			System.out.println("content:"+content2);
		} catch (Exception e) {
			e.printStackTrace();
		}
	}
}


彩蛋,使用RSA推荐阅读
http://blog.csdn.net/defonds/article/details/42775183
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值