实现一对密钥对整个项目所有加密解密文件都适用的方法 , 采用先生成一对密钥 . 保存到 xml 文件中 , 以后 获得私匙和公钥只需要从 xml 文件中取得就可以了 .


/**

* 把成生的一对密钥保存到 RSAKey.xml 文件中

*/

public void saveRSAKey() {

try {

SecureRandom sr = new SecureRandom();

KeyPairGenerator kg = KeyPairGenerator.getInstance("RSA",

new org.bouncycastle.jce.provider.BouncyCastleProvider());

// 注意密钥大小最好为 1024, 否则解密会有乱码情况 .

kg.initialize(1024, sr);

FileOutputStream fos = new FileOutputStream("C:/RSAKey.xml");

ObjectOutputStream oos = new ObjectOutputStream(fos);

// 生成密钥

oos.writeObject(kg.generateKeyPair());

oos.close();

} catch (Exception e) {

e.printStackTrace();

}

}





注意 : 需要从 http://www.bouncycastle.org下载 .
bcprov-jdk14-137.jar

获取密钥方法如下 :

/**

* 获得 RSA 加密的密钥。

* @return   KeyPair 返回对称密钥

*/

public static KeyPair getKeyPair() {

// 产生新密钥对

KeyPair kp;

try {

String fileName = "conf/RASKey.xml";

InputStream is = FileUtils.class.getClassLoader()

.getResourceAsStream(fileName);

ObjectInputStream oos = new ObjectInputStream(is);

kp = (KeyPair) oos.readObject();

oos.close();

} catch (Exception e) {

throw new EprasRuntimeException(" 读取加密文件出错 .", e);

}

return kp;

}







文件采用 RSA 算法加密文件

/**
*
文件 file 进行加密并保存目标文件 destFile

* @param srcFileName
*
要加密的文件 c:/test/srcFile.txt
* @param
destFileName

*
加密后存放的文件名 c:/ 加密后文件 .txt
*/

public static void encryptFile(String srcFileName,

String destFileName) throws Exception {

OutputStream outputWriter = null;

InputStream inputReader = null;

try {

Cipher cipher = Cipher.getInstance("RSA/ECB/PKCS1Padding",

new org.bouncycastle.jce.provider.BouncyCastleProvider());

byte[] buf = new byte[100];

int bufl;

cipher.init(Cipher.ENCRYPT_MODE, getKeyPair().getPublic());

outputWriter = new FileOutputStream(destFileName);

inputReader = new FileInputStream(srcFileName);

while ((bufl = inputReader.read(buf)) != -1) {

byte[] encText = null;

byte[] newArr = null;

if (buf.length == bufl) {

newArr = buf;

} else {

newArr = new byte[bufl];

for (int i = 0; i < bufl; i++) {

newArr = (byte) buf ;

}

}

encText = cipher.doFinal(newArr);

outputWriter.write(encText);

}

outputWriter.flush();



} catch (Exception e) {

throw e;

} finally {

try {

if (outputWriter != null) {

outputWriter.close();

}

if (inputReader != null) {

inputReader.close();

}

} catch (Exception e) {

}

}

}





文件采用 RSA 算法解密文件

/**
*
文件 file 进行加密并保存目标文件 destFile

* @param srcFileName
*
已加密的文件 c:/ 加密后文件 .txt
* @param
destFileName

*
解密后存放的文件名 c:/ test/ 解密后文件 .txt
*/

public static void decryptFile(String srcFileName,

String destFileName) throws Exception {

OutputStream outputWriter = null;

InputStream inputReader = null;

try {

Cipher cipher = Cipher.getInstance("RSA/ECB/PKCS1Padding",

new org.bouncycastle.jce.provider.BouncyCastleProvider());

byte[] buf = new byte[128];

int bufl;

cipher.init(Cipher.DECRYPT_MODE, getKeyPair().getPrivate());



outputWriter = new FileOutputStream(destFileName);

inputReader = new FileInputStream(srcFileName);

while ((bufl = inputReader.read(buf)) != -1) {

byte[] encText = null;

byte[] newArr = null;

if (buf.length == bufl) {

newArr = buf;

} else {

newArr = new byte[bufl];

for (int i = 0; i < bufl; i++) {

newArr = (byte) buf ;

}

}

encText = cipher.doFinal(newArr);

outputWriter.write(encText);

}

outputWriter.flush();

} catch (Exception e) {

throw e;

} finally {

try {

if (outputWriter != null) {

outputWriter.close();

}

if (inputReader != null) {

inputReader.close();

}

} catch (Exception e) {

}

}

}

如果对于大文件加密采用 RSA 算法执行速度要非常非常慢 ;
RSA 是一种应用比较广泛的非对称 加密 算法 ,是由MIT工作的三人姓名首字母命名的。 RSA 算法 主要依靠分解大素数的复杂性来 实现 其安全性,由于大素数之积难被分解,因此该密码就难被破解。(素数:质数的别称,一个大于1的自然数,除了1和它自身外,不能被其他自然数整除的数叫做质数;否则成为合数,规定1既不是质数也不是合数。)从1977年提出到现在已经四十余年,经历了各种攻击的考验,普遍认为是目前最优秀的公钥方案之一。 RSA 算法 是一种非对称加 解密 算法 。服务方生成一对 RSA 密钥,即公钥 + 私钥,将公钥提供给调用方,调用方使用公钥对数据进行 加密 后,服务方根据私钥进行 解密 。 import java x.crypto.Cipher; import java .security.*; import java .security.interfaces. RSA PrivateKey; import java .security.interfaces. RSA PublicKey; * @author guochao * @date 2021/11/10 public class RSA Test { publi 本文实例讲述了 java 实现 RSA 加密 算法 。分享给大家供大家参考,具体如下:一、什么是非对称 加密 1、 加密 的密钥与 加密 的密钥不相同,这样的 加密 算法 称之为非对称 加密 2、密钥分为:公钥,私钥公钥:可以对外给任何人的 加密 解密 的密码,是公开的私钥:通过私钥可以生成公钥,但从公钥被认为无法生成公钥(被推导出的概率小到不考虑)3、当将要 加密 的内容用公钥 加密 的时候,只能用私钥来 解密 当将要 加密 的内容用私钥 加密 的时... 5.最后简单谈谈 RSA 的安全性 在 RSA 密码应用中,公钥KU是被公开的,即e和n的数值可以被第三方窃听者得到。破解 RSA 密码的问题就是从已知的e和n的数值(n等于pq),想法求出d的数值,这样就可以得到私钥来破 解密 文。从上文中的公式:d ≡e-1 (mod((p-1)(q-1)))或de≡1 (mod((p-1)(q-1))) 我们可以看出。密码破解的实质问题是:从Pq的数值,去求出(p-1)和(q-1)。换句话说,只要求出p和q的 RSA 是一种非对称 加密 算法 ,一般采用公钥 加密 ,私钥 解密 的形式生成密钥对首先创建KeyPairGenerator类的对象,用于生成公钥和私钥对// 生成公钥和私钥对,基于 RSA 算法 生成对象KeyPairGenerator keyPairGen = KeyPairGenerator.getInstance(" RSA ");然后初始化密钥对的长度,最低长度512位,并且长度不能低于明文的长度// 初始化密... RSA 算法 是目前非常常见的 加密 算法 ,他对应的加 解密 、签名验签的场景非常常见。因其特性对大字符串加 解密 效率较低,曾经想对较长字符串加 解密 ,而因其 解密 过程为分段 解密 而捣鼓过;这里贴一下代码。