package com.fileencrypt1;import java.io.BufferedReader;
import java.io.BufferedWriter;
import java.io.File;
import java.io.FileReader;
import java.io.FileWriter;
import java.io.IOException;
import java.lang.reflect.Array;
import java.security.SecureRandom;
import javax.crypto.Cipher;
import javax.crypto.SecretKey;
import javax.crypto.SecretKeyFactory;
import javax.crypto.spec.DESKeySpec;public class FileEncrypt {
private String key="12345678234 fdsajfljdsfajdflsajlfj";
private String from="hongli.txt";
private String to="lijuan.txt";
private String toto="hongjing.txt";

public static void main(String[] args) {
new FileEncrypt();
}
public FileEncrypt()
{
this.enFile(from, to, key);
//this.deFile(to, toto, key);
}


public void enFile(String from,String to,String key)
{
FileReader fr=null;
FileWriter fw=null;
BufferedReader br=null;
BufferedWriter bw=null;
try {
fr=new FileReader(new File(from));
fw=new FileWriter(new File(to));
bw=new BufferedWriter(fw);
br=new BufferedReader(fr);
String info="";
String sum="";
while((info=br.readLine())!=null)
{
sum+=info+"\r\n";
    bw.write(new String(this.encrypt(info.getBytes(), key.getBytes())));
}
System.out.println(sum);
br.close();
fr.close();
} catch (Exception e) {
// TODO: handle exception
e.printStackTrace();
}finally{
try {
bw.close();
fw.close();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}

public void deFile(String from,String to,String key)
{
FileReader fr=null;
FileWriter fw=null;
BufferedReader br=null;
BufferedWriter bw=null;
try {
fr=new FileReader(new File(from));
fw=new FileWriter(new File(to));
bw=new BufferedWriter(fw);
br=new BufferedReader(fr);
String info="";
String sum="";
while((info=br.readLine())!=null)
{
sum+=info+"\r\n";
    bw.write(new String(this.decrypt(info.getBytes(), key.getBytes())));
}
System.out.println(sum);
br.close();
fr.close();
} catch (Exception e) {
// TODO: handle exception
System.err.println("解密失败");
e.printStackTrace();
}finally{
try {
bw.close();
fw.close();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
public byte[] encrypt(byte[] bytes,byte[] key)
{
try {
//des算法要求有一个可信任的随机数源
SecureRandom sr=new SecureRandom();
//从密钥中创建DesKeySpec对象
DESKeySpec dks=new DESKeySpec(key);
//创建一个密码要工厂 并生成密钥
SecretKeyFactory skf=SecretKeyFactory.getInstance("DES");
SecretKey sk=skf.generateSecret(dks);
//使用ECB模式 构造加密器
Cipher cipher=Cipher.getInstance("DES/ECB/PKCS5Padding");
//用密钥初始化cipher对象
cipher.init(Cipher.ENCRYPT_MODE, sk, sr);
//执行加密操作
byte encryptedDate[]=cipher.doFinal(bytes);
//返回加密数据
return encryptedDate;
} catch (Exception e) {
// TODO: handle exception
e.printStackTrace();
return null;
}
}

public byte[] decrypt(byte[] bytes,byte[] key)
{
try {
//des算法要求有一个可信任的随机数源
SecureRandom sr=new SecureRandom();
//从密钥中创建DesKeySpec对象
DESKeySpec dks=new DESKeySpec(key);
//创建一个密码要工厂 并生成密钥
SecretKeyFactory skf=SecretKeyFactory.getInstance("DES");
SecretKey sk=skf.generateSecret(dks);
//使用ECB模式 构造加密器
Cipher cipher=Cipher.getInstance("DES/ECB/PKCS5Padding");
//用密钥初始化cipher解密对象
cipher.init(Cipher.DECRYPT_MODE, sk, sr);
//执行解密操作
byte decryptedDate[]=cipher.doFinal(bytes);
//返回解密数据
return decryptedDate;
} catch (Exception e) {
// TODO: handle exception
e.printStackTrace();
return null;
}
}
}
这是我写的一个简单的des加密文件的代码  hongli.txt文件加密成功后生成lijuan.txt文件  但是 从lijuan.txt文件解密生成hongjing.txt文件时出错   控制台显示:javax.crypto.IllegalBlockSizeException: Input length must be multiple of 8 when decrypting with padded cipher
at com.sun.crypto.provider.SunJCE_f.b(DashoA13*..)
at com.sun.crypto.provider.SunJCE_f.b(DashoA13*..)
at com.sun.crypto.provider.DESCipher.engineDoFinal(DashoA13*..)
at javax.crypto.Cipher.doFinal(DashoA13*..)
at com.fileencrypt1.FileEncrypt.decrypt(FileEncrypt.java:142)
at com.fileencrypt1.FileEncrypt.deFile(FileEncrypt.java:83)
at com.fileencrypt1.FileEncrypt.<init>(FileEncrypt.java:28)
at com.fileencrypt1.FileEncrypt.main(FileEncrypt.java:23)
解密失败
java.lang.NullPointerException
at java.lang.String.<init>(Unknown Source)
at com.fileencrypt1.FileEncrypt.deFile(FileEncrypt.java:83)
at com.fileencrypt1.FileEncrypt.<init>(FileEncrypt.java:28)
at com.fileencrypt1.FileEncrypt.main(FileEncrypt.java:23)
哪位大虾知道的   可以告诉我下   急!!!!!!!啊!!!!!!!!!

解决方案 »

  1.   

    DES 的密钥长度必须是 8 个字节的,你看一下
      

  2.   

    private String key="12345678234 fdsajfljdsfajdflsajlfj";你这个不对哦,如果你想使用指定的密钥,可以使用 PBE(口令对称加密算法)。用 DES 的话密钥长度必须是 8 个字节,因为 DES 的密钥必须是 56 个 bit,再加上 1 个字节的校验,好正好是 8 个字节,若不是 8 个字节的话就会报错。