文档库 最新最全的文档下载
当前位置:文档库 › RSA加密算法java编程实现

RSA加密算法java编程实现

RSA加密算法java编程实现
RSA加密算法java编程实现

一、RSA加密算法的原理

(1)、RSA算法描述

RSA公钥密码体制的基本原理:根据数论,寻求两个大素数比较简单,而将他们的乘积分解开则极为困难。

(2)、RSA算法密钥计算过程:

1.用户秘密选取两个大素数p 和q,计算n=pq,n称为

RSA算法的模数,公开。

2.计算出n的欧拉函数Φ(n) = (p-1)×(q-1),保密。

3.从(1, Φ(n))中随机地选择一个与Φ(n)互素的数e作为加

密密钥,公开。

4.计算出满足下式的d 作为解密密钥,保密。

ed=1 mod Φ(n)

(3)、RSA算法密钥:

加密密钥PK = |e, n| 公开

解密密钥SK = |d, n| 保密

(4)、RSA算法加密解密过程:

RSA算法属于分组密码,明文在加密前要进行分组,分组

的值m 要满足:0 < m < n

加密算法:C = E(m) ≡me mod n

解密算法:m = D(c) ≡cd mod n

(5)、RSA算法的几点说明:

1.对于RSA算法,相同的明文映射出相同的密文。

2.RSA算法的密钥长度:是指模数n的长度,即n的二进

制位数,而不是e或d的长度。

3.RSA的保密性基于大数进行因式分解很花时间,因此,

进行RSA加密时,应选足够长的密钥。512bit已被证明

不安全,1024bit也不保险。

4.RSA最快情况也比DES慢100倍,仅适合少量数据的加

密。公钥e取较小值的方案不安全。

二.RSA公钥加密算法的编程实现

以下程序是java编写的实现RSA加密及解密的算法

import java.security.KeyPair;

import java.security.KeyPairGenerator;

import java.security.NoSuchAlgorithmException;

import java.security.SecureRandom;

import java.security.interfaces.RSAPrivateKey;

import java.security.interfaces.RSAPublicKey;

import javax.crypto.Cipher;

//RSATest类即为测试类

public class RSATest {

//主函数

public static void main(String[] args) {

try {

RSATest encrypt = new RSATest();

String encryptText = "encryptText";//输入的明文

KeyPair keyPair = encrypt.generateKey();//调用函数生成密钥对,函数见下

RSAPrivateKey privateKey = (RSAPrivateKey) keyPair.getPrivate(); RSAPublicKey publicKey = (RSAPublicKey) keyPair.getPublic();

byte[] e = encrypt.encrypt(publicKey, encryptText.getBytes());

//调用自己编写的encrypt函数实现加密,

byte[] de = encrypt.decrypt(privateKey, e);

//调用自己编写的decrypt函数实现解密,

System.out.println(toHexString(e)); //输出结果,采用ASSIC码形式

System.out.println(toHexString(de));

} catch (Exception e) {

e.printStackTrace();

}

}

// generateKey密钥对生成函数的实现

public KeyPair generateKey() throws NoSuchAlgorithmException { KeyPairGenerator keyPairGen = KeyPairGenerator.getInstance("RSA"); //返回生成指定算法的public/private 密钥对的KeyPairGenerator 对象。

keyPairGen.initialize(1024, new SecureRandom());

//使用给定的随机源(和默认的参数集合)初始化确定密钥大小的密钥对生成器。

KeyPair keyPair = keyPairGen.generateKeyPair();//生成一个密钥对return keyPair;

}

// encrypt加密函数

protected byte[] encrypt(RSAPublicKey publicKey, byte[] data) { if (publicKey != null) {

try {

Cipher cipher = Cipher.getInstance("RSA");

//返回实现指定转换的Cipher对象。

cipher.init(Cipher.ENCRYPT_MODE, publicKey);

//用密钥初始化此Cipher,第一个参数表示加密

return cipher.doFinal(data);

//按单部分操作加密或解密数据,或者结束一个多部分操作。数据将被加密或解密(具体取决于此Cipher 的初始化方式)。

} catch (Exception e) {

e.printStackTrace();

}

}

return null;

}

// decrypt解密函数

protected byte[] decrypt(RSAPrivateKey privateKey, byte[] raw) { if (privateKey != null) {

try {

Cipher cipher = Cipher.getInstance("RSA");

cipher.init(Cipher.DECRYPT_MODE, privateKey); //第一个参数表示解密return cipher.doFinal(raw);

} catch (Exception e) {

e.printStackTrace();

}

}

return null;

}

// toHexString将字节数组变为ASSIC码表示的字符串

public static String toHexString(byte[] b) {

StringBuilder sb = new StringBuilder(b.length * 2);

//构造一个不带任何字符的字符串生成器,其初始容量由capacity参数指定。

for (int i = 0; i < b.length; i++) {

sb.append(HEXCHAR[(b[i] & 0xf0) >>> 4]);

// append方法始终将这些字符添加到生成器的末端;而insert方法则在指定的点添加字符。

//调用HEXCHAR方法

sb.append(HEXCHAR[b[i] & 0x0f]);

}

return sb.toString();

}

//构建一个HEXCHAR数组

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

}

小结:

RSA公开密钥的加密算法实现方法如上所述,我们先是调用API生成了RSA的密钥对,然后调用API实现了加密与解密,最终通过编译的函数实现了字符数组的字符串输出,且输出的是字符串的ASSIC.

相关文档