Java实现DES+BASE64加解密

0 篇文章 0 订阅

一、以前在程序中用到过DES+BASE64加解密,通过安全监测出来的问题:

Abstract:
程序使用了弱加密算法,无法保证敏感数据的保密性。
Explanation:
陈旧的加密算法(如 DES)再也不能为敏感数据提供足够的保护了。 加密算法依赖于密钥大小,这是确保加密强度的
主要方法之一。 加密强度通常通过生成有效密钥所需的时间和计算能力来衡量。 计算能力的提高使得能够在合理的时
间内获得较小的加密密钥。 例如,在二十世纪七十年代首次开发出该算法时,在 DES 中使用的 56 位密钥造成了巨大的
计算障碍,但今天,使用常用设备能在不到一天的时间内破解 DES。
Recommendations:
使用密钥较大的强加密算法来保护敏感数据。 作为 DES 的备选强加密算法的示例包括 Rijndael(高级加密标准,简称
AES)和 Triple DES (3DES)。 在选择一种算法之前,应首先确定您的组织是否对某个特定算法和实施实现了标准化。
Tips:
使用 RC4 或 DES 算法时,Fortify SCA 会报告较高严重性的警告。
使用 RC2 算法时,Fortify SCA 会报告较低严重性的警告。

 注:

     虽然安全监测出来有问题,但是使用的人还是很多,因为简单便捷啊,能够高效的处理大批量数据,得到广泛的运用

二、Java代码分析

1.DES+BASE64加解密工具类:

package com.yinxin.tools;

import java.io.UnsupportedEncodingException;
import java.security.InvalidKeyException;
import java.security.SecureRandom;
import java.text.SimpleDateFormat;
import java.util.Date;

import javax.crypto.Cipher;
import javax.crypto.KeyGenerator;
import javax.crypto.SecretKey;
import javax.crypto.SecretKeyFactory;
import javax.crypto.spec.DESKeySpec;
import javax.crypto.spec.IvParameterSpec;
import javax.crypto.spec.SecretKeySpec;

import org.apache.commons.net.util.Base64;

import sun.misc.BASE64Decoder;

public class Decrypt
{
	 private static SimpleDateFormat dateFormat;
	 
	public synchronized static String formatAll(Date date,String timeType) {
		dateFormat=new SimpleDateFormat(timeType);
		return dateFormat.format(date);
	}
		
	public synchronized static Date formatDate(String date,String timeType)throws Exception {
	dateFormat=new SimpleDateFormat(timeType);
	return dateFormat.parse(date);
	}
	//static SimpleDateFormat df = new SimpleDateFormat("yyyyMMdd");
	final static byte[] IV = new byte[] { 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01 };
	/**
	 * 解密方法
	 * 
	 * @param data
	 *            解密前字符串
	 * @return 解密后字符串
	 * 
	 */
	public static String decryptKey(String data) throws Exception
	{
		// DES 解密阶段
		Date date = new Date();
		String dateTime = formatAll(date,"yyyyMMdd");
		// 秘钥暂定当前日期
		String key = ReadConfig.SECRET_KEY;//这个秘钥在这我用的是从配置文件中读取的,你们可以直接用字符串代替,如:20190809
		// BASE64解码
				byte[] datasource = new BASE64Decoder().decodeBuffer(data);
				//秘钥暂定当前日期
				DESKeySpec desKey = new DESKeySpec(key.getBytes());
				SecretKeyFactory keyFactory = SecretKeyFactory.getInstance("DES");
				SecretKey securekey = keyFactory.generateSecret(desKey);
				IvParameterSpec iv = new IvParameterSpec(key.getBytes("UTF-8"));
				Cipher cipher = Cipher.getInstance("DES/CBC/PKCS5Padding");
				cipher.init(Cipher.DECRYPT_MODE, securekey, iv);
				byte[] str = cipher.doFinal(datasource);
				return new String(str, "UTF-8");
	}
	/**
	 * 加密方法
	 * 
	 * @param data
	 *            加密前字符串
	 * @return 加密后字符串
	 * 
	 */
	public static String encryptKey(String data) throws Exception
	{
		// DES 解密阶段
		Date date = new Date();
		String dateTime = formatAll(date,"yyyyMMdd");
		// 秘钥暂定为当前日期
		String key = ReadConfig.SECRET_KEY;//这个秘钥在这我用的是从配置文件中读取的,你们可以直接用字符串代替,如:20190809
		DESKeySpec desKey = new DESKeySpec(key.getBytes());
		SecretKeyFactory keyFactory = SecretKeyFactory.getInstance("DES");
		SecretKey securekey = keyFactory.generateSecret(desKey);
		IvParameterSpec iv = new IvParameterSpec(key.getBytes("UTF-8"));
		Cipher cipher = Cipher.getInstance("DES/CBC/PKCS5Padding");
		cipher.init(Cipher.ENCRYPT_MODE, securekey, iv);
		byte[] desBytes = cipher.doFinal(data.getBytes("UTF-8"));
        //BASE64编码阶段
		return Base64.encodeBase64String (desBytes);
	}

	public static String encrypt(String encryptString, String encryptKey) throws Exception
	{
		// DES 解密阶段
		Date date = new Date();
		String dateTime =formatAll(date,"yyyyMMdd");
		SecretKeySpec key = new SecretKeySpec(dateTime.getBytes(), "DES");
		Cipher cipher = Cipher.getInstance("DES/CBC/noPadding");
		cipher.init(Cipher.ENCRYPT_MODE, key);
		byte[] encryptedData = cipher.doFinal(encryptString.getBytes("UTF-8"));

		System.out.println("base64byte:[" + new String(Base64.encodeBase64(encryptedData), "UTF-8") + "]");
		System.out.println("base64byte:[" + Base64.encodeBase64String(encryptedData) + "]");
		return Base64.encodeBase64String(encryptedData);
	}

/*	public static String encrypt(String data) throws Exception
	{
		// 秘钥暂定为当前日期
		// DES 解密阶段
		Date date = new Date();
		String dateTime =formatAll(date,"yyyyMMdd");
		// DES 解密阶段
		dateTime = df.format(date).toString();
		String key = "abc123";
		KeyGenerator k = KeyGenerator.getInstance("DES");
		k.init(56);
		SecretKey sk = k.generateKey();
		byte[] bytes = sk.getEncoded();
		SecretKey cs = new SecretKeySpec(bytes, "DES");
		Cipher ci = Cipher.getInstance("DES/ECB/PKCS5Padding");
		ci.init(Cipher.ENCRYPT_MODE, cs);
		byte[] desBytes = ci.doFinal(data.getBytes("UTF-8"));

		return Base64.encodeBase64String(desBytes);
	}*/
}

2.测试类:

注:虽然这个测试类中我把DES+BASE64加解密的代码又重复了一遍,实际是可以引用上面工具类中的

package com.yinxin.control;

import java.io.BufferedReader;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.InputStreamReader;
import java.text.SimpleDateFormat;
import java.util.Date;

import javax.crypto.Cipher;
import javax.crypto.SecretKey;
import javax.crypto.SecretKeyFactory;
import javax.crypto.spec.DESKeySpec;
import javax.crypto.spec.IvParameterSpec;

import sun.misc.BASE64Decoder;

import org.apache.commons.net.util.Base64;

import com.yinxin.tools.Log4jBean;

public class Test {
	 private static SimpleDateFormat dateFormat;
	 
	public synchronized static String formatAll(Date date,String timeType) {
		dateFormat=new SimpleDateFormat(timeType);
		return dateFormat.format(date);
	}
		
	public synchronized static Date formatDate(String date,String timeType)throws Exception {
	dateFormat=new SimpleDateFormat(timeType);
	return dateFormat.parse(date);
	}
	static SimpleDateFormat df = new SimpleDateFormat("yyyyMMdd");
	final static byte[] IV = new byte[] { 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01 };
	
	/**
	 * 加密方法
	 * 
	 * @param data
	 *            加密前字符串
	 * @return 加密后字符串
	 * 
	 */
	public static String encryptKey(String data) throws Exception
	{
		// DES 解密阶段
		Date date = new Date();
		String dateTime = formatAll(date,"yyyyMMdd");
		// 秘钥暂定为当前日期
		String key = "20190809";//20190809
		DESKeySpec desKey = new DESKeySpec(key.getBytes());
		SecretKeyFactory keyFactory = SecretKeyFactory.getInstance("DES");
		SecretKey securekey = keyFactory.generateSecret(desKey);
		IvParameterSpec iv = new IvParameterSpec(key.getBytes("UTF-8"));
		Cipher cipher = Cipher.getInstance("DES/CBC/PKCS5Padding");
		cipher.init(Cipher.ENCRYPT_MODE, securekey, iv);
		byte[] desBytes = cipher.doFinal(data.getBytes("UTF-8"));
        //BASE64编码阶段
		return Base64.encodeBase64String (desBytes);
	}
	/**
	 * 解密方法
	 * 
	 * @param data
	 *            解密前字符串
	 * @return 解密后字符串
	 * 
	 */
	public static String decryptKey(String data) throws Exception
	{
		// DES 解密阶段
		Date date = new Date();
		String dateTime = formatAll(date,"yyyyMMdd");
		// 秘钥暂定当前日期
		String key = "20190809";
		// BASE64解码
				byte[] datasource = new BASE64Decoder().decodeBuffer(data);
				//秘钥暂定当前日期
				DESKeySpec desKey = new DESKeySpec(key.getBytes());
				SecretKeyFactory keyFactory = SecretKeyFactory.getInstance("DES");
				SecretKey securekey = keyFactory.generateSecret(desKey);
				IvParameterSpec iv = new IvParameterSpec(key.getBytes("UTF-8"));
				Cipher cipher = Cipher.getInstance("DES/CBC/PKCS5Padding");
				cipher.init(Cipher.DECRYPT_MODE, securekey, iv);
				byte[] str = cipher.doFinal(datasource);
				return new String(str, "UTF-8");
	}
	public static void main(String[] args) {
		StringBuffer sbuffer = new StringBuffer();
		BufferedReader br = null;
		try {
			// read file content from file
			File file = new File("E:\\Gzdkls010520190601P201905311128201905078.txt");
			br = new BufferedReader(new InputStreamReader(new FileInputStream(
					file), "gbk"));
			String str = "";
			while ((str = br.readLine()) != null) {
				sbuffer.append(str + "\n");
			}
		} catch (FileNotFoundException e) {
			Log4jBean.logger.error("读取文件异常,异常信息为[" + e.getMessage() + "]");
		} catch (Exception e) {
			Log4jBean.logger.error("读取文件异常,异常信息为[" + e.getMessage() + "]");
		} finally {
			try {
				br.close(); // 关闭字符流
				br = null;
			} catch (Exception e) {
				Log4jBean.logger.error("关闭流出现异常,异常信息为[" + e.getMessage() + "]");
			}
		}
		Log4jBean.logger.info("明文文件内容为:\n" + sbuffer);
		Log4jBean.logger.info("开始对文件进行加密");
		String str="";
		try {
			str=Test.encryptKey(sbuffer.toString());
			Log4jBean.logger.info("用密钥[20190809]进行加密后的密文为\n["+str+"]");
		} catch (Exception e1) {
			// TODO Auto-generated catch block
			e1.printStackTrace();
		}
			// 需解密
			String data = null;
			// 开始解密文件
			try {
				data =decryptKey(str);
				Log4jBean.logger.info("解密后的文件内容:\n[" + data + "]");
			} catch (Exception e) {
				// TODO Auto-generated catch block
				Log4jBean.logger.error("解密文件时出现异常,异常信息为[" + e.getMessage()
						+ "]");
			
			}

	}

}

测试效果图:

控制台打印的测试数据:

2019-08-09 11:58:34,385 [Test.java]-[INFO]-117 明文文件内容为:
后来

我总算学会了如何去爱

可惜你早已远去

消失在人海

后来

终于在眼泪中明白

有些人一旦错过就不在

栀子花 白花瓣

落在我蓝色百褶裙上

爱你 你轻声说

我低下头闻见一阵芬芳

那个永恒的夜晚

十七岁仲夏

你吻我的那个夜晚

让我往后的时光

每当有感叹

总想起当天的星光

那时候的爱情

为什么就能那样简单

而又是为什么人年少时

一定要让深爱的人受伤

在这相似的深夜里

你是否一样

也在静静追悔感伤

如果当时我们能不那么倔强

现在也不那么遗憾

你都如何回忆我

带著笑或是很沉默

这些年来有没有人能让你不寂寞

后来

我总算学会了如何去爱

可惜你早已远去

消失在人海

后来

终于在眼泪中明白

有些人一旦错过就不再

你都如何回忆我

带著笑或是很沉默

这些年来有没有人能让你不寂寞

后来

我总算学会了如何去爱

可惜你早已远去

消失在人海

后来

终于在眼泪中明白

有些人一旦错过就不再

后来

我总算学会了如何去爱

可惜你早已远去

消失在人海

后来

终于在眼泪中明白

有些人一旦错过就不再

永远不会再重来

有一个男孩爱著那个女孩

log4j:ERROR Failed to rename [C:\Users\syp/dfgz/logs/SftpUploadFile.log] to [C:\Users\syp/dfgz/logs/SftpUploadFile.log.20190720].
2019-08-09 11:58:34,388 [Test.java]-[INFO]-118 开始对文件进行加密
2019-08-09 11:58:34,772 [Test.java]-[INFO]-122 用密钥[20190809]进行加密后的密文为
[J0SgEPksloRkOhRN72LgubnKerf0L9oxBtvmMgujscbhTTGJH6US8cjySlxvgwFOsWBRlzzp5ODl
rSCnDLzd1FjMSUNs3ck20lZ1tg2oqtYlpo3s+L6rmsm9qZB3Ie3fvjszDzudH+VT1yrud2hL6XLr
Jf5Hmzs9IG2DBM1HKwtCQ32TzQYDs6Xy4UQoO55HirRLeKPqyTcv2v9NtG7zoBXgJGxQH3UhlJAv
T+jZYB2mTYHrLWuE6b9aT9SuZbD8WXaeX1a0ch86zmwaOR5TidhjR8xmSjXI7gsdo8zlNlTWHOVo
x5V36Xb84UZl2Mk/lrypAuQtsqKT/PSRj+mPkdfAXkHcRx9WA+Q9PzthivfvONwRQ1NFkEXfRspR
ikJst/ICwSsQG1HBy5abHYe1Vh0dHZYOkin8p6laxwdeDZTgrAylEo+880jme7BklEqXA/KnRclt
qUfCdW5e+SD1FBzBMJsek1mcmbi+ApWayoEW1Ty3+QSkkJIAqAoduGpV9TWvh0mjyMU/OLv8aUOk
3XkdExr/CPi/JGiMbivb0chrrmvlmJPyT/DWUG9SZN1Iox8bDV9trWFVjsn20XaRVwknlbucyz64
RsDFyb1QNprUroOHL0ds83SHXhNE1dbu85n9GA0G/fJdglE/AyY01RjIStz8MrTr/oL57xQeJ9uB
X5ccuddjBVhBmB0fYuTqpbR8+XsKunpMLpLfb1flWJ0tQtlVVlRDx4YZHHhqORL4yyDQZOWWlZPq
Pb4maYwhunPryb/aAQURT9mWpvDGc6MYCtm+R/Lkt+PN9oP5WPzwrtpyVZVhf/HGkefR58syyGaj
s5mOUE/4goSFUlOWeX1npsGbS5UDitDdwtrdGffociMN02Ezo19wFRvho4ifndtHfIw4k1HBlySr
24dwgts5DHUUjLBIFXsFg0V1qBx4ICC+6nV9uw0iZmwHLoqC3TtkBlk2ojI34ZzbiQ50w63VyFDv
jdPk/ChXrx0UlovbAXYFcWXtXpyN3HKEpfEMUBJmDR4LfgJ0ECqSU3o11QiyZO/YVNz7rBTP17dG
sTJdgFCNBISeQ9wAJ5y2eojb1aZU5FCKffJDiIyNM0z4BwvKtpNZAtBIyGVwaiZa+T3DafKiCP4D
egvYiMyt7JP4g1C4p72BoKAhGCbvoLGVCE3DgvMhJ9MsfG39cDmfxYDQBBIQyyeKysdQl3LbMJ4a
tUWxNXx1leroyZXqNTnBd2xWBZQb0dAk7apKs5BGTyT2JVK+shnyzoOJ019k8pnceACD2Hg7bMBh
36IHDtUm2VOuryJjEDOZN6QZRU2qD6ynvca3rDonYb2Ev8zZfUaXVHQOxMeUa3FqIf/qB+gcQxKG
rEDcTrn3MY7cpIgJSLm6qoLI13LiqwVN5iIb3GWfHXy/8ED6bPcTLi6J7SYpihp7lat0BpMHJM2r
gvELj4voUVukLsIplZUyDcE9uaCkkYbmyhM5sniGOZF9WU6JinlDEOzCl1fPm/WYkMAwuwZvMsyG
2xMN56irDbixvX1cCwxq+/fNBUlwKrrh+WmMXR/GmGViHIMk49Atja0IukhDdwUlSh0H+0QU66O4
csA6u6q9yyi9yfUFWjHEZh6MBT7NZaNeAIb1tCRgQ+tmyT9inSKuIkl6QyzCFo/AoVopGrKbgJ10
XSCcv0vf8zYNqP3aehE2TJi1xTdJ6+PGo8tSu4q78v6NQhNitPxzgUYj5dLDla/jVu/78SVgd7TN
Og==
]
2019-08-09 11:58:34,774 [Test.java]-[INFO]-132 解密后的文件内容:
[后来

我总算学会了如何去爱

可惜你早已远去

消失在人海

后来

终于在眼泪中明白

有些人一旦错过就不在

栀子花 白花瓣

落在我蓝色百褶裙上

爱你 你轻声说

我低下头闻见一阵芬芳

那个永恒的夜晚

十七岁仲夏

你吻我的那个夜晚

让我往后的时光

每当有感叹

总想起当天的星光

那时候的爱情

为什么就能那样简单

而又是为什么人年少时

一定要让深爱的人受伤

在这相似的深夜里

你是否一样

也在静静追悔感伤

如果当时我们能不那么倔强

现在也不那么遗憾

你都如何回忆我

带著笑或是很沉默

这些年来有没有人能让你不寂寞

后来

我总算学会了如何去爱

可惜你早已远去

消失在人海

后来

终于在眼泪中明白

有些人一旦错过就不再

你都如何回忆我

带著笑或是很沉默

这些年来有没有人能让你不寂寞

后来

我总算学会了如何去爱

可惜你早已远去

消失在人海

后来

终于在眼泪中明白

有些人一旦错过就不再

后来

我总算学会了如何去爱

可惜你早已远去

消失在人海

后来

终于在眼泪中明白

有些人一旦错过就不再

永远不会再重来

有一个男孩爱著那个女孩
]

 源文件:

注:最后那个秘钥问题,可以是数字+字母+特殊符号。但是必须是8位。 

  • 0
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
以下是Java实现DES加解密算法的示例代码: ```java import javax.crypto.Cipher; import javax.crypto.SecretKey; import javax.crypto.SecretKeyFactory; import javax.crypto.spec.DESKeySpec; import java.nio.charset.StandardCharsets; import java.util.Base64; public class DesDemo { private static final String KEY = "12345678"; // 密钥 public static void main(String[] args) throws Exception { String plainText = "Hello, world!"; // 明文 String encryptedText = encrypt(plainText); // 加密 System.out.println("加密后的密文:" + encryptedText); String decryptedText = decrypt(encryptedText); // 解密 System.out.println("解密后的明文:" + decryptedText); } // DES加密 private static String encrypt(String plainText) throws Exception { // 创建DESKeySpec对象 DESKeySpec desKeySpec = new DESKeySpec(KEY.getBytes(StandardCharsets.UTF_8)); // 创建SecretKeyFactory对象 SecretKeyFactory keyFactory = SecretKeyFactory.getInstance("DES"); // 生成SecretKey对象 SecretKey secretKey = keyFactory.generateSecret(desKeySpec); // 创建Cipher对象 Cipher cipher = Cipher.getInstance("DES"); cipher.init(Cipher.ENCRYPT_MODE, secretKey); // 加密 byte[] encryptedBytes = cipher.doFinal(plainText.getBytes(StandardCharsets.UTF_8)); // Base64编码 return Base64.getEncoder().encodeToString(encryptedBytes); } // DES解密 private static String decrypt(String encryptedText) throws Exception { // 创建DESKeySpec对象 DESKeySpec desKeySpec = new DESKeySpec(KEY.getBytes(StandardCharsets.UTF_8)); // 创建SecretKeyFactory对象 SecretKeyFactory keyFactory = SecretKeyFactory.getInstance("DES"); // 生成SecretKey对象 SecretKey secretKey = keyFactory.generateSecret(desKeySpec); // 创建Cipher对象 Cipher cipher = Cipher.getInstance("DES"); cipher.init(Cipher.DECRYPT_MODE, secretKey); // Base64解码 byte[] encryptedBytes = Base64.getDecoder().decode(encryptedText); // 解密 byte[] decryptedBytes = cipher.doFinal(encryptedBytes); return new String(decryptedBytes, StandardCharsets.UTF_8); } } ```

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

醉梦洛

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值