今天测试了四台机子。结果是这样的、、、
--------------------------------从这开始介绍的是通过字符串生成的key进行的加解密 start
首先是在自己电脑进行加密和解密操作,一切非常的正常很nice
然后到用来测试的windows电脑上生成加密文件,然后我的电脑也是windows进行解密也很OK
然后兴致勃勃上线,结果线上的linux系统加密的文件,我用我的windows电脑进行解密尽然解密乱码了,开始以为是编码的问题后台设置了文件输入的字符编码跟key生成的字符编码,结果还是不行
后面以为是系统环境问题然后我将线上linux系统加密好的文件放到我个人的linux服务器上进行解密。。。尽然也不行,然后我个人的linux服务器加密的文件,我的windows电脑进行解密也不行还是乱码
QAQ这个时候人已经崩溃一半了,还是冷静了下来 战术推眼镜
然后我就开始断点后面就发现通过字符串生成的key内部的encoded在以上几个不同环境中尽然也不一样,然后我就感觉是这个问题,后面就想着将key储存到文件中使用的时候再转换回key这样应该key就可以跨平台加解密了
------------------------------------通过字符串生成的key进行的加解密 end
------------------------------------下面讲的是通过文件的生成的key进行加解密 start
代码改完后,我就现在windows电脑上进行了加密解密操作,然后很OK
然后我就打包到linux进行加密,然后将加密文件下载到windows进行解密 这个过程中用到的都是同一个密钥文件,很完美兄弟们开森
然后我又将我windows加密的文件上传到linux进行解密,怎么说,尽然也很完美
------------------------------------通过文件的生成的key进行加解密 end
到此des进行文件加解密,完美谢幕
package org.example;
import javax.crypto.Cipher;
import javax.crypto.CipherInputStream;
import javax.crypto.CipherOutputStream;
import javax.crypto.KeyGenerator;
import java.io.*;
import java.security.Key;
import java.security.SecureRandom;
import java.util.Objects;
/**
* @Description: DES工具类
* @Author: wangchenyang
* @LastUpdater: wangchenyang
* @Date: 2021/10/27-22:18
*/
public class DESUtil {
//public static final String KEY_STR = "b9a5c7dbec11e7bece27e095ab81d49e";
//这个一大坨注释掉的是通过字符串生成所需要的key,我通过反复测试发现 不同电脑生成的key的encoded值是不一样的,
//所以这个方式生成的key不能用于跨平台操作。。。也不知道是不是我哪里代码写的有错
// Key key;
// public DESUtil(String str) {
// //通过字符串生成密匙
// //getKeyByStr(str);
// }
// /**
// * 根据参数生成KEY
// */
// public void getKeyByStr(String strKey) {
// try {
// KeyGenerator _generator = KeyGenerator.getInstance("DES");
// _generator.init(new SecureRandom(strKey.getBytes("GBK")));
// this.key = _generator.generateKey();
// _generator = null;
// } catch (Exception e) {
// throw new RuntimeException("Error initializing SqlMap class. Cause: " + e);
// }
// }
//生成所需的key文件,这个方法一般只需要线下执行一次获取到文件就行了
public static void saveDesKey() {
try {
SecureRandom sr = new SecureRandom();
// 为我们选择的DES算法生成一个KeyGenerator对象
KeyGenerator kg = KeyGenerator.getInstance("DES");
kg.init(sr);
// 相对路径 需要新建 config 文件夹
String fileName = "config/DesKey.xml";
FileOutputStream fos = new FileOutputStream(fileName);
ObjectOutputStream oos = new ObjectOutputStream(fos);
// 生成密钥
Key key = kg.generateKey();
oos.writeObject(key);
oos.close();
} catch (Exception e) {
e.printStackTrace();
}
}
//通过key文件,活动到加解密所用到的key对象
public static Key getKey() {
Key kp = null;
ObjectInputStream oos = null;
try {
// 相对路径 需要新建 config 文件夹
String fileName = "config/DesKey.xml";
FileInputStream is = new FileInputStream(fileName);
oos = new ObjectInputStream(is);
kp = (Key) oos.readObject();
} catch (Exception e) {
e.printStackTrace();
} finally {
if (Objects.nonNull(oos)) {
oos.close();
}
}
return kp;
}
//加密file文件,解密路径destFile
public void encrypt(String file, String destFile) throws Exception {
InputStream is = null;
OutputStream out = null;
CipherInputStream cis = null;
try {
Cipher cipher = Cipher.getInstance("DES");
// cipher.init(Cipher.ENCRYPT_MODE, this.key); //这个是使用通过字符串生成的key
cipher.init(Cipher.ENCRYPT_MODE, getKey()); //这个是使用通过文件生成的key
is = new FileInputStream(file);
out = new FileOutputStream(destFile);
cis = new CipherInputStream(is, cipher);
byte[] buffer = new byte[1024];
int r;
while ((r = cis.read(buffer)) > 0) {
out.write(buffer, 0, r);
}
} finally {
if (Objects.nonNull(cis)) {
cis.close();
}
if (Objects.nonNull(is)) {
is.close();
}
if (Objects.nonNull(out)) {
out.close();
}
}
}
//解密路径file, 解密后文件路径dest
public void decrypt(String file, String dest) throws Exception {
InputStream is = null;
OutputStream out = null;
CipherOutputStream cos = null;
try {
Cipher cipher = Cipher.getInstance("DES");
//cipher.init(Cipher.DECRYPT_MODE, this.key); //这个是使用通过字符串生成的key
cipher.init(Cipher.DECRYPT_MODE, getKey()); //这个是使用通过文件生成的key
is = new FileInputStream(file);
out = new FileOutputStream(dest);
cos = new CipherOutputStream(out, cipher);
byte[] buffer = new byte[1024];
int r;
while ((r = is.read(buffer)) >= 0) {
System.out.println();
cos.write(buffer, 0, r);
}
} finally {
if (Objects.nonNull(cos)) {
cos.close();
}
if (Objects.nonNull(is)) {
is.close();
}
if (Objects.nonNull(out)) {
out.close();
}
}
}
public static void main(String[] args) throws Exception {
// DESUtil td = new DESUtil(KEY_STR);
// td.encrypt("a.txt", "b.txt"); //加密
// td.decrypt("b.txt", "c.txt"); //解密
DESUtil td = new DESUtil();
td.encrypt("a.txt", "b.txt"); //加密
td.decrypt("b.txt", "c.txt"); //解密
}
}