使用DES 加密方式对文件进行加密!!!

DES加密由于在java中非常方便使用,而且性能不错,所以非常流行!!!
使用DES 首先需要密钥。。2种方法:第一自己设置


//自己设置
private final static String encodeKey ="moomaia";


private Key getKey() throws Exception {
// 创建一个空的8位字节数组(默认值为0)
byte[] arrBTmp = encodeKey.getBytes();
System.out.println(arrBTmp.length);
byte[] arrB = new byte[8];
// 将原始字节数组转换为8位
for (int i = 0; i < arrBTmp.length && i < arrB.length; i++) {
arrB[i] = arrBTmp[i];
}
// 生成密钥

System.out.println(arrB.length);
Key key = new javax.crypto.spec.SecretKeySpec(arrB, "DES");
return key;
}





第二种:系统生成:

private void createKey() {
try {
// 得到密钥的实例 以什么方式加密。加密的方式比较多。
KeyGenerator kg = KeyGenerator.getInstance("DES");
kg.init(56);

SecretKey key = kg.generateKey();
// 将生成的密钥对象写入文件。
ObjectOutputStream objectOutputStream = new ObjectOutputStream(
new FileOutputStream(new File("e:\\key.obj")));
objectOutputStream.writeObject(key);
} catch (NoSuchAlgorithmException e) {
e.printStackTrace();
} catch (FileNotFoundException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}
}

/**
* @param KeyFilePath
* 密钥Key对象的路径。注意使用该方法的时候,确保你已经生成了密钥。
* @return
* @Description 从文件中读出Key,用于加密使用。
*/
private static Key getKey(String KeyFilePath) {
Key key = null;
try {
// 将生成的密钥对象从文件中读取出来,然后再强制转换成一个密钥对象。
ObjectInputStream objectInputStream = new ObjectInputStream(
new FileInputStream(new File(KeyFilePath)));
key = (Key) objectInputStream.readObject();
} catch (FileNotFoundException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
} catch (ClassNotFoundException e) {
e.printStackTrace();
}
return key;
}



有了密钥之后开始对文件加密:详情见代码:【酷毙程序员,一切都在代码中】



/**
*
* 字符串加密 ---byte[]
* @param source
* @return 放回一个byte数组,为什么不放回字符串,是因为解密的时候要传入这个byte数组才能进行解密,如果解密的时候传入的是字符串
* 那么就会出错,愿意是编码的问题。
* @throws Exception
* @Description 将传入的字符串进行加密 下面写了将这种byte数组转换成字符串的方法。直接在调用就行了。
*/
public String encrypt(String source) throws Exception {
byte[] target =null;
File srcFile = new File(source);
System.out.println(srcFile.getCanonicalPath());
if(!srcFile.exists()){
System.out.println("文件不存在");
}
String newName = srcFile.getAbsolutePath()+".m";
FileInputStream fis = new FileInputStream(srcFile);
int fileSize = fis.available();
FileOutputStream fos = new FileOutputStream(new File(newName));

Key key = getKey();
try {
Cipher cipher = Cipher.getInstance("DES");
cipher.init(Cipher.ENCRYPT_MODE, key);
byte[] buf = new byte[fileSize];
System.out.println(fileSize);
int c = 0;
while((c=fis.read(buf))!=-1){
target = cipher.doFinal(buf);
//base64encoder.encode(target,fos);
fos.write(target);
}
} catch (NoSuchAlgorithmException e) {
e.printStackTrace();
} catch (NoSuchPaddingException e) {
e.printStackTrace();
} catch (UnsupportedEncodingException e) {
e.printStackTrace();
} catch (InvalidKeyException e) {
e.printStackTrace();
} catch (IllegalBlockSizeException e) {
e.printStackTrace();
} catch (BadPaddingException e) {
e.printStackTrace();
}
return newName;
}


当然也可分成小点方法:代码就好的看点

把解密分开写:



/**
* 解密----byte[]
* @param source
* 加密后的byte数组。可用加密方法encrypt(“String”)生成即可
* @return 解密后的字符串。
* @throws Exception
* @Description 解密算法。
*/
public byte[] decrypt(byte[] source) {
byte[] dissect = null;
try {
Key key = getKey();
Cipher cipher = Cipher.getInstance("DES");
cipher.init(Cipher.DECRYPT_MODE, key);// 使用私钥解密
dissect = cipher.doFinal(source);
} catch (NoSuchAlgorithmException e) {
e.printStackTrace();
} catch (NoSuchPaddingException e) {
e.printStackTrace();
} catch (InvalidKeyException e) {
e.printStackTrace();
} catch (IllegalBlockSizeException e) {
e.printStackTrace();
} catch (BadPaddingException e) {
e.printStackTrace();
} catch (Exception e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
return dissect;
}


/**从File ---->byte[]
* @return
* @Description 由于加密之前采用了编码的格式 所以现在采用特点的方式读出来 ,然后得到用一个byte[]用于解码。
*/
public byte[] getByteFromFile(){
//BASE64Decoder base64decoder = new BASE64Decoder();
byte[] encodeByte =null;
try {
// encodeByte = base64decoder.decodeBuffer(new FileInputStream(new File("D:\\t.txt")));
FileInputStream fis =new FileInputStream(new File("D:\\ch03.pdf.m"));
int fileSize = fis.available();
encodeByte = new byte[fileSize];
fis.read(encodeByte);
} catch (FileNotFoundException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}
return encodeByte;
}

/**
* 写入文件
* @param b
* @param filePath
* @Description 将指定的字节写入到文件中。
*/
public void writeByteToFile(byte[] b, String filePath) {
File file = new File(filePath);
if (!file.exists()) {
try {
file.createNewFile();
} catch (IOException e) {
e.printStackTrace();
}
}
FileOutputStream fileOutputStream;
try {
fileOutputStream = new FileOutputStream(file);

fileOutputStream.write(b);
fileOutputStream.close();
} catch (IOException e) {
e.printStackTrace();
}
}


测试代码:速度相当之快,DES>>base64encode.估计也是流行原因之一


public static void main(String[] args) throws Exception {

DESofFile desf= new DESofFile();
//desf.createKey();
Date times = new Date();
long start = times.getTime();
desf.encrypt("d:\\ch03.pdf");
desf.writeByteToFile(desf.decrypt(desf.getByteFromFile()), "d:\\ch03-9.pdf");
Date times2 = new Date();
long end =times2.getTime();

System.out.println(end - start);
}



[quote]
本人菜鸟。错误的地方虚心请教!!谢谢
[/quote]
  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: DES加密是一种对文件进行加密的方法。DES(Data Encryption Standard)是一种对称加密算法使用相同的密钥进行加密和解密。 首先,需要选择一个合适的密钥。DES算法使用56位的密钥,但由于安全性问题,通常使用64位的密钥,并使用第8位作为奇偶校验位。 其次,将文件按照固定的块大小(通常为64位)进行分块。如果文件大小不是块大小的倍数,则需要进行补零或者使用其他填充方式。 然后,对每个块使用DES算法进行加密加密过程包括初始置换、16轮的Feistel轮函数以及最终变换。在每一轮中,使用子密钥进行轮函数和数据的异或操作。 最后,将加密后的块组合在一起,形成加密后的文件。如果需要,可以将加密后的文件进行进一步的压缩或者保存到其他文件格式中。 需要注意的是,为了保证安全性,密钥的管理非常重要。密钥应该被妥善保存,并且在每次使用之后要及时销毁或者更新。 总之,DES加密是一种对文件进行保密的方法,它可以通过选择合适的密钥,对文件进行分块和加密,最终生成加密后的文件。 ### 回答2: DES(Data Encryption Standard)是一种对文件进行加密的常见算法。它是一种对称加密算法使用相同的密钥进行加密和解密。下面是使用DES算法文件进行加密的一般步骤: 1. 生成密钥:DES算法使用56位的密钥。首先需要生成这个密钥。可以通过随机数生成器或者密钥生成算法来生成一个合适的密钥。 2. 分割文件:将要加密文件按照固定大小(例如64位或128位)进行分割。每个分割部分被称为一个“数据块”。 3. 加密每个数据块:对于分割后的每个数据块,使用生成的密钥进行加密。采用DES算法对单个数据块进行加密,得到加密后的数据块。 4. 合并加密后的数据块:将加密后的每个数据块按照一定的顺序合并起来,形成一个大小与原文件相同的加密后的文件。 5. 保存密钥和加密后的文件:将生成的密钥保存在安全的地方,以便解密时使用。同时保存加密后的文件,即加密后的数据块组成的文件。 通过上述步骤,我们可以使用DES算法文件进行加密。需要注意的是,DES算法是一种比较老旧的加密算法,在现代加密领域已经被更安全的算法所取代,因此在实际应用中可能需要考虑使用更加安全的加密算法以保护文件的安全性。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值