`

RSA非对称加密算法Java实现

    博客分类:
  • java
 
阅读更多
package rsa;

import java.io.IOException;
import java.security.InvalidKeyException;
import java.security.Key;
import java.security.KeyFactory;
import java.security.KeyPair;
import java.security.KeyPairGenerator;
import java.security.NoSuchAlgorithmException;
import java.security.PrivateKey;
import java.security.PublicKey;
import java.security.spec.InvalidKeySpecException;
import java.security.spec.PKCS8EncodedKeySpec;
import java.security.spec.X509EncodedKeySpec;

import javax.crypto.BadPaddingException;
import javax.crypto.Cipher;
import javax.crypto.IllegalBlockSizeException;

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

@SuppressWarnings({ "restriction" })
public class RSAUtils {

	/** 私有构造方法 */
	private RSAUtils() {
		super();
	}
	
	private static final Cipher CIPHER;
	
	static {
		try {
			CIPHER = Cipher.getInstance("RSA");
		} catch (Throwable e) {
			throw new InternalError(e.getMessage());
		}
	}

	//~ -----------------------------------------------------------------------------
	
	/**
	 * 生成私钥和公钥
	 * 
	 * @return KeyPair
	 */
	public static KeyPair generateKeyPair() {
		return generateKeyPair(1024);
	}
	
	/**
	 * 生成私钥和公钥
	 * 
	 * @param keySize 密钥长度
	 * @return KeyPair
	 */
	public static KeyPair generateKeyPair(int keySize) {
		KeyPairGenerator keyPairGen = null;
		try {
			keyPairGen = KeyPairGenerator.getInstance("RSA");
		} catch (NoSuchAlgorithmException e) {
			throw new InternalError(e.getMessage());
		}
		keyPairGen.initialize(keySize);
		return keyPairGen.generateKeyPair();
	}
	
	/**
	 * 从KeyPair中获得公钥
	 * 
	 * @param keyPair KeyPair
	 * @return 公钥
	 */
	public static PublicKey getPublicKey(KeyPair keyPair) {
		if (keyPair == null) {
			return null;
		}
		return keyPair.getPublic();
	}
	
	/**
	 * 从KeyPair中获得私钥
	 * 
	 * @param keyPair KeyPair
	 * @return 私钥
	 */
	public static PrivateKey getPrivateKey(KeyPair keyPair) {
		if (keyPair == null) {
			return null;
		}
		return keyPair.getPrivate();
	}
	
	/**
	 * 讲公钥或私钥转换为String
	 * 
	 * @param key 公钥/私钥
	 * @return 字符串
	 */
	public static String getKeyString(Key key) {
		if (key == null) {
			return null;
		}
		byte[] keyBytes = key.getEncoded();
		String s = (new BASE64Encoder()).encode(keyBytes);
		return s;
	}
	
	/**
	 * 得到公钥
	 * 
	 * @param key
	 *            密钥字符串(经过base64编码)
	 * @throws Exception
	 */
	public static PublicKey getPublicKey(String key)  {
		byte[] keyBytes = null;
		try {
			keyBytes = (new BASE64Decoder()).decodeBuffer(key);
		} catch (IOException e) {
			throw new IllegalArgumentException(e.getMessage(), e);
		}

		X509EncodedKeySpec keySpec = new X509EncodedKeySpec(keyBytes);
		KeyFactory keyFactory = null;
		try {
			keyFactory = KeyFactory.getInstance("RSA");
		} catch (NoSuchAlgorithmException e) {
			throw new InternalError(e.getMessage());
		}
		PublicKey publicKey = null;
		try {
			publicKey = keyFactory.generatePublic(keySpec);
		} catch (InvalidKeySpecException e) {
			throw new IllegalArgumentException(e.getMessage(), e);
		}
		return publicKey;
	}

	/**
	 * 得到私钥
	 * 
	 * @param key
	 *            密钥字符串(经过base64编码)
	 * @throws Exception
	 */
	public static PrivateKey getPrivateKey(String key) {
		byte[] keyBytes;
		try {
			keyBytes = (new BASE64Decoder()).decodeBuffer(key);
		} catch (IOException e) {
			throw new IllegalArgumentException(e.getMessage(), e);
		}

		PKCS8EncodedKeySpec keySpec = new PKCS8EncodedKeySpec(keyBytes);
		KeyFactory keyFactory = null;
		try {
			keyFactory = KeyFactory.getInstance("RSA");
		} catch (NoSuchAlgorithmException e) {
			throw new InternalError(e.getMessage());
		}
		PrivateKey privateKey = null;
		try {
			privateKey = keyFactory.generatePrivate(keySpec);
		} catch (InvalidKeySpecException e) {
			throw new IllegalArgumentException(e.getMessage(), e);
		}
		return privateKey;
	}
	
	/**
	 * 加密数据
	 * 
	 * @param data 原文
	 * @param key 公钥/私钥
	 * @return 密文
	 */
	public static byte[] encrypt(byte[] data, Key key) {
		try {
			CIPHER.init(Cipher.ENCRYPT_MODE, key);
		} catch (InvalidKeyException e) {
			throw new IllegalArgumentException(e.getMessage(), e);
		}
		
		byte[] result = null;

		try {
			result = CIPHER.doFinal(data);
		} catch (IllegalBlockSizeException e) {
			throw new IllegalArgumentException(e.getMessage(), e);
		} catch (BadPaddingException e) {
			throw new IllegalArgumentException(e.getMessage(), e);
		}
		return result;
	}
	
	/**
	 * 解密数据
	 * 
	 * @param data 密文
	 * @param key 公钥/私钥
	 * @return 原文
	 */
	public static byte[] decrypt(byte[] data, Key key) {
		try {
			CIPHER.init(Cipher.DECRYPT_MODE, key);
		} catch (InvalidKeyException e) {
			throw new IllegalArgumentException(e.getMessage(), e);
		}
		
		byte[] result = null;
		
		try {
			result = CIPHER.doFinal(data);
		} catch (IllegalBlockSizeException e) {
			throw new IllegalArgumentException(e.getMessage(), e);
		} catch (BadPaddingException e) {
			throw new IllegalArgumentException(e.getMessage(), e);
		}
		
		return result;
	}

}


用法
@Override
public String encryptPassword(String password) {
	if (password == null) {
		return null;
	}
	byte[] data = RSAUtils.encrypt(password.getBytes(), publicKey);
	return Base64.encodeBase64URLSafeString(data);
}

@Override
public String decryptPassword(String encryptedPassword) {
	if (encryptedPassword == null) {
		return null;
	}
	byte[] data = Base64.decodeBase64(encryptedPassword);
	return new String(RSAUtils.decrypt(data, privateKey));
}
分享到:
评论
1 楼 xiang_qi_li 2015-10-19  
怎么测试RSAUtils 类中的方法呢??直接用楼主上面的测试用法是不行啊!!

相关推荐

    java rsa非对称加密算法3个实例源代码

    java rsa非对称加密算法3个实例源代码

    Rsa.rar_RSA 算法_java 非对称 加密 算法_rsa java

    RSA算法是一种非对称加密算法,它在信息安全领域有着广泛的应用,特别是在数据传输中的安全保护。这个RAR压缩包包含了一个名为“Rsa.java”的源代码文件,可能是用于演示如何在Java环境中实现RSA算法。另一个文件...

    RSA非对称加密的java实现

    * 字符串格式的密钥在未在特殊说明情况下都为BASE64编码格式 * 由于非对称加密速度极其缓慢,一般文件不使用它来... * 非对称加密算法可以用来对对称加密的密钥加密,这样保证密钥的安全也就保证了数据的安全

    Java实现文件的RSA和DES加密

    2. 非对称加密算法:非对称加密算法采用加密钥匙(公钥)和解密钥匙(私钥),常用的算法包括 RSA、DSA、ECC 等。 3. 加密算法的选择:在选择加密算法时,需要根据实际情况来确定。如果需要加密大量数据,建议采用...

    非对称加密算法 数字签名算法

    通过阅读《非对称加密算法 数字签名算法——RSA - 信息安全 - ITeye知识库频道.htm》这篇文章,可以深入理解这些概念,并了解在实际应用中如何使用Java实现这些功能。同时,文件中的`非对称加密算法 数字签名算法...

    rsa与aes混合加密java实现

    RSA是一种非对称加密算法,而AES是一种对称加密算法,它们各有优势,结合使用可以提供更强大的安全保障。 **RSA算法** RSA(Rivest-Shamir-Adleman)是1977年由Ron Rivest、Adi Shamir和Leonard Adleman提出的非...

    java加密算法:Base64加密\数字签名\对称加密算法\非对称加密算法\消息摘要算法

    java关于加密的算法demo代码(Base64加密\数字签名\对称加密算法\非对称加密算法\消息摘要算法) JAVA安全实现三种方式: 1.JDK 2.Commons Codec 3.Bouncy Castle 一。非对称加密算法: 1.DH 2.RSA 3.ELGamal 二。...

    AES对称和RSA非对称加密解密

    AES(Advanced Encryption Standard)是对称加密算法,而RSA是非对称加密算法。这两种加密方法各有特点,适用于不同的场景。本篇文章将详细探讨AES对称加密和RSA非对称加密的Java实现。 AES对称加密是一种广泛应用...

    rsa非对称加密算法例子

    总之,RSA非对称加密算法是一种重要的信息安全技术,它在Java等编程语言中有着广泛的应用。通过公钥加密和私钥解密,确保了信息在传输过程中的安全性。在实际开发中,理解并正确使用RSA算法对于保障网络安全至关重要...

    非对称加密算法:RSA算法的C++实现与Java实现

    RSA(Rivest-Shamir-Adleman)算法是最早被广泛采用的非对称加密算法之一,其安全性基于大整数因子分解的困难性。本篇将深入探讨RSA算法的理论基础及其在C++和Java两种编程语言中的实现。 RSA算法的基本思想是基于...

    JAVA实现RSA、DES加密

    JAVA 实现 RSA、DES 加密是密码学中的一种重要实现,通过 JAVA 语言实现 RSA 非对称加密算法和 DES 对称加密算法。以下是对 JAVA 实现 RSA、DES 加密的详细知识点: 一、基础知识 现代密码技术可以分为两类:对称...

    5.Java+js RSA非对称加密.rar

    本案例中,"5.Java+js RSA非对称加密.rar"是一个压缩包,包含了使用Java和JavaScript实现RSA非对称加密的代码示例。下面将详细解释相关知识点。 1. **非对称加密**: 非对称加密与对称加密不同,它使用一对公钥和...

    Java实现的RSA加密解密算法示例

    RSA加密解密算法是一种非对称加密算法,由Ron Rivest、Adi Shamir和Leonard Adleman在1978年发明。RSA算法基于大数分解难题的原理,使用公钥加密、私钥解密的方式实现信息的加密和解密。 知识点2:Java中RSA加密...

    非对称加密算法

    在编程实践中,开发者可以利用各种库和工具来实现非对称加密,例如Python中的`cryptography`库,Java的`java.security`包,或者Node.js的`crypto`模块。这些工具提供了接口,使得开发人员能够方便地生成密钥对、加密...

    C#和Java关于RSA非对称加密互通类

    RSA(Rivest-Shamir-Adleman)算法是其中最为广泛使用的非对称加密算法之一。本篇将深入探讨C#和Java之间如何实现RSA非对称加密的互通,并详细讲解涉及的类和方法。 首先,RSA的核心概念是基于两个不同的密钥:公钥...

    RSA非对称加密技术java辅助类源代码

    RSA非对称加密技术是一种广泛应用于网络安全中的加密算法,它基于大整数分解难题,为数据的加密和解密提供了一种安全的方式。在Java中,我们可以通过Java Cryptography Extension (JCE)库来实现RSA的加解密操作。本...

    前后端RSA非对称加密解密(代码示例).rar

    登录时,用户的密码用明文传输...非对称加密算法常用RSA算法,秘钥使用base64编码成字符串,后端使用jdk8的标准API,前端使用jsencrypt.js进行RSA的对应操作。经过测试,本例中的前后端代码的加密解密计算结果是一致的。

    RSA公钥加密算法Java实现

    RSA算法是一种非对称密码算法,所谓非对称,就是指该算法需要一对密钥,使用其中一个加密,则需要用另一个才能解密。 这时一个简单的Java实现,在RSA网络安全工具类是比较完整的实现。

    基于JAVA代码非的对称加密RSA的实现及其源代码

    在这篇文档中,我们将深入探讨非对称加密RSA的实现及其源代码,以及如何使用JAVA代码来实现。此外,我们还将介绍RSA加密算法的历史和基本原理,以及RSA加密算法在现代网络安全领域中的应用。通过本文档的学习,您将...

    rsa公钥加密算法java实现

    在处理大文件时,通常先用对称加密算法(如AES)加密文件,然后用RSA加密对称密钥,这样兼顾了安全性和效率。 标签中提到的"密码学"是研究信息安全的学科,包括加密、解密、认证、完整性等多个方面。在Java中,除了...

Global site tag (gtag.js) - Google Analytics