`
as11051105
  • 浏览: 60424 次
  • 性别: Icon_minigender_1
  • 来自: 贵阳
社区版块
存档分类
最新评论

RSA加解密

阅读更多
import java.io.FileOutputStream;
import java.io.ObjectOutputStream;
import java.security.KeyPair;
import java.security.KeyPairGenerator;
import java.security.SecureRandom;
import java.security.interfaces.RSAPrivateKey;
import java.security.interfaces.RSAPublicKey;

import org.bouncycastle.jce.provider.BouncyCastleProvider;

/**
 * 产生公钥和私钥对,并且保存在文件中,公钥 pk.dat,私钥 sk.dat
 *  
 */
public class RSAKeyPairGenerator {
	public static void main(String[] args) throws Exception {
		// 加密的种子信息
		byte []seed = "zhangxy@lexiang100".getBytes();
		RSAKeyPairGenerator kg = new RSAKeyPairGenerator();
		kg.genKeys(seed);
	}

	/**
	 * 生成密钥
	 * 
	 * @param keyInfo
	 * @throws Exception
	 */
	public void genKeys(byte []seed) throws Exception {
		// 密钥对生成器
		KeyPairGenerator keygen = KeyPairGenerator.getInstance("RSA", new BouncyCastleProvider());
		SecureRandom random = new SecureRandom();
		random.setSeed(seed);
		keygen.initialize(1024, random);
		KeyPair keyPair = keygen.generateKeyPair();

		// 生成公钥
		RSAPublicKey publicKey = (RSAPublicKey)keyPair.getPublic();
		saveFile(publicKey, "pk.dat");

		// 生成私钥
		RSAPrivateKey privateKey = (RSAPrivateKey)keyPair.getPrivate();
		saveFile(privateKey, "sk.dat");
		System.out.println(publicKey.toString());
		System.out.println(publicKey.toString());

		System.out.println("公钥 modulus        >>> " + publicKey.getModulus());
		System.out.println("公钥 publicExponent >>> " + publicKey.getPublicExponent());
		
		System.out.println("私钥 modulus        >>> " + privateKey.getModulus());
		System.out.println("私钥 publicExponent >>> " + privateKey.getPrivateExponent());
	}

	private void saveFile(Object obj, String fileName) throws Exception {
		ObjectOutputStream output = new ObjectOutputStream(new FileOutputStream(fileName));
		output.writeObject(obj);
		output.close();
	}
}

import java.io.FileInputStream;
import java.io.ObjectInputStream;
import java.math.BigInteger;
import java.security.Key;
import java.security.KeyFactory;
import java.security.PrivateKey;
import java.security.PublicKey;
import java.security.Signature;
import java.security.interfaces.RSAPrivateKey;
import java.security.interfaces.RSAPublicKey;
import java.security.spec.RSAPublicKeySpec;

import javax.crypto.Cipher;

import org.bouncycastle.jce.provider.BouncyCastleProvider;

public class RSAUtil {
	public static void main(String[] args) throws Exception {
		String str = "My chinese name is Mr.Z!";
		System.out.println("原始文本:" + str);
		RSAUtil rsa = new RSAUtil();
		// 私钥
		RSAPrivateKey privateKey = (RSAPrivateKey) rsa.readFromFile("sk.dat");
		// 公钥
		RSAPublicKey publickKey = (RSAPublicKey) rsa.readFromFile("pk.dat");
		byte[] encbyte = rsa.encrypt(str, privateKey);
		System.out.println("私钥加密:");
		String encStr = toHexString(encbyte);
		System.out.println(encStr);
		
		byte[] signBytes = rsa.sign(str, privateKey);
		System.out.println("私钥签名:");
		String signStr = toHexString(signBytes);
		System.out.println(signStr);
		
		System.out.println("公钥验证签名:");
		if (rsa.verifySign(str, signStr, publickKey)) {
			System.out.println("RSA sign check success");
		} else {
			System.out.println("RSA sign check failure");
		}
		
		byte[] decByte = rsa.decrypt(encStr, publickKey);
		System.out.println("公钥解密:");
		String decStr = new String(decByte);
		System.out.println(decStr);
	}
	
	/**
	 * 获取公钥
	 * 
	 * @param modulus
	 * @param publicExponent
	 * @return
	 * @throws Exception
	 */
	public static PublicKey getPublicKey() {
		PublicKey publicKey = null;
		String modulus = 

"14086566523754439857763879199332120114399179109937025293469996396388705802697953127591764545189368534601365

433393175760359319373977698652594369746999669370499575326633159323339503808869829930818061221571354457746261

3426793519824197226393059683065343801412208205295045502348474411031999124137863144916358656019";
		String publicExponent = "65537";
		BigInteger m = new BigInteger(modulus);
		BigInteger e = new BigInteger(publicExponent);
		RSAPublicKeySpec keySpec = new RSAPublicKeySpec(m, e);

		try {
			KeyFactory keyFactory = KeyFactory.getInstance("RSA", new BouncyCastleProvider());
			publicKey = keyFactory.generatePublic(keySpec);
		} catch (Exception e1) {
			e1.printStackTrace();
		}

		return publicKey;
	}

	/**
	 * 加密,key可以是公钥,也可以是私钥
	 * 
	 * @param message
	 * @param key
	 * @return
	 * @throws Exception
	 */
	public byte[] encrypt(String message, Key key) throws Exception {
		Cipher cipher = Cipher.getInstance("RSA", new BouncyCastleProvider());
		cipher.init(Cipher.ENCRYPT_MODE, key);
		return cipher.doFinal(message.getBytes("gb2312"));
	}

	/**
	 * 解密,key可以是公钥,也可以是私钥,如果是公钥加密就用私钥解密,反之亦然
	 * 
	 * @param message
	 * @param key
	 * @return
	 * @throws Exception
	 */
	public byte[] decrypt(String message, Key key) throws Exception {
		Cipher cipher = Cipher.getInstance("RSA", new BouncyCastleProvider());
		cipher.init(Cipher.DECRYPT_MODE, key);
		return cipher.doFinal(toBytes(message));
	}

	/**
	 * 用私钥签名
	 * 
	 * @param message
	 * @param key
	 * @return
	 * @throws Exception
	 */
	public byte[] sign(String message, PrivateKey key) throws Exception {
		Signature signetcheck = Signature.getInstance("MD5withRSA");
		signetcheck.initSign(key);
		signetcheck.update(message.getBytes("ISO-8859-1"));
		return signetcheck.sign();
	}

	/**
	 * 用公钥验证签名的正确性
	 * 
	 * @param message
	 * @param signStr
	 * @param key
	 * @return
	 * @throws Exception
	 */
	public boolean verifySign(String message, String signStr, PublicKey key) throws Exception {
		if (message == null || signStr == null || key == null) {
			return false;
		}
		Signature signetcheck = Signature.getInstance("MD5withRSA");
		signetcheck.initVerify(key);
		signetcheck.update(message.getBytes("ISO-8859-1"));
		return signetcheck.verify(toBytes(signStr));
	}

	/**
	 * 从文件读取密钥
	 * 
	 * @param fileName
	 * @return
	 * @throws Exception
	 */
	private Object readFromFile(String fileName) throws Exception {
		ObjectInputStream input = new ObjectInputStream(new FileInputStream(fileName));
		Object obj = input.readObject();
		input.close();
		return obj;
	}

	public static String toHexString(byte[] b) {
		StringBuilder sb = new StringBuilder(b.length * 2);
		for (int i = 0; i < b.length; i++) {
			sb.append(HEXCHAR[(b[i] & 0xf0) >>> 4]);
			sb.append(HEXCHAR[b[i] & 0x0f]);
		}
		return sb.toString();
	}

	public static final byte[] toBytes(String s) {
		byte[] bytes;
		bytes = new byte[s.length() / 2];
		for (int i = 0; i < bytes.length; i++) {
			bytes[i] = (byte) Integer.parseInt(s.substring(2 * i, 2 * i + 2), 16);
		}
		return bytes;
	}

	private static char[] HEXCHAR = { '0', '1', '2', '3', '4', '5', '6', '7', '8', '9', 'a', 'b', 'c', 

'd', 'e', 'f' };
}

分享到:
评论

相关推荐

    RSA加密解密工具,用于文件的加密和解密* RSA加密解密:私钥解密,公钥加密

    在本压缩包中,提供了RSA加密解密的工具——PRO_TDES_RSA.exe,这是一个执行程序,能够帮助用户对文件进行加密和解密操作。结合"RSATool工具简易操作指南 .doc",用户可以详细了解如何使用这个工具来保护他们的敏感...

    C# RSA加密解密

    **C# RSA加密解密详解** 在信息安全领域,加密技术是一种至关重要的手段,用于保护数据的隐私和安全性。RSA(Rivest-Shamir-Adleman)算法是一种非对称加密算法,广泛应用于网络通信、数据存储等领域。C#作为.NET...

    易语言RSA加解密

    易语言RSA加解密源码,RSA加解密,DLL调用生成RSA秘钥对,读整数,libeay32dll内存清理,是否质数,libeay_rsa加密解密,十六转字节集,字节集_十六进制_优化,写整数,子程序1,子程序2,CoInitialize,CoUninitialize,RSA_free,...

    微信小程序 RSA加解密

    微信小程序RSA加解密是一种在小程序开发中实现数据安全传输的技术。RSA,即Rivest-Shamir-Adleman,是一种非对称加密算法,它基于大整数因子分解的困难性,提供了数据加密和数字签名的服务。在微信小程序中,由于其...

    Qt实现RSA加解密

    在本文中,我们将深入探讨如何使用Qt框架来实现RSA加解密,并结合开源库openssl进行数字签名。Qt是一个跨平台的应用程序开发框架,广泛应用于GUI应用程序的开发,同时支持非图形化应用程序。RSA是一种公开密钥加密...

    RSA加密解密(C#)实现

    RSA加密解密C#实现调用实例 public string RSAEncrypt(string xmlPublicKey, string m_strEncryptString) { try { byte[] PlainTextBArray; byte[] CypherTextBArray; string Result; System.Security....

    vue RSA加解密(完美解决加解密文本过长问题)

    rsa加解密

    rsa加解密代码

    本资源包含了C++和Java两种编程语言实现的RSA加解密代码,非常适合学习和参考。 首先,我们来了解一下RSA算法的基本原理。RSA算法是由Ron Rivest、Adi Shamir和Leonard Adleman在1977年提出,因此得名RSA。该算法...

    Delphi RSA加解密【支持RSA公钥加密私钥解密,RSA私钥加密公钥解密,秘钥格式支持PKCS8和PKCS1】D7~XE10可用

    本文将详细讲解Delphi环境下如何实现RSA加解密,并着重讨论其支持的公钥加密私钥解密以及私钥加密公钥解密的功能,同时涉及PKCS8和PKCS1两种秘钥格式。 RSA是一种基于大数因子分解困难性的加密算法,由Ron Rivest、...

    C++实现密码学 RSA加密解密算法

    RSA加密解密算法是密码学中一种常用的加密算法,以 Ron Rivest、Adi Shamir 和 Leonard Adleman 三人命名。该算法基于大数分解问题的困难性,使用公钥加密和私钥解密的方式来保护数据的安全。 该算法的基本原理是:...

    RSA加密解密网络课程设计

    RSA 加密解密网络课程设计 RSA 加密解密是计算机网络安全领域中的一种常用技术,旨在保护数据的机密性和完整性。本文将介绍 RSA 加密解密的基本原理、实现方法和技术要点。 一、RSA 加密解密原理 RSA 加密解密...

    C++实现RSA加密解密算法

    以上就是关于RSA加密解密算法的基本知识,以及在VC++环境下实现的概述。理解并掌握RSA算法对于深入学习网络安全和密码学至关重要。在具体编程实现时,还需要考虑到错误处理、输入输出的格式化以及代码的优化等问题。

    RSA加密解密的使用,含jsencrypt.js文件(uni-app也可用)

    `jsencrypt.js`是一个JavaScript实现的RSA加密库,它允许在浏览器环境中进行RSA加解密操作。这个库非常方便,可以轻松集成到你的uni-app项目中,为前端数据加密提供支持。 在使用jsencrypt.js时,首先需要生成一对...

    易语言调用JSEncrypt实现RSA加密解密

    RSA是一种广泛应用的非对称加密算法,它基于两个密钥——公钥和私钥——进行加解密操作。易语言是一种面向初学者的编程语言,其语法简洁,适合快速开发。在易语言中调用JSEncrypt库来实现RSA加密解密,可以为易语言...

    RSA加解密(c语言实现).zip

    在这个“RSA加解密(C语言实现).zip”文件中,我们可以期待找到一个用C语言编写的RSA加密和解密的实现。 首先,RSA的核心原理是基于大数因子分解的困难性。它使用两个大素数p和q生成一对密钥:公钥和私钥。公钥...

    JavaScript_RSA加解密+分段加解密.zip

    使用RSA非对称加密完成JavaScript前端RSA加密和分段加解密,最近研究了RSA非对称加密,关于什么是RSA,网上各种文章一...当数据量超过117位字节的时候,程序就会抛出异常,下面就给出如何完成前端RSA加解密和分段加解密

    与Java的RSA加解密兼容的Python加解密库m2crypto(Windows下免编译)

    由于Java的RSA加解密一般都是用RSA/ECB/PKCS1PADDING,导致Python一般的RSA加密库的加解密结果与Java的不兼容,Python下目前能与之兼容的RSA的库目前发现的只有一个,就是m2crypto。 这个库目前的问题是在windows...

    swift-RSA加密解密

    **Swift中的RSA加密解密** RSA(Rivest-Shamir-Adleman)是一种广泛使用的非对称加密算法,它的核心特点在于使用一对密钥,一个为公钥,一个为私钥。在信息安全领域,这种特性使得RSA成为实现安全通信的重要工具。...

    Android RSA加密解密demo

    本示例"Android RSA加密解密demo"提供了一个完整的实现过程,帮助开发者理解如何在Android平台上使用RSA进行数据的加密和解密操作。 RSA算法基于数论,它的核心思想是利用两个大素数的乘积作为公钥,这两个大素数的...

    基于OpenSSL的RSA加解密的C语言实现

    1.该程序是基于OpenSSL的使用纯C语言来实现RSA加解密的,在Linux环境下开发完成,建议在Linux环境下使用(在Windows环境下需要自行修改); 2.该程序具有生成RSA密钥对、RSA公钥加密和RSA私钥解密的功能,支持手动...

Global site tag (gtag.js) - Google Analytics