`

RSA对文件进行加密和解密

阅读更多
package author.estone.rsa;

import javax.crypto.Cipher;
import java.security.*;
import java.security.spec.RSAPublicKeySpec;
import java.security.spec.RSAPrivateKeySpec;
import java.security.spec.InvalidKeySpecException;
import java.security.interfaces.RSAPrivateKey;
import java.security.interfaces.RSAPublicKey;
import java.io.*;
import java.math.BigInteger;

/**
 * RSA 工具类。提供加密,解密,生成密钥对等方法。
 * 
 */
public class RSAUtil {

	/**
	 * 生成密钥对
	 * 
	 * @return KeyPair
	 * @throws
	 */
	public static KeyPair generateKeyPair() {
		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.genKeyPair();
			return keyPair;
		} catch (Exception e) {
			return null;
		}
	}

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

		}

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

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

		}

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

	/**
	 * 加密
	 * 
	 * @param key
	 *            加密的密钥
	 * @param data
	 *            待加密的明文数据
	 * @return 加密后的数据
	 * @throws
	 */
	public static byte[] encrypt(Key key, byte[] data) {
		try {
			Cipher cipher = Cipher.getInstance("RSA",
					new org.bouncycastle.jce.provider.BouncyCastleProvider());
			cipher.init(Cipher.ENCRYPT_MODE, key);
			int blockSize = cipher.getBlockSize();// 获得加密块大小,如:加密前数据为128个byte,而key_size=1024
			
			// 加密块大小为127
			// byte,加密后为128个byte;因此共有2个加密块,第一个127
			// byte第二个为1个byte
			int outputSize = cipher.getOutputSize(data.length);// 获得加密块加密后块大小
			int leavedSize = data.length % blockSize;
			int blocksSize = leavedSize != 0 ? data.length / blockSize + 1
					: data.length / blockSize;
			byte[] raw = new byte[outputSize * blocksSize];
			int i = 0;
			while (data.length - i * blockSize > 0) {
				if (data.length - i * blockSize > blockSize)
					cipher.doFinal(data, i * blockSize, blockSize, raw, i
							* outputSize);
				else
					cipher.doFinal(data, i * blockSize, data.length - i
							* blockSize, raw, i * outputSize);
				// 这里面doUpdate方法不可用,查看源代码后发现每次doUpdate后并没有什么实际动作除了把byte[]放到ByteArrayOutputStream中,而最后doFinal的时候才将所有的byte[]进行加密,可是到了此时加密块大小很可能已经超出了OutputSize所以只好用dofinal方法。

				i++;
			}
			return raw;
		} catch (Exception e) {
			return null;
		}
	}

	/**
	 * 解密
	 * 
	 * @param key
	 *            解密的密钥
	 * @param raw
	 *            已经加密的数据
	 * @return 解密后的明文
	 * @throws
	 */
	public static byte[] decrypt(Key key, byte[] raw) {
		try {
			Cipher cipher = Cipher.getInstance("RSA",
					new org.bouncycastle.jce.provider.BouncyCastleProvider());
			cipher.init(cipher.DECRYPT_MODE, key);
			int blockSize = cipher.getBlockSize();
			ByteArrayOutputStream bout = new ByteArrayOutputStream(64);
			int j = 0;

			while (raw.length - j * blockSize > 0) {
				bout.write(cipher.doFinal(raw, j * blockSize, blockSize));
				j++;
			}
			return bout.toByteArray();
		} catch (Exception e) {
			return null;
		}
	}

	/**
	 * 
	 * @param args
	 * @throws Exception
	 */
	public static void main(String[] args) throws Exception {
		
		// 读取要加密的文件
		File file = new File("d:/test.html");
		FileInputStream in = new FileInputStream(file);
		ByteArrayOutputStream bout = new ByteArrayOutputStream();
		byte[] tmpbuf = new byte[1024];
		int count = 0;
		while ((count = in.read(tmpbuf)) != -1) {
			bout.write(tmpbuf, 0, count);
			tmpbuf = new byte[1024];
		}
		in.close();
		
		// 对数据文件进行加密处理
		byte[] orgData = bout.toByteArray();
		KeyPair keyPair = RSAUtil.generateKeyPair();
		RSAPublicKey pubKey = (RSAPublicKey) keyPair.getPublic();
		RSAPrivateKey priKey = (RSAPrivateKey) keyPair.getPrivate();

		byte[] pubModBytes = pubKey.getModulus().toByteArray();
		byte[] pubPubExpBytes = pubKey.getPublicExponent().toByteArray();
		byte[] priModBytes = priKey.getModulus().toByteArray();
		byte[] priPriExpBytes = priKey.getPrivateExponent().toByteArray();
		RSAPublicKey recoveryPubKey = RSAUtil.generateRSAPublicKey(pubModBytes,
				pubPubExpBytes);
		RSAPrivateKey recoveryPriKey = RSAUtil.generateRSAPrivateKey(
				priModBytes, priPriExpBytes);

		// 对文件进行加密
		byte[] raw = RSAUtil.encrypt(priKey, orgData);
		file = new File("encrypt_result.dat");
		OutputStream out = new FileOutputStream(file);
		out.write(raw);
		out.close();
		
		// 对文件进行解密
		byte[] data = RSAUtil.decrypt(recoveryPubKey, raw);
		file = new File("decrypt_result.html");
		out = new FileOutputStream(file);
		out.write(data);
		out.flush();
		out.close();
	}
}

 code from :

http://code.google.com/p/jsc4/source/browse/trunk/JSC4/src/eticketApplet/RSAUtil.java?spec=svn35&r=35

分享到:
评论

相关推荐

    unity工具类RSA加密和解密

    本文将深入探讨RSA加密和解密的基础知识以及如何在Unity中实现这一功能。 首先,RSA加密的核心原理是基于大整数因子分解的困难性。它生成一对密钥:公钥和私钥。公钥可以公开,用于加密;而私钥必须保密,用于解密...

    C# .net版 RSA 公钥加密私钥解密 私钥加密公钥解密

    - RSA加密过程是不可逆的,因此在使用前需确认加密和解密的对象匹配。 在给出的链接中(https://blog.csdn.net/qq_37835111/article/details/87358779),作者提供了一个具体的示例,演示了如何在C# .NET环境下...

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

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

    C# RSA加密解密

    本篇文章将深入探讨C#如何实现RSA加密解密,并结合Winform界面进行演示。 **1. RSA算法基础** RSA算法基于数论原理,包括大数因子分解的困难性。它包含两个密钥:公钥和私钥。公钥可以公开,用于加密;私钥必须...

    RSA.rar_RSA加密文件_RSA加密明文_RSA加密解密和_rsa c_rsa文件加密

    RSA算法是一种非对称加密...总的来说,这个压缩包提供了一套完整的RSA加密解密解决方案,涵盖了理论知识、C语言实现以及用户交互的界面设计。对于学习RSA算法和实践加密应用的开发者来说,这是一个非常有价值的资源。

    C#RSA私钥加密公钥解密

    总的来说,这个项目展示了如何在C#中使用`System.Numerics.BigInteger`实现RSA加密算法,同时提供了私钥加密和公钥解密的功能,确保了数据的安全性。为了实际应用,你需要理解并掌握RSA算法的原理,以及如何在.NET...

    RSA.zip_RSA 加密解密_rsa_rsa加密算法_rsa加密解密_rsa加密解密算法

    本资源提供了RSA加密解密的源码,适用于学习和理解RSA算法的工作原理及其实现。 首先,RSA算法的核心原理基于大数的因式分解困难性。它由三位科学家Rivest、Shamir和Adleman于1977年提出,因此得名RSA。该算法包括...

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

    本例中的Project1.exe可能是一个Delphi编译的示例应用程序,展示了如何在Delphi环境中使用RSA加密和解密。这个程序应该演示了如何生成RSA密钥对,使用公钥加密数据,然后使用私钥解密,反之亦然。在实际应用中,公钥...

    Rsa加密解密.rar_RSA 加密解密_java rsa_rsa加密_rsa加密java_加密 解密

    RSA加密解密是一种广泛应用于网络安全领域的非对称加密算法,由Ron Rivest、Adi Shamir和Leonard Adleman三位科学家在1977年提出,因此得名RSA。这种算法基于大整数因子分解的困难性,使得只有持有正确密钥的人才能...

    RSA算法JAVA公钥加密,C#私钥解密

    RSA算法是一种非对称加密技术,它在信息安全领域扮演着重要的角色。非对称加密与对称加密的主要区别在于,它使用两个不同的密钥:一个...开发者可以通过运行这些示例代码,理解并应用RSA加密解密技术到自己的项目中。

    C#使用PEM文件RSA加密和解密

    通常C#使用xml格式的密钥文件,不能使用Linux下的公钥和私钥pem文件。...本源码直接使用linux下的PEM文件来做RSA加密和解密,可避免xml格式文件的移植性问题。完整的源码,Vs2008工程,以编译和测试通过。

    飞桨模型加密库-基于RSA加密的数据加密和解密(分发模型时对框架和python库加密).zip

    飞桨模型加密库-基于RSA加密的数据加密和解密(分发模型时对框架和python库加密).zip飞桨模型加密库-基于RSA加密的数据加密和解密(分发模型时对框架和python库加密).zip飞桨模型加密库-基于RSA加密的数据加密和解密...

    RSA.rar_RSA加密文件_RSA加密解密和_rsa加密算法_对称 加密文件_对称加密

    10. **源代码与实践**:提供的RAR文件可能包含RSA加密和解密的源代码及可执行文件,这对于学习密码学理论和实践非常有价值。通过阅读和运行这些代码,可以深入理解RSA的工作机制。 总之,RSA加密算法是现代密码学的...

    前端(javascript)使用AES、RSA对数据进行加密以及解密,本人亲测代码通过

    注意:AES用的是CryptoJS库的,而RSA则是用的jsencrypt库,RSA用的公钥和私钥是PEM格式的,其他格式无法通过,同时只能支持公钥加密,私钥解密。tips:支持跨语言,支持js与.net后台的加密以及解密,如需借鉴后台...

    RSA加密解密 JS加密 JAVA解密 【完美版】

    经过本人修改,简化并完善了别人的代码,使其更加的容易理解和学习! 此为一个完整的项目,可以直接在NetBeans IDE里运行测试。 功能:服务端随机生成密钥...用到的JS加密文件是从官网下载的最新版,速度快,稳定性好!

    允许使用RSA4096位私钥对Eloquent属性进行加密和解密。.zip

    本项目"允许使用RSA4096位私钥对Eloquent属性进行加密和解密"旨在增强数据安全性,确保即使数据被非法获取,也能保持其机密性。 RSA是一种非对称加密算法,由Ron Rivest、Adi Shamir和Leonard Adleman在1977年提出...

    javaRSA加密C++RSA解密

    Java OpenSSL生成的RSA公私钥进行数据加解密详细介绍 项目: JAVA生成的RSA的密文,通过C++来解密。 RSA这里就不多介绍了大家自己去看。 JAVA也是通过包来实现加密和解密的,那么我的C++是通过OPENSSL的库来实现的...

    python Django RSA 前台加密 后端解密。

    在这个场景中,我们将讨论如何在Django应用中实现RSA加密和解密,以便于前端与后端的安全通信。 首先,让我们理解RSA的基本原理。RSA是一种基于大素数因子分解困难性的公钥加密算法。它包括一对密钥:公钥(可公开...

    RSA加密解密(C#)实现

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

    rsa.rar_rsa_rsa加密解密_加密和解密

    在这个“rsa.rar”压缩包中,包含了与RSA加密解密相关的源代码和文档,可供学习和参考。 首先,我们看到有四个源代码文件:p1363.c、test1363.c和rsa.c。这些文件很可能是实现RSA算法的C语言版本。p1363.c可能包含...

Global site tag (gtag.js) - Google Analytics