java DES-CBC加解密
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加解密相关推荐
- Linux下运行java DES AES加解密
2019独角兽企业重金招聘Python工程师标准>>> DES java源代码如下: import java.security.InvalidKeyException; import ...
- DES方式加解密的简单介绍
其实本来想好好研究下DES.AES.MD5等这些加解密方式的,于是就最先研究了比较早使用的DES,去看了相关文档后发现,我去这变换也太多了吧,这这这,真要细细研究下来,那不得花很长的时间,于是准备先放 ...
- Java使用AES加解密
Java使用AES加解密 目录 1.1生成密钥 1.2密钥的存储 1.3获取存储的密钥 1.4加解密 1.5使用存储的密钥进行加解密示例 AES是一种对称的加密算法,可基于相同的密钥进行加密和解密.J ...
- JAVA:实现XXTea加解密算法(附完整源码)
JAVA:实现XXTea加解密算法 public class XXTEAprivate XXTEA() {}public static byte[] encrypt(byte[] data, byte
- Java各种方式加解密工具类
文章目录 前言 1.AES 2.DES 3.BCrypt 4.Http Basic 5.MD5 6.RSA 7.SHA256 8.SM3 9.SM4 前言 JAVA能够实现各种加解密方式,这里对各种加 ...
- 【AES256】Java实现AES256加解密
AES256加解密比较常见,这里简单记录以供参考! 一.下载 官方JDK默认支持AES-128,在 1.8.0_151 和 1.8.0_152 版本之前,需要从Oracle官网下载安全JAR包方可支持 ...
- Java 进行 RSA 加解密时不得不考虑到的那些事儿
1. 加密的系统不要具备解密的功能,否则 RSA 可能不太合适 公钥加密,私钥解密.加密的系统和解密的系统分开部署,加密的系统不应该同时具备解密的功能,这样即使黑客攻破了加密系统,他拿到的也只是一堆无 ...
- Java 实现 AES 加解密
毕业课题中需要使用加解密算法,要求加解密前后的数据长度不会变化,查了一些资料,发现可以采用AES加密的CFB跟OFB模式是无填充的模式,可以保持加解密前后数据的长度相等.下面上代码: import j ...
- Java实现aes加解密
pom文件的依赖 <!-- https://mvnrepository.com/artifact/org.apache.commons/commons-lang3 --> <depe ...
- rsa java代码_java加解密RSA使用方法代码示例
最近为了分析一段请求流,不得不去研究一下RSA加密. 首先,强调一点:密钥的"钥"读"yue",不是"yao",额... 网上关于RSA的原 ...
最新文章
- 大龄屌丝自学笔记--Java零基础到菜鸟--028
- android工程中让人很不爽的“×××警告”
- Web版的Tabcontrol控件的制作过程
- 设置nginx 防止上传恶意脚本
- 计算机应用计算题(88)10,计算机应用考试习题(88页)-原创力文档
- 成为Apache顶级项目核心贡献者是一种什么样的体验?
- Windows Print Spooler服务最新漏洞CVE-2021-34527详细分析
- pytorch中数组维度的理解
- Flask初识,第五篇 ,做一个用户登录之后查看学员信息的小例子
- Linux Exploit系列之七 绕过 ASLR -- 第二部分
- r 语言 ggplot上添加平均值_技术贴 | R语言:ggplot堆叠图、冲积图、分组分面、面积图...
- 如何修改搜索框中的cancel button的颜色
- HIVE存储(四)ORCFile
- 创新者的窘境 Teh Innovator‘s Dilemma
- 浙江高职考计算机专业本科,浙江高职自主招生考什么科目
- unity显示no camera rendering
- 基于单幅图像的2D转3D算法研究
- 2023年证券、基金、银行从业资格证考试计划
- 分析oracle缓慢原因,Oracle SQL执行缓慢的原因分析
- 2w字Python列表,全了!