`
edr_
  • 浏览: 169790 次
  • 性别: Icon_minigender_1
  • 来自: 广州
社区版块
存档分类
最新评论

关于RSA加密算法的工具类

    博客分类:
  • J2EE
阅读更多
关于RSA加密算法的工具类

最近在捣鼓SSO(单点登录),就是一个在应用(系统)登录之后,当切换其他应用(系统)的时候,可以省去登录,提高用户的使用的便捷。(具体有时间在写)

期间涉及的安全问题,发送数据涉及账户密码以及分布系统之间的信息安全问题。

package test.rsa;

import java.io.*;
import java.math.BigInteger;
import java.security.*;
import java.security.interfaces.*;
import java.security.spec.*;
import javax.crypto.*;
import org.bouncycastle.util.encoders.Hex;
import sun.misc.*;

public class TestRSA {
	/**
	 * * 生成密钥对 *
	 * 
	 * @return KeyPair *
	 * @throws EncryptException
	 */
	public static KeyPair generateKeyPair() throws Exception {
		try {
			KeyPairGenerator keyPairGen = KeyPairGenerator.getInstance("RSA",
					new org.bouncycastle.jce.provider.BouncyCastleProvider());
			final int KEY_SIZE = 1024;// 块加密的大小,是不要太大,否则效率会低
			keyPairGen.initialize(KEY_SIZE, new SecureRandom());
			KeyPair keyPair = keyPairGen.generateKeyPair();
			saveKeyPair(keyPair);
			return keyPair;
		} catch (Exception e) {
			throw new Exception(e.getMessage());
		}
	}

	public static KeyPair getKeyPair() throws Exception {
		FileInputStream fis = new FileInputStream(
				"D:/javasoft/TempTest/RSAKey.txt");
		ObjectInputStream oos = new ObjectInputStream(fis);
		KeyPair kp = (KeyPair) oos.readObject();
		oos.close();
		fis.close();
		return kp;
	}

	public static void saveKeyPair(KeyPair kp) throws Exception {

		FileOutputStream fos = new FileOutputStream(
				"D:/javasoft/TempTest/RSAKey.txt");
		ObjectOutputStream oos = new ObjectOutputStream(fos);
		// 生成密钥
		oos.writeObject(kp);
		oos.close();
		fos.close();
	}

	/**
	 * * 生成公钥 *
	 * 
	 * @param modulus *
	 * @param publicExponent *
	 * @return RSAPublicKey *
	 * @throws Exception
	 */
	public static RSAPublicKey generateRSAPublicKey(byte[] modulus,
			byte[] publicExponent) throws Exception {
		KeyFactory keyFac = null;
		try {
			keyFac = KeyFactory.getInstance("RSA",
					new org.bouncycastle.jce.provider.BouncyCastleProvider());
		} catch (NoSuchAlgorithmException ex) {
			throw new Exception(ex.getMessage());
		}

		RSAPublicKeySpec pubKeySpec = new RSAPublicKeySpec(new BigInteger(
				modulus), new BigInteger(publicExponent));
		try {
			return (RSAPublicKey) keyFac.generatePublic(pubKeySpec);
		} catch (InvalidKeySpecException ex) {
			throw new Exception(ex.getMessage());
		}
	}

	/**
	 * * 生成私钥 *
	 * 
	 * @param modulus *
	 * @param privateExponent *
	 * @return RSAPrivateKey *
	 * @throws Exception
	 */
	public static RSAPrivateKey generateRSAPrivateKey(byte[] modulus,
			byte[] privateExponent) throws Exception {
		KeyFactory keyFac = null;
		try {
			keyFac = KeyFactory.getInstance("RSA",
					new org.bouncycastle.jce.provider.BouncyCastleProvider());
		} catch (NoSuchAlgorithmException ex) {
			throw new Exception(ex.getMessage());
		}

		RSAPrivateKeySpec priKeySpec = new RSAPrivateKeySpec(new BigInteger(
				modulus), new BigInteger(privateExponent));
		try {
			return (RSAPrivateKey) keyFac.generatePrivate(priKeySpec);
		} catch (InvalidKeySpecException ex) {
			throw new Exception(ex.getMessage());
		}
	}

	/**
	 * 加密的方法
	 * @throws IOException 
	 * @throws NoSuchPaddingException 
	 * @throws NoSuchAlgorithmException 
	 */
	private static String encrypt(PublicKey pk,String source) throws Exception{

		Cipher cipher = Cipher.getInstance("RSA",new org.bouncycastle.jce.provider.BouncyCastleProvider());
		cipher.init(Cipher.ENCRYPT_MODE, pk);
		byte[] sbt = source.getBytes();
		byte[] epByte = cipher.doFinal(sbt);
		BASE64Encoder encoder = new BASE64Encoder();
		String epStr = encoder.encode(epByte);
		return epStr;

	}
	private static String encrypt1(PublicKey pk,String source) throws Exception{
		Cipher cipher = Cipher.getInstance("RSA",new org.bouncycastle.jce.provider.BouncyCastleProvider());
		cipher.init(Cipher.ENCRYPT_MODE, pk);
		byte[] s = source.getBytes();
		byte[] en_s = cipher.doFinal(s);
		return new String(Hex.encode(en_s));

	}
	/**
	 * 解密的方法
	 * @throws Exception
	 */
	public static String decrypt(PrivateKey pk,String source) throws Exception {

		/** 得到Cipher对象对已用公钥加密的数据进行RSA解密 */
		Cipher cipher = Cipher.getInstance("RSA",new org.bouncycastle.jce.provider.BouncyCastleProvider());
		cipher.init(Cipher.DECRYPT_MODE, pk);
		BASE64Decoder decoder = new BASE64Decoder();
		byte[] b1 = decoder.decodeBuffer(source);
		/** 执行解密操作 */
		byte[] b = cipher.doFinal(b1);
		return new String(b);
	}
	public static String decrypt1(PrivateKey pk,String source) throws Exception {

		/** 得到Cipher对象对已用公钥加密的数据进行RSA解密 */
		Cipher cipher = Cipher.getInstance("RSA",new org.bouncycastle.jce.provider.BouncyCastleProvider());
		cipher.init(Cipher.DECRYPT_MODE, pk);
		/** 执行解密操作 */
		byte[] b = cipher.doFinal(Hex.decode(source));
		return new String(b);
	}
	public static void main(String[] args) throws Exception {
		String s = "1-Test-我";
		String en_s = encrypt1(getKeyPair().getPublic(), s);
		System.out.println("----------------分割线--------------------------");
		System.out.println("加密之后:");
		System.out.println(en_s);
		
		System.out.println("----------------分割线--------------------------");
		String de_s = decrypt1(getKeyPair().getPrivate(),en_s);  
        System.out.println("还原密文:"); 
        System.out.println(de_s);
	}
}

Have a nice day~
分享到:
评论

相关推荐

    JAVA中RSA加密解密工具类

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

    加密算法工具类

    本文将详细介绍标题中提到的"加密算法工具类",包括MD5、DES3、DES、AES、BASE64以及SHA这七种常见的加密算法,并讨论它们在Java环境中的应用。 首先,MD5(Message-Digest Algorithm 5)是一种广泛使用的哈希函数...

    RSA加密算法DEMO

    RSA加密算法是一种非对称加密技术,由Ron Rivest、Adi Shamir和Leonard Adleman在1977年提出,因此得名RSA。它是现代密码学的基础之一,广泛应用于网络安全,如数字签名、数据加密和SSL/TLS协议等。本DEMO将展示RSA...

    RSA加密算法的C++演示

    RSA加密算法是公开密钥密码学的一个重要代表,由Ron Rivest、Adi Shamir和Leonard Adleman在1977年提出,因此得名RSA。它基于大数因子分解的困难性,为数据交换和存储提供安全保护。在C++中,可以借助Windows的...

    C#RSA加密解密工具

    C# RSA加密解密工具是一种基于公钥/私钥对的加密算法实现,主要用于保障数据的安全传输和存储。RSA(Rivest-Shamir-Adleman)算法是公开密钥加密技术的鼻祖,由Ron Rivest、Adi Shamir和Leonard Adleman在1977年提出...

    安卓RSA+AES加密算法实现工具类

    RSA加密算法

    RSA加密算法MFC

    RSA加密算法是公钥密码学领域中的一个经典算法,由Ron Rivest、Adi Shamir和Leonard Adleman在1977年提出,因此得名RSA。它基于大整数因子分解的数学难题,使得加密过程对于不知道密钥的人来说几乎是不可解的。在MFC...

    java实现RSA加密算法

    在实际开发中,Java的`java.security`和`javax.crypto`包提供了丰富的工具类和接口,可以帮助我们方便地实现RSA加密算法。通过理解这些核心概念并结合示例代码,可以更好地理解和实现RSA加密算法。在提供的压缩包...

    kotlin 加密算法工具类

    在IT行业中,加密算法是...总之,Kotlin中的加密算法工具类集成了多种加密方法,为开发人员提供了方便的数据保护手段。在选择合适的加密算法时,应考虑性能、安全性以及应用场景,确保数据在传输和存储过程中的安全性。

    RSA文件加密算法C#实现.rar_RSA文件加密算法C#实现_RSA算法_grayvwe_rsa加密_rsa文件加密

    在C#中实现RSA加密算法,可以使用.NET框架提供的System.Security.Cryptography命名空间中的RSACryptoServiceProvider类。以下是一些关于RSA文件加密算法C#实现的关键点: 1. **密钥生成**:RSA算法的核心是生成一对...

    cpp-SwiftRSACrypto封装MIHCryptoSwift版本的RSA加密解密工具类

    一、RSA加密算法简介 RSA是一种非对称加密算法,由Rivest、Shamir和Adleman三位科学家于1977年提出。该算法基于大数因子分解的困难性,分为公钥和私钥两部分。公钥用于加密,而私钥用于解密,确保数据的安全性。RSA...

    RSA加密算法实例

    RSA加密算法是公开密钥密码学中的一个经典算法,由Ron Rivest、Adi Shamir和Leonard Adleman在1977年提出,因此得名RSA。它基于大整数因子分解的困难性,使得加密过程对于不知道密钥的人来说几乎是不可能破解的。 ...

    各种java加密算法工具类

    这里我们主要关注的是"各种java加密算法工具类",其中包括了RSA和MD5等常见的加密方法。下面我们将深入探讨这些算法及其在Java中的实现。 首先,MD5(Message-Digest Algorithm 5)是一种广泛使用的哈希函数,它将...

    RSA加密算法MFC实现

    总的来说,这个项目结合了MFC的图形界面设计能力和Crypto++的密码学算法实现,为开发者提供了一个方便的RSA密钥生成工具,对于理解和应用RSA加密算法具有实践意义。同时,这也是一次将理论知识转化为实际应用的实例...

    RSA+AES 加密工具类 Java

    RSA和AES是两种常见的加密算法,用于保护敏感信息不被未授权的访问者窃取。在这个“RSA+AES加密工具类 Java”中,我们将深入探讨这两种加密技术以及如何在Java环境中,包括Android和Web应用,实现它们。 首先,RSA...

    unity工具类RSA加密和解密

    在Unity引擎中,RSA(Rivest-Shamir-Adleman)是一种广泛使用的非对称加密算法,常用于安全传输数据、数字签名等场景。本文将深入探讨RSA加密和解密的基础知识以及如何在Unity中实现这一功能。 首先,RSA加密的核心...

    可实用的RSA加密算法(PB12.5源码含Demo,PB9源码pbl).zip

    RSA加密算法是一种非对称加密技术,由Ron Rivest、Adi Shamir和Leonard Adleman在1977年提出,是信息安全领域的重要基石。这个标题提及的压缩包包含的是PowerBuilder(PB)环境下实现RSA算法的源码,分别适用于PB...

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

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

    RSA加密算法提供商BouncyCastleProvider

    RSA加密算法是公钥密码学中的一个重要组成部分,它由Ron Rivest、Adi Shamir和Leonard Adleman在1977年提出,因此得名RSA。这种算法基于大整数因子分解的困难性,为数据传输和存储提供安全保护。在Java中,除了标准...

    RSA.rar_rsa_rsa java_rsa加密算法

    以下是关于RSA加密算法的详细知识: 1. **原理**:RSA算法基于两个大素数p和q的乘积,生成公钥和私钥。公钥(e,n)用于加密,私钥(d,n)用于解密。其中,e是与(n,p,q)的最大公约数互质的一个数,d是e的模逆元,即e...

Global site tag (gtag.js) - Google Analytics