您的位置:首页 > 其它

RSA简单加密与解密

2016-11-13 16:30 323 查看
package entity;

import java.io.BufferedReader;

import java.io.BufferedWriter;

import java.io.FileInputStream;

import java.io.FileNotFoundException;

import java.io.FileOutputStream;

import java.io.InputStreamReader;

import java.io.ObjectInputStream;

import java.io.ObjectOutputStream;

import java.io.OutputStreamWriter;

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;

public class RSADemo{
/*
* 产生秘钥
*/
public static  void generateKey(){
try {
//指定算法
KeyPairGenerator kpg=KeyPairGenerator.getInstance("RSA");
//确定密钥大小
kpg.initialize(1024);
//产生密钥对
KeyPair kp=kpg.genKeyPair();
//获取公钥
PublicKey publicKey=kp.getPublic();
//获取私钥
PrivateKey privateKey=kp.getPrivate();

//保存公钥
FileOutputStream f1=new FileOutputStream("publicKey.dat");
ObjectOutputStream o1=new ObjectOutputStream(f1);
o1.writeObject(publicKey);
o1.close();
f1.close();

//保存私钥
FileOutputStream f2=new FileOutputStream("privateKey.dat");
ObjectOutputStream o2=new ObjectOutputStream(f2);
o2.writeObject(privateKey);

o2.close();
f2.close();
} catch (Exception e) {
e.printStackTrace();
}
}

/*
* 加密
*/
public static void encrypt(){
//明文
String s="Hello World!";
try {
//获取公钥及参数e,n
FileInputStream f=new FileInputStream("publicKey.dat");
ObjectInputStream oos=new ObjectInputStream(f);
RSAPublicKey  publicKey=(RSAPublicKey) oos.readObject();
   BigInteger e= publicKey.getPublicExponent();
   BigInteger n= publicKey.getModulus();
   System.out.println("参数e= " + e);  
       System.out.println("参数n= " + n);  
       
       //获取明文
       byte[] content=s.getBytes("UTF-8");
       BigInteger m=new BigInteger(content);
       
       //计算密文
       BigInteger c=m.modPow(e, n);
       System.out.println("密文为:"+c);
       
       //保存密文
       String c1=c.toString();
       BufferedWriter out=new BufferedWriter(new OutputStreamWriter( 
       
new FileOutputStream("encrypt.dat")));
       out.write(c1,0,c1.length());

       out.close();//一定要记得关闭,否则会出现空指针异常
} catch (Exception e) {
e.printStackTrace();
}
}

public static void decrypt(){
try {
//读取密文
BufferedReader br=new BufferedReader(new InputStreamReader(
new FileInputStream("encrypt.dat")));
String content=br.readLine();
BigInteger c=new BigInteger(content);
//读取私钥
FileInputStream f1=new FileInputStream("privateKey.dat");
ObjectInputStream o1=new ObjectInputStream(f1);
RSAPrivateKey privateKey=(RSAPrivateKey) o1.readObject();
// 获取私钥参数及解密  
BigInteger d=privateKey.getPrivateExponent();
BigInteger n=privateKey.getModulus();
System.out.println("参数d="+d);
System.out.println("参数n="+n);
BigInteger m=c.modPow(d, n);

//显示解密结果
byte[] mt=m.toByteArray();
for(int i=0;i<mt.length;i++){
System.out.print((char)mt[i]);
}
} catch (Exception e) {
e.printStackTrace();
}
}
public static void main(String[] args) {
try {
generateKey();
encrypt();
decrypt();
} catch (Exception e) {
       System.out.println(e.toString());  
}
}

}

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