菜鸟第一帖—文本加密


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
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值