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加密解密的基本操作,包括生成密钥对、保存和加载密钥文件,以及处理超长字符的分块加密和解密。这些知识点在实际的项目开发中非常实用,特别是涉及到敏感数据传输和存储时。在处理过程中,...
后来又传了个新的,叫做“包括私钥加密的RSA密钥生成和加密解密”基于.net Framework 4编,能够生成公钥私钥,直观看到(e,n)和(d,n),能够进行文本及文件加密解密(相关函数输入输出均为byte[],非常好用),...
- 加密的原始数据长度受到RSA密钥大小的限制,通常需要先对数据进行分块或使用对称加密(如AES)对大数据进行加密,然后用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加密算法"这个压缩包文件中,可能包含了实现RSA算法的代码示例或工具,用户可以通过这些资源学习如何生成RSA密钥对,以及如何使用这些密钥进行加密和解密操作。通过实践,用户可以更深入地理解RSA的工作原理,...
RSA算法是一种非对称加密技术,它在信息安全领域扮演着重要的角色。非对称加密与对称加密的主要区别在于,它使用两个不同的密钥:一个...开发者可以通过运行这些示例代码,理解并应用RSA加密解密技术到自己的项目中。
在本项目"RSA密钥生成、JS加密、PHP解密Demo"中,我们将探讨如何使用RSA进行密钥生成、JavaScript加密以及PHP解密的流程。 1. RSA密钥生成: RSA密钥对包括一对公钥和私钥。公钥可以公开,用于加密数据;而私钥...
这些脚本可能包含了生成公私钥对、公钥加密和私钥解密的函数,并且每次运行都会随机生成新的数据进行测试,以确保算法的正确性。通过查看和理解这些代码,我们可以深入学习RSA算法的实现细节和应用。 总的来说,RSA...
- 加解密的数据长度受限于RSA密钥的大小,通常为密钥长度减去11位。因此,如果需要加密大量数据,通常会采用一种称为“密钥交换”的方式,先用RSA加密一个对称密钥,然后使用这个对称密钥加密大量数据,这样可以...
本资源提供了基于Java平台实现RSA算法的详细过程,包括密钥的生成、加解密操作,并附带有源代码和实习总结,有助于学习者深入理解和实践RSA算法。 首先,我们来了解一下RSA算法的基本原理。RSA是由Ron Rivest、Adi ...
这个程序应该演示了如何生成RSA密钥对,使用公钥加密数据,然后使用私钥解密,反之亦然。在实际应用中,公钥可以公开,而私钥必须保密,确保数据的安全性。 PKCS(Public-Key Cryptography Standards)是由RSA ...
本地生成RSA密钥对工具包,运行直接生成,1024和2048位都可以,修改配置文件config.properties中的参数即可,运行后本目录下生成4个文件:privateKey.txt,publicKey.txt,privateKey.pem,publicKey.pem
本篇文章将深入探讨C#如何实现RSA加密解密,并结合Winform界面进行演示。 **1. RSA算法基础** RSA算法基于数论原理,包括大数因子分解的困难性。它包含两个密钥:公钥和私钥。公钥可以公开,用于加密;私钥必须...
- `GenerateKeyPair()`:生成RSA密钥对。 - `Encrypt()`:使用公钥进行加密。 - `Decrypt()`:使用私钥进行解密。 - `ToBase64String()` 和 `FromBase64String()`:可能用于将字节数组转换为Base64字符串,以便于...
下面将详细介绍RSA算法的基本原理、MATLAB中的实现以及如何进行密钥生成、加密和解密、以及身份验证。 **RSA算法原理** RSA算法基于数论中的两个基本事实:大整数因子分解的困难性和欧拉函数的性质。算法主要包括...
本资源提供了RSA加密解密的源码,适用于学习和理解RSA算法的工作原理及其实现。 首先,RSA算法的核心原理基于大数的因式分解困难性。它由三位科学家Rivest、Shamir和Adleman于1977年提出,因此得名RSA。该算法包括...
总结来说,这个压缩包文件包含了一套完整的RSA加密解密资源,涵盖了理论解释、实践工具以及不同平台的代码示例,可以帮助开发者理解和应用RSA算法。无论是在桌面应用、移动设备还是服务器环境中,了解和掌握RSA都是...
2. **密钥生成**:在Delphi中,可以使用内置的TNetCrypto库或者其他第三方库(如GDI+单位)生成RSA密钥对。通常包括选择一个大素数p和q,计算n=p*q,欧拉函数φ(n)=(p-1)*(q-1),然后找到一个满足条件egcd(e, φ(n))...
在iOS平台上使用Objective-C进行RSA加密和解密通常涉及几个步骤,包括生成RSA密钥对、使用公钥加密数据、以及使用私钥解密数据。以下是一个简化的步骤说明和示例代码,展示了如何使用Objective-C和CommonCrypto库...
RSA加密解密是一种广泛应用于网络安全领域的非对称加密算法,由Ron Rivest、Adi Shamir和Leonard Adleman三位科学家在1977年提出,因此得名RSA。这种算法基于大整数因子分解的困难性,使得只有持有正确密钥的人才能...