packagecom.paul.module.common.util;importsun.misc.BASE64Decoder;importsun.misc.BASE64Encoder;importjava.io.FileInputStream;importjava.io.FileOutputStream;importjava.io.ObjectInputStream;importjava.io.ObjectOutputStream;importjava.security.Key;importjava.security.KeyPair;importjava.security.KeyPairGenerator;importjavax.crypto.Cipher;public classRSASecurityUtil2 {/**指定加密算法为RSA*/
private static final String ALGORITHM = "RSA";/**密钥长度,用来初始化*/
private static final int KEYSIZE = 1024;/**指定公钥存放文件*/
private static String PUBLIC_KEY_FILE = "PublicKey";/**指定私钥存放文件*/
private static String PRIVATE_KEY_FILE = "PrivateKey";/*** 生成密钥对
*@throwsException*/
private static void generateKeyPair() throwsException {///** RSA算法要求有一个可信任的随机数源 *///SecureRandom secureRandom = new SecureRandom();
/**为RSA算法创建一个KeyPairGenerator对象*/KeyPairGenerator keyPairGenerator=KeyPairGenerator.getInstance(ALGORITHM);/**利用上面的随机数据源初始化这个KeyPairGenerator对象*/
//keyPairGenerator.initialize(KEYSIZE, secureRandom);
keyPairGenerator.initialize(KEYSIZE);/**生成密匙对*/KeyPair keyPair=keyPairGenerator.generateKeyPair();/**得到公钥*/Key publicKey=keyPair.getPublic();/**得到私钥*/Key privateKey=keyPair.getPrivate();
ObjectOutputStream oos1= null;
ObjectOutputStream oos2= null;try{/**用对象流将生成的密钥写入文件*/oos1= new ObjectOutputStream(newFileOutputStream(PUBLIC_KEY_FILE));
oos2= new ObjectOutputStream(newFileOutputStream(PRIVATE_KEY_FILE));
oos1.writeObject(publicKey);
oos2.writeObject(privateKey);
}catch(Exception e) {throwe;
}finally{/**清空缓存,关闭文件输出流*/oos1.close();
oos2.close();
}
}/*** 加密方法
*@paramsource 源数据
*@return*@throwsException*/
public static String encrypt(String source) throwsException {
generateKeyPair();
Key publicKey;
ObjectInputStream ois= null;try{/**将文件中的公钥对象读出*/ois= new ObjectInputStream(newFileInputStream(
PUBLIC_KEY_FILE));
publicKey=(Key) ois.readObject();
}catch(Exception e) {throwe;
}finally{
ois.close();
}/**得到Cipher对象来实现对源数据的RSA加密*/Cipher cipher=Cipher.getInstance(ALGORITHM);
cipher.init(Cipher.ENCRYPT_MODE, publicKey);byte[] b =source.getBytes();/**执行加密操作*/
byte[] b1 =cipher.doFinal(b);
BASE64Encoder encoder= newBASE64Encoder();returnencoder.encode(b1);
}/*** 解密算法
*@paramcryptograph 密文
*@return*@throwsException*/
public static String decrypt(String cryptograph) throwsException {
Key privateKey;
ObjectInputStream ois= null;try{/**将文件中的私钥对象读出*/ois= new ObjectInputStream(newFileInputStream(
PRIVATE_KEY_FILE));
privateKey=(Key) ois.readObject();
}catch(Exception e) {throwe;
}finally{
ois.close();
}/**得到Cipher对象对已用公钥加密的数据进行RSA解密*/Cipher cipher=Cipher.getInstance(ALGORITHM);
cipher.init(Cipher.DECRYPT_MODE, privateKey);
BASE64Decoder decoder= newBASE64Decoder();byte[] b1 =decoder.decodeBuffer(cryptograph);/**执行解密操作*/
byte[] b =cipher.doFinal(b1);return newString(b);
}public static void main(String[] args) throwsException {
String source= "恭喜发财!";//要加密的字符串
System.out.println("准备用公钥加密的字符串为:" +source);
String cryptograph= encrypt(source);//生成的密文
System.out.print("用公钥加密后的结果为:" +cryptograph);
System.out.println();
String target= decrypt(cryptograph);//解密密文
System.out.println("用私钥解密后的字符串为:" +target);
System.out.println();
}
}