DES-CBC 加解密

import com.sun.org.apache.xerces.internal.impl.dv.util.Base64;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.stereotype.Component;
import sun.misc.BASE64Decoder;
import sun.misc.BASE64Encoder;
import javax.crypto.Cipher;
import javax.crypto.SecretKey;
import javax.crypto.SecretKeyFactory;
import javax.crypto.spec.DESKeySpec;
import javax.crypto.spec.IvParameterSpec;
import java.nio.charset.Charset;
import java.security.Key;
import java.security.SecureRandom;
import java.util.Arrays;/*** @title: MyDESUtil  DES加密工具类* @Author Tan* @Date: 2022/4/14 16:33* @Version 1.0 */
@Component
@Slf4j
public class MyDESUtil {@Value("${des-cbc.pwd}")private String password;@Value("${des-cbc.ivParam}")private String ivParam;/***  ECB加解密* @param encrypt true:加密;false:解密* @param desKey 密钥* @param data  待加/解密数据* @return  加/解密后结果*/private static byte[] encryptOrDecrypt(boolean encrypt, byte[] desKey,byte[] data) {if (data == null || data.length <= 0) {return null;}try {Cipher cipher;SecureRandom sr = new SecureRandom();DESKeySpec dks = new DESKeySpec(desKey);SecretKeyFactory keyFactory = SecretKeyFactory.getInstance("DES");SecretKey key = keyFactory.generateSecret(dks);if (encrypt) {cipher = Cipher.getInstance("DES");cipher.init(Cipher.ENCRYPT_MODE, key, sr);} else {//              cipher = Cipher.getInstance("DES/ECB/NoPadding");cipher = Cipher.getInstance("DES/ECB/PKCS5Padding");cipher.init(Cipher.DECRYPT_MODE, key, sr);}return cipher.doFinal(data);} catch (Exception e) {return null;}}/*** 生成KEY* @param password 密码* @return 生成的KEY* @throws Exception*/private static Key generateKey(String password) throws Exception {DESKeySpec dks = new DESKeySpec(password.getBytes("utf-8"));SecretKeyFactory keyFactory = SecretKeyFactory.getInstance("DES");return keyFactory.generateSecret(dks);}/*** Byte[]类型数据ECB加密* @param data 待加密的Byte类型数据* @param desKey 数据加密key* @return 加密后的数据* @throws Exception 数据加密异常*/public static char[] encrypt(byte[] data, byte[] desKey) throws Exception {// return Base64.encode(encryptOrDecrypt(true, desKey, data));return new char[0];}/*** Byte[]类型数据ECB解密* @param data 待解密Byte类型数据* @param desKey 数据解密key* @return 解密后的数据* @throws Exception 数据解密异常*/public static byte[] decrypt(char[] data, byte[] desKey) throws Exception {// TODO:luoshifei data.toStringreturn encryptOrDecrypt(false,desKey,Base64.decode(Arrays.toString(data)));}/*** DES ECB加密* @param data 待加密的数据* @param key 密钥* @return 加密后的数据* @throws Exception 数据加密异常*/public static String ecbEncrypt(String data, String key, String charset) throws Exception {byte[] bytes = encryptOrDecrypt(true,key.getBytes(Charset.forName(charset)),data.getBytes(Charset.forName(charset)));return new BASE64Encoder().encode(bytes);}/*** DES ECB解密* @param data 待加密数据* @param key 密钥* @return 解密后的数据* @throws Exception 数据解密异常*/public static String ecbDecrypt(String data, String key, String charset) throws Exception {byte[] bytes = encryptOrDecrypt(false,key.getBytes(Charset.forName(charset)),new BASE64Decoder().decodeBuffer(data));return ( new String(bytes,"utf-8") );}/*** DES CBC 加密* @param data 待加密字符串* @param --password 加密密码,长度不能小于8位* @param --ivParam 偏移量* @return 加密后内容*/public String cbcEncrypt(String data) {if (password== null || password.length() < 8) {throw new RuntimeException("加密失败,key不能小于8位");}if (data == null) {return null;}try {Key secretKey = generateKey(password);Cipher cipher = Cipher.getInstance("DES/CBC/PKCS5Padding");IvParameterSpec iv = new IvParameterSpec(ivParam.getBytes("utf-8"));cipher.init(Cipher.ENCRYPT_MODE, secretKey, iv);byte[] encrypted = cipher.doFinal(data.getBytes("utf-8"));return new BASE64Encoder().encode(encrypted); //此处使用BASE64做转码功能,同时能起到2次加密的作用。} catch (Exception e) {e.printStackTrace();return data;}}/*** DES CBC 解密* @param data 待解密字符串* @param --password 解密密码,长度不能小于8位* @param --ivParam 偏移量* @return 解密后内容*/public  String cbcDecrypt(String data) {if (password== null || password.length() < 8) {throw new RuntimeException("加密失败,key不能小于8位");}if (data == null) {return null;}try {Key secretKey = generateKey(password);Cipher cipher = Cipher.getInstance("DES/CBC/PKCS5Padding");IvParameterSpec iv = new IvParameterSpec(ivParam.getBytes("utf-8"));cipher.init(Cipher.DECRYPT_MODE, secretKey, iv);byte[] encrypted = new BASE64Decoder().decodeBuffer(data);//先用base64解密byte[] original = cipher.doFinal(encrypted);return  ( new String(original,"utf-8") );} catch (Exception e) {e.printStackTrace();return data;}}/*** DES CBC 加密* @param data 待加密字符串* @param --password 加密密码,长度不能小于8位* @param --ivParam 偏移量* @return 加密后内容*/public static String cbcStaticEncrypt(String data) {String pwd = "yj6kgf8h2jhda";String ivP = "bjkbkfss";if (pwd== null || pwd.length() < 8) {throw new RuntimeException("加密失败,key不能小于8位");}if (data == null) {return null;}try {Key secretKey = generateKey(pwd);Cipher cipher = Cipher.getInstance("DES/CBC/PKCS5Padding");IvParameterSpec iv = new IvParameterSpec(ivP.getBytes("utf-8"));cipher.init(Cipher.ENCRYPT_MODE, secretKey, iv);byte[] encrypted = cipher.doFinal(data.getBytes("utf-8"));return new BASE64Encoder().encode(encrypted); //此处使用BASE64做转码功能,同时能起到2次加密的作用。} catch (Exception e) {e.printStackTrace();return data;}}/*** DES CBC 解密* @param data 待解密字符串* @param --password 解密密码,长度不能小于8位* @param --ivParam 偏移量* @return 解密后内容*/public static String cbcStaticDecrypt(String data) {String pwd = "yj6klh4h2jhda";String ivP = "bjkbdffss";if (pwd== null || pwd.length() < 8) {throw new RuntimeException("加密失败,key不能小于8位");}if (data == null) {return null;}try {Key secretKey = generateKey(pwd);Cipher cipher = Cipher.getInstance("DES/CBC/PKCS5Padding");IvParameterSpec iv = new IvParameterSpec(ivP.getBytes("utf-8"));cipher.init(Cipher.DECRYPT_MODE, secretKey, iv);byte[] encrypted = new BASE64Decoder().decodeBuffer(data);//先用base64解密byte[] original = cipher.doFinal(encrypted);return  ( new String(original,"utf-8") );} catch (Exception e) {e.printStackTrace();return data;}}public static void main(String[] args){String test = "410223199105418975_周杰伦";
//        String key ="yj6klh4h2jhda";
//        String iv ="bjkbdffss";
//        String ecbEncrypt = null;
//        String ecbDecrypt = null;String cbcEncrypt = null;String cbcDecrypt = null;
//        try {//            ecbEncrypt = MyDESUtil.ecbEncrypt(test, key, "UTF-8");
//            ecbDecrypt = MyDESUtil.ecbDecrypt(ecbEncrypt, key, "UTF-8");
//            System.out.println("DES ECB加密结果: " + ecbEncrypt);
//            System.out.println("DES ECB解密结果: " + ecbDecrypt);
//        } catch (Exception e) {//            e.printStackTrace();
//        }cbcEncrypt = MyDESUtil.cbcStaticEncrypt(test);cbcDecrypt = MyDESUtil.cbcStaticDecrypt(cbcEncrypt);System.out.println("DES CBC加密结果: " + cbcEncrypt);System.out.println("DES CBC解密结果: " + cbcDecrypt);}}

java DES-CBC加解密相关推荐

  1. Linux下运行java DES AES加解密

    2019独角兽企业重金招聘Python工程师标准>>> DES java源代码如下: import java.security.InvalidKeyException; import ...

  2. DES方式加解密的简单介绍

    其实本来想好好研究下DES.AES.MD5等这些加解密方式的,于是就最先研究了比较早使用的DES,去看了相关文档后发现,我去这变换也太多了吧,这这这,真要细细研究下来,那不得花很长的时间,于是准备先放 ...

  3. Java使用AES加解密

    Java使用AES加解密 目录 1.1生成密钥 1.2密钥的存储 1.3获取存储的密钥 1.4加解密 1.5使用存储的密钥进行加解密示例 AES是一种对称的加密算法,可基于相同的密钥进行加密和解密.J ...

  4. JAVA:实现XXTea加解密算法(附完整源码)

    JAVA:实现XXTea加解密算法 public class XXTEAprivate XXTEA() {}public static byte[] encrypt(byte[] data, byte

  5. Java各种方式加解密工具类

    文章目录 前言 1.AES 2.DES 3.BCrypt 4.Http Basic 5.MD5 6.RSA 7.SHA256 8.SM3 9.SM4 前言 JAVA能够实现各种加解密方式,这里对各种加 ...

  6. 【AES256】Java实现AES256加解密

    AES256加解密比较常见,这里简单记录以供参考! 一.下载 官方JDK默认支持AES-128,在 1.8.0_151 和 1.8.0_152 版本之前,需要从Oracle官网下载安全JAR包方可支持 ...

  7. Java 进行 RSA 加解密时不得不考虑到的那些事儿

    1. 加密的系统不要具备解密的功能,否则 RSA 可能不太合适 公钥加密,私钥解密.加密的系统和解密的系统分开部署,加密的系统不应该同时具备解密的功能,这样即使黑客攻破了加密系统,他拿到的也只是一堆无 ...

  8. Java 实现 AES 加解密

    毕业课题中需要使用加解密算法,要求加解密前后的数据长度不会变化,查了一些资料,发现可以采用AES加密的CFB跟OFB模式是无填充的模式,可以保持加解密前后数据的长度相等.下面上代码: import j ...

  9. Java实现aes加解密

    pom文件的依赖 <!-- https://mvnrepository.com/artifact/org.apache.commons/commons-lang3 --> <depe ...

  10. rsa java代码_java加解密RSA使用方法代码示例

    最近为了分析一段请求流,不得不去研究一下RSA加密. 首先,强调一点:密钥的"钥"读"yue",不是"yao",额... 网上关于RSA的原 ...

最新文章

  1. 大龄屌丝自学笔记--Java零基础到菜鸟--028
  2. android工程中让人很不爽的“×××警告”
  3. Web版的Tabcontrol控件的制作过程
  4. 设置nginx 防止上传恶意脚本
  5. 计算机应用计算题(88)10,计算机应用考试习题(88页)-原创力文档
  6. 成为Apache顶级项目核心贡献者是一种什么样的体验?
  7. Windows Print Spooler服务最新漏洞CVE-2021-34527详细分析
  8. pytorch中数组维度的理解
  9. Flask初识,第五篇 ,做一个用户登录之后查看学员信息的小例子
  10. Linux Exploit系列之七 绕过 ASLR -- 第二部分
  11. r 语言 ggplot上添加平均值_技术贴 | R语言:ggplot堆叠图、冲积图、分组分面、面积图...
  12. 如何修改搜索框中的cancel button的颜色
  13. HIVE存储(四)ORCFile
  14. 创新者的窘境 Teh Innovator‘s Dilemma
  15. 浙江高职考计算机专业本科,浙江高职自主招生考什么科目
  16. unity显示no camera rendering
  17. 基于单幅图像的2D转3D算法研究
  18. 2023年证券、基金、银行从业资格证考试计划
  19. 分析oracle缓慢原因,Oracle SQL执行缓慢的原因分析
  20. 2w字Python列表,全了!

热门文章

  1. 华三华为交换机配置时间
  2. Day17(集合)学习记录(HashSet集合 HashMap集合)
  3. 文本修饰标签(text-decoration)
  4. 善的讯息可以产生美丽的水结晶
  5. BI分析工具软件有哪些
  6. 携程平台增长部总经理王绩强:原生互联网企业正在经历一场数字升级丨数据猿专访...
  7. powershell 使用_如何使用PowerShell生成随机名称和电话号码
  8. Linux与数据结构 2019-2-1
  9. 【AICG】动漫女主AI绘图的学习笔记
  10. 有关图像生成的函数 .