原创

Java 实现 RSA 加密解密算法方案

RSA加密算法是一种非对称加密算法。在公开密钥加密和电子商业中RSA被广泛使用。RSA是1977年由罗纳德·李维斯特(Ron Rivest)、阿迪·萨莫尔(Adi Shamir)和伦纳德·阿德曼(Leonard Adleman)一起提出的。当时他们三人都在麻省理工学院工作。RSA就是他们三人姓氏开头字母拼在一起组成的。

1973年,在英国政府通讯总部工作的数学家克利福德·柯克斯(Clifford Cocks)在一个内部文件中提出了一个相同的算法,但他的发现被列入机密,一直到1997年才被发表。

对极大整数做因数分解的难度决定了RSA算法的可靠性。换言之,对一极大整数做因数分解愈困难,RSA算法愈可靠。假如有人找到一种快速因数分解的算法的话,那么用RSA加密的信息的可靠性就肯定会极度下降。但找到这样的算法的可能性是非常小的。今天只有短的RSA钥匙才可能被强力方式解破。到2013年为止,世界上还没有任何可靠的攻击RSA算法的方式。只要其钥匙的长度足够长,用RSA加密的信息实际上是不能被解破的。

RSA加密算法是世界第一个非对称加密算法,具体算法步骤如下:

1)随意选择两个大的质数p和q,p不等于q,计算N=pq(通常p和q都有155十进制位或都有512十进制位)

2)根据欧拉函数,求得r = φ(N) = φ(p)φ(q) = (p-1)(q-1)

3)选择一个小于r的整数e,求得e关于r的模反元素,命名为d。(模反元素存在,当且仅当e与r互质)

4)将p和q的记录销毁。

(N,e)是公钥,(N,d)是私钥

Java 实现 RSA 加密算法,具体代码如下:

package com;

import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.ObjectInputStream;
import java.io.ObjectOutputStream;
import java.security.Key;
import java.security.KeyPair;
import java.security.KeyPairGenerator;
import java.security.SecureRandom;

import javax.crypto.Cipher;

import sun.misc.BASE64Decoder;
import sun.misc.BASE64Encoder;

/**
 * @author www.yoodb.com
 */
public class RSAEncrypt {
	/** 加密算法 DESEDE */
	private static String ALGORITHM = "RSA";
	/** key值大小 */
	private static int KEYSIZE = 1024;
	/** 公钥存放文件自定义 */
	private static String PUBLIC_KEY_FILE = "PublicKey";
	/** 私钥存放文件自定义 */
	private static String PRIVATE_KEY_FILE = "PrivateKey";
	/** object 对象流 */
	private static ObjectInputStream ois = null;

	/**
	 * 生成密钥对
	 */
	private static void generateKeyPair() throws Exception {
		SecureRandom sr = new SecureRandom(); //RSA算法可信任的随机数源
		KeyPairGenerator kpg = KeyPairGenerator.getInstance(ALGORITHM); //RSA算法创建KeyPairGenerator对象
		kpg.initialize(KEYSIZE, sr); //随机数据源初始化KeyPairGenerator对象
		KeyPair kp = kpg.generateKeyPair(); //生成密匙对
		Key publicKey = kp.getPublic(); //得到公钥
		Key privateKey = kp.getPrivate(); //得到私钥
		ObjectOutputStream ois = new ObjectOutputStream(new FileOutputStream(PUBLIC_KEY_FILE)); //用对象流将生成的密钥写入文件
		ois.writeObject(publicKey);
		ois.close();
		ois = new ObjectOutputStream(new FileOutputStream(PRIVATE_KEY_FILE));
		ois.writeObject(privateKey);
		ois.close();
	}

	/**
	 * 加密方法
	 * @param source 源数据
	 * @return
	 */
	public static String encrypt(String source) throws Exception {
		generateKeyPair();
		ois = new ObjectInputStream(new FileInputStream(PUBLIC_KEY_FILE));
		Key key = (Key) ois.readObject();
		ois.close();
		Cipher cipher = Cipher.getInstance(ALGORITHM);
		cipher.init(Cipher.ENCRYPT_MODE, key);
		byte[] b = source.getBytes();
		b = cipher.doFinal(b);
		BASE64Encoder encoder = new BASE64Encoder();
		return encoder.encode(b);
	}

	/**
	 * 解密算法
	 * @param cryptograph
	 * @return
	 * @throws Exception
	 */
	public static String decrypt(String cryptograph) throws Exception {
		ois = new ObjectInputStream(new FileInputStream(PRIVATE_KEY_FILE));
		Key key = (Key) ois.readObject();
		Cipher cipher = Cipher.getInstance(ALGORITHM);
		cipher.init(Cipher.DECRYPT_MODE, key);
		BASE64Decoder decoder = new BASE64Decoder();
		byte[] b = decoder.decodeBuffer(cryptograph);
		b = cipher.doFinal(b);
		return new String(b);
	}

	public static void main(String[] args) throws Exception {
		String source = "Hello World!";// 要加密的字符串
		String cryptograph = encrypt(source);// 生成的密文
		System.out.println(cryptograph);

		String target = decrypt(cryptograph);// 解密密文
		System.out.println(target);
	}
}
~阅读全文-人机检测~

微信公众号“Java精选”(w_z90110),专注Java技术干货分享!让你从此路人变大神!回复关键词领取资料:如Mysql、Hadoop、Dubbo、Spring Boot等,免费领取视频教程、资料文档和项目源码。微信搜索小程序“Java精选面试题”,内涵3000+道Java面试题!

涵盖:互联网那些事、算法与数据结构、SpringMVC、Spring boot、Spring Cloud、ElasticSearch、Linux、Mysql、Oracle等

评论

分享:

支付宝

微信