记录一次java DES加解密文件的坑,不同电脑字符串所生成的Key不通过,MD破口大骂,emm也可能是我太嫩

 今天测试了四台机子。结果是这样的、、、

--------------------------------从这开始介绍的是通过字符串生成的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"); //解密
    }
}

  • 2
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值