java编程一个AES加密txt文件的程序,其中AES解密文件的方法出错,求大神搭救 50

//其中AES的加密解密方法encrypt(),decrypt()是正确的!而运行测试到文件加密方法FileEn()可以运行但不知道是不是AES的加密而文件解密方法Fil... //其中AES的加密解密方法encrypt(),decrypt()是正确的!
而运行测试到文件加密方法FileEn()可以运行但不知道是不是AES的加密
而文件解密方法FileDe()是出错的。
不知道这个和文件的格式有什么样的关系了?
/* ************************************文件加密方法 *********************************** */
public void FileEn(String fileReadPath,String fileWritePath,String password,int length){
File fileRead=new File(fileReadPath);
File fileWrite=new File(fileWritePath);
if(!fileRead.exists())
{
System.out.println("文件不存在");
System.exit(0);
}
if(!fileWrite.exists()){
System.out.println("创建文件");
try {
fileWrite.createNewFile();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
try {
FileInputStream fins=new FileInputStream(fileRead);
FileOutputStream fous=new FileOutputStream(fileWrite);
byte[] data=new byte[1024];
byte[] newData=new byte[1024];
while((fins.read(data))!=-1){
newData=encrypt(new String(data), password, length);
// **** encrypt(String content,String password,int length) 其中content为待加密内容 ,password加密密钥,length为密钥长度
// **** encrypt方法是将conttent用AES加密算法加密
fous.write(newData);
}
} catch (FileNotFoundException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
/* *************************************文件解密方法******************************************* */
public void FileDe(String FileReadPath,String FileWritePath,String password,int length){
File FileRead=new File(FileReadPath);
File FileWrite=new File(FileWritePath);
if(!FileRead.exists())
{
System.out.println("文件不存在");
System.exit(0);
}
if(!FileWrite.exists()){
System.out.println("创建文件");
try {
FileWrite.createNewFile();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
try {
FileInputStream fins=new FileInputStream(FileRead);
FileOutputStream fous=new FileOutputStream(FileWrite);
byte[] data=new byte[1024];
byte[] newData=new byte[1024];
while((fins.read(data))!=-1){
newData=decrvpt(data, password, length);
// decrvpt(dyte[] content,String password,int length) 其中content为解密内容 ,password解密密钥,length为密钥长度
// encrypt()方法是将content解密为明文,用的是AES算法
fous.write(newData);
}
} catch (FileNotFoundException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}

}
展开
 我来答
骨钰
2013-03-05 · TA获得超过127个赞
知道答主
回答量:109
采纳率:100%
帮助的人:69.3万
展开全部
你是对文件内容加的密,应该和文件类型无关把。如果用的是
AES算法加的密的话,初始化的时候就会写到
keygen = KeyGenerator.getInstance("AES");
//生成密钥
deskey = keygen.generateKey();
//生成Cipher对象,指定其支持的DES算法
c = Cipher.getInstance("AES");
加密和解密的过程几乎是一样的,AES是对称加密方式,你看看加密和解密方法里的有没有写错的地方。
本回答被网友采纳
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
冰火两重天
2013-03-05 · TA获得超过1425个赞
知道小有建树答主
回答量:1489
采纳率:0%
帮助的人:999万
展开全部
参考下吧:
import java.io.File;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.IOException;
import java.io.ObjectInputStream;
import java.security.InvalidKeyException;
import java.security.NoSuchAlgorithmException;
import java.security.PublicKey;
import java.security.Signature;
import java.security.SignatureException;

import org.apache.log4j.Logger;
/**
* 接受方。
* @author lucky star
*
*/
public class Receiver {
private static Logger log = Logger.getLogger(Receiver.class);
/**
* 接受方读取发送方的公钥文件得到公钥,并以公钥验证签名。
* @param publicKeyFile:公钥文件。
* @param f:发送方发送的文件。
* @return:签名是否验证OK。
* @throws NoSuchAlgorithmException:如果没有此算法。
* @throws FileNotFoundException:如果文件未找到。
* @throws IOException:如果读写异常
* @throws ClassNotFoundException:如果类未找到
* @throws InvalidKeyException:如果公钥不可用
* @throws SignatureException:如果签名失败
*/
public boolean receive(File publicKeyFile,File signedFile,File f) throws NoSuchAlgorithmException, FileNotFoundException, IOException, ClassNotFoundException, InvalidKeyException, SignatureException {
if (publicKeyFile == null) {
throw new FileNotFoundException("公钥文件未找到!");
}
if (f == null) {
throw new FileNotFoundException("发送方没有发送文件!");
}
// 读取公钥文件得到公钥
ObjectInputStream in = new ObjectInputStream(new FileInputStream(publicKeyFile));
PublicKey pk = (PublicKey) in.readObject();
in.close();

// 读取发送方发送的文件,读入字节数组
byte[] data = new byte[(int) f.length()];
FileInputStream fis = new FileInputStream(f);
fis.read(data);

// 读取发送方的签名文件
byte[] signData = new byte[(int) signedFile.length()];
FileInputStream fis2 = new FileInputStream(signedFile);
fis2.read(signData);
fis2.close();

// 使用发送方的公钥验证签名
Signature sign = Signature.getInstance("DSA");
sign.initVerify(pk);
sign.update(data);
return sign.verify(signData);
}

public static void main(String[] args) {
// 公钥文件
String publicFileName = "public.key";
// 签名文件
String signedFileName = "signature.dtx";
// 发送方发送的文件。
File f = new File("d:/test.xml");
File publicFile = new File(publicFileName);
File sigendFile = new File(signedFileName);

try {
Receiver recv = new Receiver();
// 接受方读取发送方提供的公钥文件验证签名是否一致
boolean isOk = recv.receive(publicFile,sigendFile, f);
if (isOk) {
log.info("接受方验证文件无篡改!");
}
else {
log.info("接受方验证文件被篡改!");
}
} catch (NoSuchAlgorithmException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (FileNotFoundException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (InvalidKeyException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (SignatureException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (ClassNotFoundException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}

import java.io.File;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.ObjectInputStream;
import java.io.ObjectOutputStream;
import java.security.InvalidKeyException;
import java.security.KeyPair;
import java.security.KeyPairGenerator;
import java.security.NoSuchAlgorithmException;
import java.security.PrivateKey;
import java.security.PublicKey;
import java.security.Signature;
import java.security.SignatureException;

import org.apache.log4j.Logger;
/**
* 发送方。
* @author lucky star
*
*/
public class Sender {
private static Logger log = Logger.getLogger(Sender.class);

public void writeKeysToFiles(String privateFileName,String publicFileName) throws NoSuchAlgorithmException, FileNotFoundException, IOException {
KeyPairGenerator keygen = KeyPairGenerator.getInstance("DSA");
keygen.initialize(1024);
KeyPair kp = keygen.generateKeyPair();
PrivateKey privateKey = kp.getPrivate();
PublicKey publicKey = kp.getPublic();
ObjectOutputStream out_private = new ObjectOutputStream(new FileOutputStream(privateFileName));
out_private.writeObject(privateKey);
out_private.close();

ObjectOutputStream out_public = new ObjectOutputStream(new FileOutputStream(publicFileName));
out_public.writeObject(publicKey);
out_public.close();

log.debug("已生成私钥文件:" + privateFileName + ",公钥文件:" + publicFileName);
}

/**
* 读取私钥文件得到私钥,并根据文件内容生成签名并写入签名文件。
* @param privateFile:私钥文件。
* @param f:要发送的文件
* @throws FileNotFoundException:如果文件未找到
* @throws IOException:如果出现读写异常
* @throws ClassNotFoundException:如果类未找到
* @throws NoSuchAlgorithmException:如果没有此算法
* @throws InvalidKeyException:如果私钥不可用
* @throws SignatureException:如果签名失败
*/
public void send(File privateFile,File sigendFile,File f) throws FileNotFoundException, IOException, ClassNotFoundException, NoSuchAlgorithmException, InvalidKeyException, SignatureException {
if (privateFile==null) {
throw new FileNotFoundException("没有找到私钥文件!");
}
if (f == null) {
throw new FileNotFoundException("没有找到要加密的文件!");
}
// 读取文件,得到私钥
ObjectInputStream in = new ObjectInputStream(new FileInputStream(privateFile));
PrivateKey privateKey = (PrivateKey) in.readObject();
in.close();

// 根据文件生成签名,并保存到文件signature.dxt
byte[] data = new byte[(int) f.length()];
FileInputStream fis = new FileInputStream(f);
fis.read(data);
fis.close();

Signature sign = Signature.getInstance("DSA");
sign.initSign(privateKey);
sign.update(data);
// 生成签名
byte[] signedBytes = sign.sign();
// 将签名写入文件
FileOutputStream fos = new FileOutputStream(sigendFile);
fos.write(signedBytes,0,signedBytes.length);
fos.close();

log.debug("根据文件内容生成签名并写入签名文件完毕!");
log.debug("签名文件写入到" + sigendFile.getName());
}

public static void main(String[] args) {
// 私钥文件
String privateFileName = "private.key";
// 公钥文件
String publicFileName = "public.key";
// 签名文件
String signedFileName = "signature.dtx";
// 发送方要发送的文件。
File f = new File("d:/test.xml");
File privateFile = new File(privateFileName);
File sigendFile = new File(signedFileName);

try {
Sender sender = new Sender();
// 发送方将公钥和私钥保存到文件private.key和public.key
sender.writeKeysToFiles(privateFileName, publicFileName);
// 发送方根据文件内容生成签名并写入signature.dtx
sender.send(privateFile,sigendFile,f);
} catch (NoSuchAlgorithmException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (FileNotFoundException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (InvalidKeyException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (SignatureException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (ClassNotFoundException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
收起 1条折叠回答
推荐律师服务: 若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询

为你推荐:

下载百度知道APP,抢鲜体验
使用百度知道APP,立即抢鲜体验。你的手机镜头里或许有别人想知道的答案。
扫描二维码下载
×

类别

我们会通过消息、邮箱等方式尽快将举报结果通知您。

说明

0/200

提交
取消

辅 助

模 式