您的位置:首页 > 编程语言 > Java开发

java RSA 加密/解密

2014-04-04 18:22 417 查看
package cn.shinkong.cxf.security;

import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.ObjectInputStream;
import java.io.ObjectOutputStream;
import java.security.KeyPair;
import java.security.KeyPairGenerator;
import java.security.interfaces.RSAPrivateKey;
import java.security.interfaces.RSAPublicKey;

import javax.crypto.Cipher;

import org.apache.ws.security.util.Base64;

public class Encryption_RSA {

/** 指定加密算法为RSA */
private final String ALGORITHM = "RSA";
/** 密钥长度,用来初始化 */
private final int KEYSIZE = 1024;
/** 指定公钥存放文件 */
private String PUBLIC_KEY_FILE = "PublicKey";
/** 指定私钥存放文件 */
private static final String PRIVATE_KEY_FILE = System.getProperty("user.dir");
private String path = "";

/** 生成公钥和私钥
*/
@SuppressWarnings("unused")
private void generateKeyPair() throws Exception {
// /** RSA算法要求有一个可信任的随机数源
// SecureRandom secureRandom = new SecureRandom();
//为RSA算法创建一个KeyPairGenerator对象
KeyPairGenerator keyPairGenerator = KeyPairGenerator
.getInstance(ALGORITHM);
// 利用上面的随机数据源初始化这个KeyPairGenerator对象
// keyPairGenerator.initialize(KEYSIZE, secureRandom);
keyPairGenerator.initialize(KEYSIZE);
//生成密匙对
KeyPair keyPair = keyPairGenerator.generateKeyPair();
//得到公钥
RSAPublicKey publicKey = (RSAPublicKey) keyPair.getPublic();
// 得到私钥
RSAPrivateKey privateKey = (RSAPrivateKey)keyPair.getPrivate();
ObjectOutputStream oos1 = null;
ObjectOutputStream oos2 = null;
try {
/** 用对象流将生成的密钥写入文件 (默认在文件下)*/
oos1 = new ObjectOutputStream(new FileOutputStream(PUBLIC_KEY_FILE));
oos2 = new ObjectOutputStream(
new FileOutputStream(PRIVATE_KEY_FILE));
oos1.writeObject(publicKey);
oos2.writeObject(privateKey);
} catch (Exception e) {
throw e;
} finally {
/** 清空缓存,关闭文件输出流 */
oos1.close();
oos2.close();
}
}

/**
* 加密方法
* @param String 源数据
* @return String 密文
* @throws Exception
*/
public String encrypt(String source) throws Exception {
// generateKeyPair();
RSAPublicKey publicKey;
ObjectInputStream ois = null;
try {
// 将文件中的公钥对象读出
ois = new ObjectInputStream(new FileInputStream(PRIVATE_KEY_FILE+path));
// 从 ObjectInputStream 读取对象。
publicKey = (RSAPublicKey) ois.readObject();
} catch (Exception e) {
throw e;
} finally {
ois.close();
}
//得到Cipher对象来实现对源数据的RSA加密
Cipher cipher = Cipher.getInstance(ALGORITHM);
// 用密钥初始化此 Cipher。
cipher.init(Cipher.ENCRYPT_MODE, publicKey);
//使用平台的默认字符集将此 String 编码为 byte 序列
byte[] b = source.getBytes();
/** 执行加密操作 */
byte[] b1 = cipher.doFinal(b);

return Base64.encode(b1);
}

/**
* 解密算法
*
* @param String 密文
* @return 数据
* @throws Exception
*/
public String decrypt(String cryptograph) throws Exception {
RSAPrivateKey privateKey;
ObjectInputStream ois = null;
try {
/** 将文件中的私钥对象读出 */
ois = new ObjectInputStream(new FileInputStream(PRIVATE_KEY_FILE+path));
privateKey = (RSAPrivateKey) ois.readObject();
} catch (Exception e) {
throw e;
} finally {
ois.close();
}
/** 得到Cipher对象对已用公钥加密的数据进行RSA解密 */
Cipher cipher = Cipher.getInstance(ALGORITHM);
cipher.init(Cipher.DECRYPT_MODE, privateKey);
//Base64 转码
byte[] b1 = Base64.decode(cryptograph);
/** 执行解密操作 */
byte[] b = cipher.doFinal(b1);
return new String(b);
}

public String getPath() {
return path;
}

public void setPath(String path) {
this.path = path;
}

}


 
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  java 非对称加密 rsa