package com.test.zc;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.ObjectInputStream;
import java.io.ObjectOutputStream;
import java.io.OutputStream;
import java.io.Serializable;
import java.security.KeyPair;
import java.security.KeyPairGenerator;
import java.security.NoSuchAlgorithmException;
import java.security.interfaces.RSAPrivateKey;
import java.security.interfaces.RSAPublicKey;
import java.util.Scanner;
import java.util.Vector;
import javax.crypto.Cipher;
public class RSAEncrypt implements Serializable {
/**
*
*/
private static final long serialVersionUID = -6905604215351939890L;
private KeyPairGenerator keyPairGen;
private KeyPair keyPair;
private RSAPrivateKey privateKey;
private RSAPublicKey publicKey;
// 测试
public static void main(String[] args) {
RSAEncrypt encrypt = new RSAEncrypt();
try {
encrypt.readFile();
} catch (FileNotFoundException e1) {
encrypt.initEncrypt();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (ClassNotFoundException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
Scanner input = new Scanner(System.in);
System.out.println("加密 y/n :");
if ("y".equals(input.next())) {
System.out.println("加密操作");
System.out.println("请输入需加密的文件路径:");
File file = new File(input.next());
if (file.exists()) {
System.out.println("请输入加密后的输出路径:");
File newFile = new File(input.next());
encrypt.encryptFile(encrypt, file, newFile);
}
} else {
System.out.println("解密操作");
System.out.println("请输入需解密的文件路径:");
File file = new File(input.next());
if (file.exists()) {
System.out.println("请输入解密后的输出路径:");
File newFile = new File(input.next());
try {
encrypt.decryptFile(encrypt, file, newFile);
} catch (Exception e) {
System.out.println("不是加密文件");
}
}
}
}
public void readFile() throws IOException, ClassNotFoundException {
FileInputStream fis = null;
fis = new FileInputStream("d:/rsa.ob");
ObjectInputStream ois = new ObjectInputStream(fis);
Vector vector = (Vector) ois.readObject();
this.setPublicKey((RSAPublicKey) vector.get(0));
this.setPrivateKey((RSAPrivateKey) vector.get(1));
ois.close();
fis.close();
}
public void initEncrypt() {
// 实例类型
try {
this.setKeyPairGen(KeyPairGenerator.getInstance("RSA"));
} catch (NoSuchAlgorithmException e2) {
// TODO Auto-generated catch block
e2.printStackTrace();
}
// 初始化长度
this.getKeyPairGen().initialize(512);
// 生成KeyPair
this.setKeyPair(this.getKeyPairGen().generateKeyPair());
// Generate keys
this.setPrivateKey((RSAPrivateKey) this.getKeyPair().getPrivate());
this.setPublicKey((RSAPublicKey) this.getKeyPair().getPublic());
FileOutputStream fos = null;
ObjectOutputStream oos = null;
try {
fos = new FileOutputStream("d:/rsa.ob");
oos = new ObjectOutputStream(fos);
Vector vector = new Vector();
vector.add(this.getPublicKey());
vector.add(this.getPrivateKey());
oos.writeObject(vector);
oos.close();
fos.close();
} catch (IOException e) {
e.printStackTrace();
}
}
/**
* 加密文件
*
* @param encrypt
* RSAEncrypt对象
* @param file
* 源文件
* @param newFile
* 目标文件
*/
public void encryptFile(RSAEncrypt encrypt, File file, File newFile) {
try {
InputStream is = new FileInputStream(file);
OutputStream os = new FileOutputStream(newFile);
byte[] bytes = new byte[53];
while (is.read(bytes) > 0) {
byte[] e = encrypt.encrypt(encrypt.getPublicKey(), bytes);
bytes = new byte[53];
os.write(e, 0, e.length);
}
os.close();
is.close();
System.out.println("write success");
} catch (Exception e) {
e.printStackTrace();
}
}
/**
* 解密文件
*
* @param encrypt
* RSAEncrypt对象
* @param file
* 源文件
* @param newFile
* 目标文件
*/
public void decryptFile(RSAEncrypt encrypt, File file, File newFile) {
try {
InputStream is = new FileInputStream(file);
OutputStream os = new FileOutputStream(newFile);
byte[] bytes1 = new byte[64];
while (is.read(bytes1) > 0) {
byte[] de = encrypt.decrypt(encrypt.getPrivateKey(), bytes1);
bytes1 = new byte[64];
os.write(de, 0, de.length);
}
os.close();
is.close();
System.out.println("write success");
} catch (Exception e) {
e.printStackTrace();
}
}
/**
* 加密实现
*
* @return byte[] 加密后的字节数组
*/
protected byte[] encrypt(RSAPublicKey publicKey, byte[] obj) {
if (publicKey != null) {
try {
Cipher cipher = Cipher.getInstance("RSA");
cipher.init(Cipher.ENCRYPT_MODE, publicKey);
return cipher.doFinal(obj);
} catch (Exception e) {
e.printStackTrace();
}
}
return null;
}
/**
* 解密实现
*
* @return byte[] 解密后的字节数组
*/
protected byte[] decrypt(RSAPrivateKey privateKey, byte[] obj) {
if (privateKey != null) {
try {
Cipher cipher = Cipher.getInstance("RSA");
cipher.init(Cipher.DECRYPT_MODE, privateKey);
return cipher.doFinal(obj);
} catch (Exception e) {
e.printStackTrace();
}
}
return null;
}
public KeyPair getKeyPair() {
return keyPair;
}
public void setKeyPair(KeyPair keyPair) {
this.keyPair = keyPair;
}
public KeyPairGenerator getKeyPairGen() {
return keyPairGen;
}
public void setKeyPairGen(KeyPairGenerator keyPairGen) {
this.keyPairGen = keyPairGen;
}
public RSAPrivateKey getPrivateKey() {
return privateKey;
}
public void setPrivateKey(RSAPrivateKey privateKey) {
this.privateKey = privateKey;
}
public RSAPublicKey getPublicKey() {
return publicKey;
}
public void setPublicKey(RSAPublicKey publicKey) {
this.publicKey = publicKey;
}
}
写的仓促很不规范...反正是给别人提供思路..无所谓啦 哈哈 :D