package com.trq.nengyuan;

import java.security.SecureRandom;

import javax.crypto.spec.DESKeySpec;

import javax.crypto.spec.SecretKeySpec;

import javax.crypto.SecretKeyFactory;

import javax.crypto.SecretKey;

import javax.crypto.Cipher;

import java.util.*;

/**

* 注意:DES加密和解密过程中,密钥长度都必须是8的倍数

*/

public class DES {

public DES() {

}

// 测试

public static void main(String args[]) {

// 待加密内容

//String str = "0123456789";

String strmingwen = "eb9100481380013800009c4a01000301010804050226c6cf7e0002b7000000000000295cef41711d4b4400000000000000000000000041008ec12d0e560440fc2db000000000ac6e";

// 密码,长度要是8的倍数

String password = "12345678";

// 测试密文,长度要是8的倍数

// String miwen = "C4FC354A83E171F20DC0FCB10172A2DED3428CC8390EEA17"

// + "E8244A0A0C71705BA406FAFB279496D9ADE5BBB62905D8DF"

// + "BED9CDF5BB33CA4264F36C82ABC4D69D2FE06145C2204902";

// 在解密前,将字符串的密文转换成16进制的字节数组

// byte[] _miwen = hexString2Bytes(miwen);

try {

// 1.明文 DES ECB加密测试

// 在加密前,将需要加密的明文转换成16进制字节数组

byte[] _mingwenTest = hexString2Bytes(strmingwen);

// DES ECB加密

byte[] encrptResult = DES.encrypt(_mingwenTest, password);

System.out.println("--------------- DES ECB 加密测试 -----------------");

System.out.println("加密前:----" + strmingwen);

// System.out.println("加密后:----" + new String(encrptResult));

System.out.println("加密后:----" + byteToHex(encrptResult));

// 2.密文 DES ECB解密测试

// 测试密文,长度要是8的倍数

byte[] _miwen = encrptResult;

System.out.println("--------------- DES ECB 解密测试 -----------------");

System.out.println("解密前:----" + byteToHex(_miwen));

// DES ECB解密

byte[] decryResult = DES.decrypt(_miwen, password);

// System.out.println("解密后:----" + new String(decryResult));

System.out.println("解密后:----" + byteToHex(decryResult));

} catch (Exception e1) {

e1.printStackTrace();

}

}

/**

* 加密

*

* @param datasource byte[]

* @param password String

* @return byte[]

*/

public static byte[] encrypt(byte[] datasource, String password) {

try {

SecureRandom random = new SecureRandom();

DESKeySpec desKey = new DESKeySpec(password.getBytes());

// 创建一个密匙工厂,然后用它把DESKeySpec转换成

SecretKeyFactory keyFactory = SecretKeyFactory.getInstance("DES");

SecretKey securekey = keyFactory.generateSecret(desKey);

// Cipher对象实际完成加密操作

Cipher cipher = Cipher.getInstance("DES/ECB/NoPadding");

// 用密匙初始化Cipher对象

cipher.init(Cipher.ENCRYPT_MODE, securekey, random);

// 现在,获取数据并加密

// 正式执行加密操作

return cipher.doFinal(addZero(datasource));

} catch (Throwable e) {

e.printStackTrace();

}

return null;

}

/**

* 解密

*

* @param src byte[]

* @param password String

* @return byte[]

* @throws Exception

*/

public static byte[] decrypt(byte[] src, String password) throws Exception {

// DES算法要求有一个可信任的随机数源

SecureRandom random = new SecureRandom();

// 创建一个DESKeySpec对象

DESKeySpec desKey = new DESKeySpec((password.getBytes()));

// 创建一个密匙工厂

SecretKeyFactory keyFactory = SecretKeyFactory.getInstance("DES");

// 将DESKeySpec对象转换成SecretKey对象

SecretKey securekey = keyFactory.generateSecret(desKey);

// Cipher对象实际完成解密操作

Cipher cipher = Cipher.getInstance("DES/ECB/NoPadding");

// 用密匙初始化Cipher对象

cipher.init(Cipher.DECRYPT_MODE, securekey, random);

// 真正开始解密操作

return cipher.doFinal(src);

}

public static byte[] getKey(byte[] keyRule) {

SecretKeySpec key = null;

byte[] keyByte = keyRule;

System.out.println(keyByte.length);

// 创建一个空的八位数组,默认情况下为0

byte[] byteTemp = new byte[8];

// 将用户指定的规则转换成八位数组

int i = 0;

for (; i < byteTemp.length && i < keyByte.length; i++) {

byteTemp[i] = keyByte[i];

}

key = new SecretKeySpec(byteTemp, "DES");

return key.getEncoded();

}

public static byte[] addZero(byte[] data) {

byte[] dataByte = data;

if (data.length % 8 != 0) {

byte[] temp = new byte[8 - data.length % 8];

dataByte = byteMerger(data, temp);

}

return dataByte;

}

// java 合并两个byte数组

// System.arraycopy()方法

public static byte[] byteMerger(byte[] bt1, byte[] bt2) {

byte[] bt3 = new byte[bt1.length + bt2.length];

System.arraycopy(bt1, 0, bt3, 0, bt1.length);

System.arraycopy(bt2, 0, bt3, bt1.length, bt2.length);

return bt3;

}

/**

* byte数组转hex

* @param bytes

* @return

*/

public static String byteToHex(byte[] bytes){

String strHex = "";

StringBuilder sb = new StringBuilder("");

for (int n = 0; n < bytes.length; n++) {

strHex = Integer.toHexString(bytes[n] & 0xFF);

sb.append((strHex.length() == 1) ? "0" + strHex : strHex); // 每个字节由两个字符表示,位数不够,高位补0

}

return sb.toString().trim();

}

/**

* @Title:hexString2Bytes

* @Description:16进制字符串转字节数组

* @param src

* 16进制字符串

* @return 字节数组

* @throws

*/

public static byte[] hexString2Bytes(String src) {

int l = src.length() / 2;

byte[] ret = new byte[l];

for (int i = 0; i < l; i++) {

ret[i] = Integer.valueOf(src.substring(i * 2, i * 2 + 2), 16).byteValue();

}

return ret;

}

}

java des ecb_DES ECB加解密的Java实现相关推荐

  1. java实现国密加解密

    1. pom依赖 <dependency><groupId>org.bouncycastle</groupId><artifactId>bcprov-j ...

  2. java实现对文件加解密操作

    源文件: 加密后的文件: 解密后的文件: package com.gblfy.test;import java.io.*;/*** java 实现对文件加解密的方法** @author gblfy* ...

  3. SM2加密解决java与iOS端加解密不配套问题

    SM2加密解决java与iOS端加解密不配套问题 问题描述 问题判定 代码 声明 问题描述 使用java开发的SM2加解密,由java层生成SM2公私钥,iOS.Android(因和java层一致,暂 ...

  4. JAVA实现PGP/GPG加解密

    注:文章皆为个人纪录,可用性请以最终结果为准,若有错还请大佬们指出,谢谢! 一.加解密的准备资料 1.1  公钥 (用于加密) 1.2  私钥(用于解密) 1.3   私钥key (用于验证私钥) 导 ...

  5. python:实现DES和3DES加解密算法(附完整源码)

    python:实现DES和3DES加解密算法 import sys _pythonMajorVersion = sys.version_info[0]# Modes of crypting / cyp ...

  6. pyDes 库 DES 与 3DES 加解密

    废话不多说,直接开干! 介绍基于 Python pyDes 库实现 DES 与 3DES 加解密 切换 des 与 3des 的地方在 init 初始化函数中 trans_base64=False 是 ...

  7. web调用IC卡读卡器开发第八章--DES和3DES加解密

    DES和3DES加解密 关于DES和3DES IC卡web插件支持的3DES DES和3DES接口 IC中如果使用DES和3DES CPU卡中如何使用3DES 关于DES和3DES DES是一种标准加 ...

  8. aes 256 ecb 加解密 pkcs7补全 python JS

    python aes 256 ecb 加解密 功能 实现 Python ECB 256 JS版本 ECB 算法 JS版本 CBC 算法Pkcs7填充 SQL AES 在线验证网站 notice 功能 ...

  9. AES-GCM算法 Java与Python互相加解密

    文章目录 1. AES 2. AES的分组长度和秘钥长度 3.AES加密模式 4.AES-GCM 5. JAVA应用 5.1 生成密钥 5.2 加密 5.3 解密 6. Python应用 7. 测试一 ...

最新文章

  1. 我什么时候应该使用结构而不是类?
  2. BurpSuite学习第七节--Sequencer+Decoder
  3. 3d slicer如何下载出radiomics_Lumion 10.0 软件下载及安装教程
  4. 自定义曲线_Qt编写的项目作品17-自定义曲线图柱状图
  5. 基于Taro开发小程序笔记--04路由跳转的几种方式
  6. VALSE学习(十一):弱监督图像语义分割
  7. 临床试验中的样本量估算---实践篇
  8. 一看就懂!小白就能用python爬到又大又白的图片!
  9. 相亲也内卷?被程序员的相亲规划整不会了......
  10. 计算机网络的核心概念
  11. pandas task-08
  12. 如果延迟退休势在必行,区块链如何助力“养老助老”?
  13. imx6ul-正点原子-imx6ul学习笔记(5)
  14. html思维导图word版,(完整word版)非谓语动词练习及思维导图
  15. python人脸识别解锁电脑_Python 实现在 App 端的人脸识别!手机解锁人脸识别!
  16. 李成名:科学就是较真 数字城市/智慧城市就是跑马圈地
  17. matlab画简单曲线,并进行标注、图例、加网格,等操作
  18. 技术集锦 | 大数据云原生技术实战及最佳实践系列
  19. mac fish shell的安装和使用教程
  20. eslint报错解决方案:--fix的使用

热门文章

  1. 电脑白屏或黑屏解决方法
  2. 剪不断,理不乱——三层架构之抽象工厂加反射
  3. [AlwaysOn] 创建SQL Server高可用性组T-SQL语法:SEEDING_MODE参数
  4. zcmu1275: Seeding
  5. 7-2 群发邮件 (20 分)
  6. 06-01 DeepLearning-图像识别
  7. iperf和iperf3测速使用
  8. 苹果usb设置在哪里_努比亚红魔3红魔3S打开开发者选项和USB调试功能
  9. React Native开发环境配置检测
  10. java开发工具(3)你真的会用IDEA么?(下)keyMap、Project Structure功能介绍