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

自动生成RSA密钥,并进行加密和解密2

阅读更多
package com.digican.books.a0102.b0101;

import java.io.BufferedReader;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.ObjectInputStream;
import java.io.ObjectOutputStream;
import java.math.BigInteger;
import java.security.KeyPair;
import java.security.KeyPairGenerator;
import java.security.NoSuchAlgorithmException;
import java.security.PrivateKey;
import java.security.PublicKey;
import java.security.interfaces.RSAPrivateKey;
import java.security.interfaces.RSAPublicKey;

/**
 * 2010年9月1日
 * @author 姚大庆
 */
public class DigicanRSA {
	
	public static void main(String[] args) throws Exception {
		//生成密钥
		//getAutoCreateRSA("d:\\key\\rsapublickey","d:\\key\\rsaprivatekey");
		//用公钥对AES密钥加密
		/*byte[] b = getRSAPublicEncode("d:\\key\\rsapublickey","d:\\key\\aeskey");
		FileOutputStream fos = new FileOutputStream("d:\\key\\rsajiamiaes");
		fos.write(b);
		fos.flush();
		fos.close();*/
		//用私钥来解AES密钥
		byte[] b = getRSAPrivateDecode("d:\\key\\rsaprivatekey","d:\\key\\rsajiamiaes");
		FileOutputStream fos = new FileOutputStream("d:\\key\\rsajiemiaes");
		fos.write(b);
		fos.flush();
		fos.close();
	}

	/**
	 * 生成密钥
	 * 自动产生RSA1024位密钥;并保持到文件里
	 * rsaPublicKeyFilePath 公钥的文件路径名,例如:d:\publickey.txt
	 * rsaPrivateKeyFilePath 公钥的文件路径名,例如:d:\privatekey.txt
	 * @throws NoSuchAlgorithmException 
	 * @throws IOException 
	 */
	public static void getAutoCreateRSA(String rsaPublicKeyFilePath,String rsaPrivateKeyFilePath) throws NoSuchAlgorithmException, IOException{
		KeyPairGenerator kpg = KeyPairGenerator.getInstance("RSA");
		kpg.initialize(1024);
		KeyPair kp = kpg.genKeyPair();
		PublicKey puk = kp.getPublic();
		PrivateKey prk = kp.getPrivate();
		FileOutputStream pufos = new FileOutputStream(rsaPublicKeyFilePath);
		ObjectOutputStream puoos = new ObjectOutputStream(pufos);
		puoos.writeObject(puk);
		puoos.flush();
		puoos.close();
		FileOutputStream prfos = new FileOutputStream(rsaPrivateKeyFilePath);
		ObjectOutputStream proos = new ObjectOutputStream(prfos);
		proos.writeObject(prk);
		proos.flush();
		proos.close();
	}
	
	/**
	 * 加密
	 * 使用非对称方式生成的公钥进行加密RSA1024
	 * 使用公钥把AES密钥进行加密
	 * rsaPublicKeyFilePath 公钥文件路径;例如:d:\\rsapublickey.txt
	 * aesKeyFilePath 对称密钥文件路径
	 * @throws IOException 
	 * @throws ClassNotFoundException 
	 */
	public static byte[] getRSAPublicEncode(String rsaPublicKeyFilePath,String aesKeyFilePath) throws IOException, ClassNotFoundException {
		//读取公钥
		FileInputStream fis = new FileInputStream(rsaPublicKeyFilePath);
		ObjectInputStream ois = new ObjectInputStream(fis);
		RSAPublicKey pbk = (RSAPublicKey)ois.readObject();
		BigInteger e = pbk.getPublicExponent();
		BigInteger n = pbk.getModulus();
		
		//读取对称密钥
		File file = new File(aesKeyFilePath);
		byte[] baes = new byte[(int) file.length()];
		FileInputStream fisaes = new FileInputStream(file);
		fisaes.read(baes);
		
		BigInteger m = new BigInteger(baes);
		BigInteger c = m.modPow(e, n);//因为RSA算法要求整型数m的值必须小于n,所以需要计算
		byte[] bb = c.toByteArray();
		return bb;
	}
	
	/**
	 * 解密
	 * 通过非对称生成的公钥和私钥
	 * 用私钥解公钥加密数据RSA1024
	 * rsaPrivateKeyFilePath 私钥文件路径;例如:d:\\rsaprivatekey.txt
	 * publicEncodeFilePath 公钥加密后的数据;例如:d:\\rsapublickeyjiamihou.txt
	 */
	public static byte[] getRSAPrivateDecode(String rsaPrivateKeyFilePath,String publicEncodeFilePath) throws Exception{
		/*BufferedReader br = new BufferedReader(new InputStreamReader(new FileInputStream(publicEncodeFilePath)));//加密后文件
		String ctext = br.readLine();
		BigInteger c = new BigInteger(ctext);*/
		
		File file = new File(publicEncodeFilePath);
		byte[] bjia = new byte[(int) file.length()];
		FileInputStream fisaes = new FileInputStream(file);
		fisaes.read(bjia);
		BigInteger c = new BigInteger(bjia);
				
		FileInputStream fis = new FileInputStream(rsaPrivateKeyFilePath);
		ObjectInputStream ois = new ObjectInputStream(fis);
		RSAPrivateKey prk = (RSAPrivateKey)ois.readObject();
		BigInteger d = prk.getPrivateExponent();
		BigInteger n = prk.getModulus();
		BigInteger m = c.modPow(d, n);
		byte[] mt = m.toByteArray();
		return mt;
	}
}

分享到:
评论

相关推荐

    Java 生成RSA密钥进行数据加密解密 支持超长字符分区

    以上就是Java中使用RSA加密解密的基本操作,包括生成密钥对、保存和加载密钥文件,以及处理超长字符的分块加密和解密。这些知识点在实际的项目开发中非常实用,特别是涉及到敏感数据传输和存储时。在处理过程中,...

    基于.net framework4的RSA密钥生成和加密解密,包括私钥加密

    后来又传了个新的,叫做“包括私钥加密的RSA密钥生成和加密解密”基于.net Framework 4编,能够生成公钥私钥,直观看到(e,n)和(d,n),能够进行文本及文件加密解密(相关函数输入输出均为byte[],非常好用),...

    unity工具类RSA加密和解密

    - 加密的原始数据长度受到RSA密钥大小的限制,通常需要先对数据进行分块或使用对称加密(如AES)对大数据进行加密,然后用RSA加密对称密钥。 - 加密和解密过程中,保持一致的填充模式和编码方式,否则可能会导致解密...

    生成RSA密钥对

    5. RSA密钥生成:根据RSA算法,选取两个大素数p和q,计算n=p*q,欧拉函数φ(n)=(p-1)*(q-1),然后选择一个与φ(n)互质的整数e,最后计算e关于φ(n)的模逆元d,即d*e ≡ 1 mod φ(n)。公钥由(e, n)组成,私钥由(d, n)...

    RSA.rar_RSA密钥_rsa加密_rsa加密解密

    在"RSA加密算法"这个压缩包文件中,可能包含了实现RSA算法的代码示例或工具,用户可以通过这些资源学习如何生成RSA密钥对,以及如何使用这些密钥进行加密和解密操作。通过实践,用户可以更深入地理解RSA的工作原理,...

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

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

    RSA密钥生成、 JS加密、PHP解密Demo

    在本项目"RSA密钥生成、JS加密、PHP解密Demo"中,我们将探讨如何使用RSA进行密钥生成、JavaScript加密以及PHP解密的流程。 1. RSA密钥生成: RSA密钥对包括一对公钥和私钥。公钥可以公开,用于加密数据;而私钥...

    RSA生成密钥对、公钥加密和私钥解密

    这些脚本可能包含了生成公私钥对、公钥加密和私钥解密的函数,并且每次运行都会随机生成新的数据进行测试,以确保算法的正确性。通过查看和理解这些代码,我们可以深入学习RSA算法的实现细节和应用。 总的来说,RSA...

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

    - 加解密的数据长度受限于RSA密钥的大小,通常为密钥长度减去11位。因此,如果需要加密大量数据,通常会采用一种称为“密钥交换”的方式,先用RSA加密一个对称密钥,然后使用这个对称密钥加密大量数据,这样可以...

    基于RSA的公钥加密,密钥的生成及加解密,包含源代码及实习报告

    本资源提供了基于Java平台实现RSA算法的详细过程,包括密钥的生成、加解密操作,并附带有源代码和实习总结,有助于学习者深入理解和实践RSA算法。 首先,我们来了解一下RSA算法的基本原理。RSA是由Ron Rivest、Adi ...

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

    这个程序应该演示了如何生成RSA密钥对,使用公钥加密数据,然后使用私钥解密,反之亦然。在实际应用中,公钥可以公开,而私钥必须保密,确保数据的安全性。 PKCS(Public-Key Cryptography Standards)是由RSA ...

    本地生成RSA密钥对工具包,RSA加密解密

    本地生成RSA密钥对工具包,运行直接生成,1024和2048位都可以,修改配置文件config.properties中的参数即可,运行后本目录下生成4个文件:privateKey.txt,publicKey.txt,privateKey.pem,publicKey.pem

    C# RSA加密解密

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

    C#RSA私钥加密公钥解密

    - `GenerateKeyPair()`:生成RSA密钥对。 - `Encrypt()`:使用公钥进行加密。 - `Decrypt()`:使用私钥进行解密。 - `ToBase64String()` 和 `FromBase64String()`:可能用于将字节数组转换为Base64字符串,以便于...

    RSA算法:密钥生成、加密/解密和身份验证_MATLAB代码_下载

    下面将详细介绍RSA算法的基本原理、MATLAB中的实现以及如何进行密钥生成、加密和解密、以及身份验证。 **RSA算法原理** RSA算法基于数论中的两个基本事实:大整数因子分解的困难性和欧拉函数的性质。算法主要包括...

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

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

    RSA密钥加密解密

    总结来说,这个压缩包文件包含了一套完整的RSA加密解密资源,涵盖了理论解释、实践工具以及不同平台的代码示例,可以帮助开发者理解和应用RSA算法。无论是在桌面应用、移动设备还是服务器环境中,了解和掌握RSA都是...

    Delphi标准RSA加密,解密,签名.与C,Java,php等通用

    2. **密钥生成**:在Delphi中,可以使用内置的TNetCrypto库或者其他第三方库(如GDI+单位)生成RSA密钥对。通常包括选择一个大素数p和q,计算n=p*q,欧拉函数φ(n)=(p-1)*(q-1),然后找到一个满足条件egcd(e, φ(n))...

    在iOS上使用Object-C进行RSA算法的加密+解密实现代码.zip

    在iOS平台上使用Objective-C进行RSA加密和解密通常涉及几个步骤,包括生成RSA密钥对、使用公钥加密数据、以及使用私钥解密数据。以下是一个简化的步骤说明和示例代码,展示了如何使用Objective-C和CommonCrypto库...

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

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

Global site tag (gtag.js) - Google Analytics