`
wydyyhwzx
  • 浏览: 9594 次
社区版块
存档分类
最新评论

RSA 工具类

RSA 
阅读更多

记录下RSA 工具类,提供加密,解密,签名,生成密钥对等方法,以便以后使用。

import java.io.File;
import java.io.IOException;
import java.security.Key;
import java.security.KeyFactory;
import java.security.KeyPair;
import java.security.KeyPairGenerator;
import java.security.PrivateKey;
import java.security.PublicKey;
import java.security.SecureRandom;
import java.security.Signature;
import java.security.spec.PKCS8EncodedKeySpec;
import java.security.spec.X509EncodedKeySpec;
import java.util.Random;

import javax.crypto.Cipher;

import org.apache.commons.lang.StringUtils;
import org.apache.commons.io.FileUtils;

/**
 * 
 * RSA 工具类。提供加密,解密,签名,生成密钥对等方法。
 * 
 */

public final class RSA {
	public static final String RSA_CRYPT_ALGORITHM_NAME = "RSA";

	public static final String RSA_SIGN_ALGORITHM_NAME = "MD5withRSA";
	
	private static final int RSA_KEY_LENGTH = 1024;

	/**
	 * 
	 * 生成密钥对
	 * 
	 * @return KeyPair
	 */

	private static KeyPair generateKeyPair() throws Exception {
		try {
			KeyPairGenerator keyPairGen = KeyPairGenerator
					.getInstance(RSA_CRYPT_ALGORITHM_NAME);
			final int KEY_SIZE = RSA_KEY_LENGTH;// 块加密的大小,值太大会影响效率
			SecureRandom secrand = new SecureRandom();
			//这里的种子一定要随机,不然会产生相同的key,就没有安全性可言了。。。
			secrand.setSeed(RandomUtils.generateString(RSA_KEY_LENGTH).getBytes()); // 初始化随机产生器
			keyPairGen.initialize(KEY_SIZE, secrand);
			KeyPair keyPair = keyPairGen.genKeyPair();
			return keyPair;
		} catch (Exception e) {
			throw new Exception(e.getMessage());
		}
	}

	/**
	 * 生产RSA密钥对,并且保存到文件中
	 * 
	 * @param path
	 */
	public static void keyRSA(String path, boolean isBase64Encode)
			throws Exception {
		KeyPair kp = generateKeyPair();
		// 获取公钥
		PublicKey pubkey = kp.getPublic();
		// 获取私钥
		PrivateKey prikey = kp.getPrivate();
		byte[] pubKeyBytes = pubkey.getEncoded();
		byte[] priKeyBytes = prikey.getEncoded();
		if (isBase64Encode) {
			pubKeyBytes = Base64.encode(pubkey.getEncoded()).getBytes();
			priKeyBytes = Base64.encode(prikey.getEncoded()).getBytes();
		}
		// 保存公钥到文件
		if (StringUtils.isBlank(path)) {
			path = "c:/";
		} else {
			if (!path.endsWith("/")) {
				path = path + "/";
			}
		}
		bytes2File(pubKeyBytes, path + "rsa.publicKey");
		bytes2File(priKeyBytes, path + "rsa.privateKey");

	}

	private static void bytes2File(byte[] keyBytes,
			String filePath) throws IOException {
		File file = new File(filePath);
		if (!file.getParentFile().exists())
			file.getParentFile().mkdirs();
		FileUtils.writeByteArrayToFile(file, keyBytes);
	}
	
	public static PublicKey generateRSAPublicKey(String path,
			boolean base64Encoded) throws Exception {
		return generateRSAPublicKey(getBytes(path), base64Encoded);
	}

	/**
	 * 生成公钥
	 * 
	 * @param pubKeyString
	 * @return
	 * @throws Exception
	 */
	public static PublicKey generateRSAPublicKey(byte[] pubKeyByte,
			boolean base64Encoded) throws Exception {
		byte[] encodedKey = pubKeyByte;
		// 先base64解码
		if (base64Encoded) {
			encodedKey = Base64.decode(new String(pubKeyByte));
		}
		X509EncodedKeySpec bobPubKeySpec = new X509EncodedKeySpec(encodedKey);
		KeyFactory keyFactory = KeyFactory
				.getInstance(RSA_CRYPT_ALGORITHM_NAME);
		return keyFactory.generatePublic(bobPubKeySpec);
	}
	
	public static PrivateKey generateRSAPrivateKey(String path,
			boolean base64Encoded) throws Exception {
		return generateRSAPrivateKey(getBytes(path), base64Encoded);
	}

	/**
	 * 生产私钥
	 * 
	 * @param priKeyByte
	 * @return
	 * @throws Exception
	 */
	public static PrivateKey generateRSAPrivateKey(byte[] priKeyByte,
			boolean base64Encoded) throws Exception {
		byte[] encodedKey = priKeyByte;
		// 先base64解码
		if (base64Encoded) {
			encodedKey = Base64.decode(new String(priKeyByte));
		}
		PKCS8EncodedKeySpec priPKCS8 = new PKCS8EncodedKeySpec(encodedKey);
		KeyFactory keyFactory = KeyFactory
				.getInstance(RSA_CRYPT_ALGORITHM_NAME);
		return keyFactory.generatePrivate(priPKCS8);
	}
	
	private static byte[] getBytes(String path) throws IOException {
		File file = new File(path);
		return FileUtils.readFileToByteArray(file);
	}

	/**
	 * 加密
	 * 
	 * @param key
	 *            加密的密钥
	 * @param data
	 *            待加密的明文数据
	 * @return 加密后的数据
	 */
	public static byte[] encrypt(Key key, byte[] data) throws Exception {
		 if (key != null) {   
	            try {   
	                Cipher cipher = Cipher.getInstance(RSA_CRYPT_ALGORITHM_NAME);   
	                cipher.init(Cipher.ENCRYPT_MODE, key);   
	                return cipher.doFinal(data);   
	            } catch (Exception e) {   
	                e.printStackTrace();   
	            }   
	        }   
	        return null;   
	}

	/**
	 * 解密
	 * 
	 * @param key
	 *            解密的密钥
	 * @param raw已经加密的数据
	 * @return 解密后的明文
	 */
	public static byte[] decrypt(Key key, byte[] raw) throws Exception {
		if (key != null) {   
            try {   
                Cipher cipher = Cipher.getInstance(RSA_CRYPT_ALGORITHM_NAME);   
                cipher.init(Cipher.DECRYPT_MODE, key);   
                return cipher.doFinal(raw);   
            } catch (Exception e) {   
                e.printStackTrace();   
            }   
        }   
  
        return null;   

	}

	/**
	 * 签名
	 * 
	 * @param privateKey
	 * @param data
	 * @return
	 */
	public static byte[] sign(PrivateKey privateKey, byte[] data)
			throws Exception {
		try {
			// 用私钥对信息生成数字签名
			Signature signet = Signature.getInstance(RSA_SIGN_ALGORITHM_NAME);
			signet.initSign(privateKey);
			signet.update(data);
			byte[] signed = signet.sign(); // 对信息的数字签名
			return signed;
		} catch (Exception e) {
			throw new Exception(e);
		}
	}

	/**
	 * 验证签名是否正确
	 * 
	 * @param publicKey
	 * @param signed
	 * @param orig
	 * @return
	 */
	public static boolean verify(PublicKey publicKey, byte[] signed, byte[] orig)
			throws Exception {
		try {
			Signature signetcheck = Signature
					.getInstance(RSA_SIGN_ALGORITHM_NAME);
			signetcheck.initVerify(publicKey);
			signetcheck.update(orig);
			if (signetcheck.verify(signed)) {
				return true;
			} else {
				return false;
			}
		} catch (Exception e) {
			throw new Exception(e);
		}

	}

	public static void main(String[] args) throws Exception {
		RSA.keyRSA("D:/12", true);
		
		PublicKey publicKey = RSA.generateRSAPublicKey("D:/12/rsa.publicKey", true);
		PrivateKey privateKey = RSA.generateRSAPrivateKey("D:/12/rsa.privateKey", true);
		
		String str = "rsa test : KKC --> kkc ~ 88";
		byte[] strByte = str.getBytes();
		System.out.println("原字符串:" + str);
		byte[] encrypt = RSA.encrypt(privateKey, strByte);
		byte[] decrypt = RSA.decrypt(publicKey, encrypt);
		System.out.println("解密后字符串:" + new String(decrypt));
		System.out.println("原字符串、解密后字符串是否相同:" + new String(decrypt).equals(str));
		
		byte[] sign = RSA.sign(privateKey, strByte);
		System.out.println("原字符串验证签名:" + RSA.verify(publicKey, sign, strByte));
		System.out.println("随机字符串验证签名:" + RSA.verify(publicKey, sign, RandomUtils.generateString(20).getBytes()));
	}

}

class RandomUtils { 
	public static final String allChar = "0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ";
	/** 
	 * 返回一个定长的随机字符串(只包含大小写字母、数字) 
	 * 
	 * @param length 随机字符串长度 
	 * @return 随机字符串 
	 */ 
	public static String generateString(int length) { 
		StringBuffer sb = new StringBuffer(); 
		Random random = new Random(); 
		for (int i = 0; i < length; i++) {
			sb.append(allChar.charAt(random.nextInt(allChar.length()))); 
		} 
		return sb.toString(); 
	}
}

 

 

 

分享到:
评论

相关推荐

    RSA工具类(常用)

    RSA工具类,囊括了 生成密钥对、私钥解密、公钥加密、私钥签名、公钥验证的方法,并且其中有例子,可直接运行。

    javarsa工具类

    总结,Java RSA工具类是一个强大的加密工具,适用于各种安全需求。通过学习和实践,开发者能够熟练地在Java应用中集成RSA,提升系统安全性。这个资料包中的案例涵盖了RSA的基本操作,可以帮助开发者深入理解并掌握这...

    java安全算法RSA 工具类

    ### Java安全算法RSA工具类详解 #### 一、引言 在网络安全领域,RSA是一种广泛使用的非对称加密算法,其安全性基于大整数分解问题的困难性。本篇文章将详细解析一个Java环境下实现RSA加密功能的工具类,并对其实现...

    RSA工具类(内含公钥加密、私钥解密、私钥加签、公钥验签)

    RSA为最常用的一种非对称方式的算法,这次封装的Utils类完成了公钥加密、私钥解密、私钥加签、公钥验签四种常用方法。

    RSA工具类java加密解密非常全

    设计到的方法如下: DigitalSign init getInstance SignMsgByRelativePath SignMsgByInputStream signMsgByAbsolutePath verifyMsgByInputSteam verifyMsgByAbsolutePath verifyMsgByRelativePath ...

    C#RSA加密解密工具

    在这个C# RSA工具中,我们可以看到以下几个关键文件: 1. `MainForm.Designer.cs` 和 `MainForm.cs`:这是用户界面(UI)的设计和实现,包含用户与程序交互的控件和逻辑。 2. `Program.cs`:这是程序的主入口点,...

    JAVA中RSA加密解密工具类

    以下是一个简单的RSA加密解密工具类的实现: ```java import java.security.KeyPair; import java.security.KeyPairGenerator; import java.security.PrivateKey; import java.security.PublicKey; import java....

    java、android通用的RSA和AES工具类

    本文将详细介绍Java和Android平台上常用的两种加密算法:RSA和AES,以及如何使用它们的通用工具类。 首先,RSA是一种非对称加密算法,由Ron Rivest、Adi Shamir和Leonard Adleman在1977年提出。它基于大数因子分解...

    rsa+aes加密传输工具类及案例

    例如,一个RSA工具类可能包含生成公钥/私钥对、加密/解密数据的方法;AES工具类则提供初始化向量(IV)的生成、密钥的设置、数据的加密/解密等功能。这些工具类应该设计成易于使用且安全的,避免常见的加密漏洞,如...

    RSA网络安全工具类

    是RSA工具类,包括分段加密、分段解密、公私钥对生成,是一份完整的工具类。

    RSA非对称加密前端用工具类

    RSA非对称加密前端工具类 用于网络传输中数据加密

    rsa非对称加密java工具类

    项目中使用过的一个rsa非对称加密类,用着很不错 ,需要注意的是里边的密钥长度最小是128,不能再小了,还有里边用到了base64的编码,我们用的是jdk 1.8自带的工具类,如果要用的童靴的项目是不jdk 1.8的项目也可以...

    AES与RSA加密工具类

    RSA工具类可能包含: 1. `generateRSAKeyPair()`: 生成一对RSA密钥。 2. `encryptRSA(plaintext, publicKey)`: 使用公钥加密明文。 3. `decryptRSA(ciphertext, privateKey)`: 使用私钥解密密文。 在实际使用时,...

    RSA加密工具类

    RSA加密工具类

    JAVA中RSA加密解密工具类加强版

    在"JAVA中RSA加密解密工具类加强版"这篇博客中,作者提供了一个加强版的RSA工具类,旨在简化RSA操作并提高效率。这个工具类通常包含以下功能: 1. **密钥对生成**:使用`java.security.KeyPairGenerator`类生成RSA...

    微信小程序能用RSA分段加解密工具类

    微信小程序能用RSA分段加解密工具类。直接复制到你的工程下就能用

    RSA加解密工具

    RSA工具(来源于网络),此工具用着比较顺手,详细情况及使用请看:http://blog.csdn.net/yxstars/article/details/38443937

    RSA 通用加密、解密工具类(JAVA)

    这个Java实现的RSA工具类提供了生成密钥对、公钥加密和私钥解密的功能,对于理解和使用RSA算法非常有帮助。下面将详细介绍这些功能以及相关知识点。 首先,RSA算法基于两个大素数的乘积难以因式分解这一数学难题。...

    rsa加密工具类

    非常实用的rsa加解密工具类,加签验签,拿过去就能用,包含测试代码

Global site tag (gtag.js) - Google Analytics