最近需要又要使用DES加密数据,要求DES加密出来的数据为对称加密,经过研究,发现了一些问题:

1.DES对称ECB模式加密的数据,长度必须为8的倍数

2.加密的数据,加密后先转码(因为加密后的数据我是转码了),否则解密是乱码格式

一下是源代码:

这个是加密的工具类:

package com.palmfu.sql;

import java.security.Key;

import javax.crypto.Cipher;

import javax.crypto.spec.SecretKeySpec;

/***

* DES ECB对称加密 解密

* @author spring sky

* Email:vipa1888@163.com

* QQ:840950105

*

*/

public class DesECBUtil {

/**

* 加密数据

* @param encryptString 注意:这里的数据长度只能为8的倍数

* @param encryptKey

* @return

* @throws Exception

*/

public static String encryptDES(String encryptString, String encryptKey) throws Exception {

SecretKeySpec key = new SecretKeySpec(getKey(encryptKey), "DES");

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

cipher.init(Cipher.ENCRYPT_MODE, key);

byte[] encryptedData = cipher.doFinal(encryptString.getBytes());

return ConvertUtil.bytesToHexString(encryptedData);

}

/**

* 自定义一个key

* @param string

*/

public static byte[] getKey(String keyRule) {

Key key = null;

byte[] keyByte = keyRule.getBytes();

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

byte[] byteTemp = new byte[8];

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

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

byteTemp[i] = keyByte[i];

}

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

return key.getEncoded();

}

/***

* 解密数据

* @param decryptString

* @param decryptKey

* @return

* @throws Exception

*/

public static String decryptDES(String decryptString, String decryptKey) throws Exception {

SecretKeySpec key = new SecretKeySpec(getKey(decryptKey), "DES");

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

cipher.init(Cipher.DECRYPT_MODE, key);

byte decryptedData[] = cipher.doFinal(ConvertUtil.hexStringToByte(decryptString));

return new String(decryptedData);

}

public static void main(String[] args) throws Exception {

String clearText = "springsk"; //这里的数据长度必须为8的倍数

String key = "12345678";

System.out.println("明文:"+clearText+"\n密钥:"+key);

String encryptText = encryptDES(clearText, key);

System.out.println("加密后:"+encryptText);

String decryptText = decryptDES(encryptText, key);

System.out.println("解密后:"+decryptText);

}

}

转码工具类(包含MD5加密)

package com.palmfu.sql;

import java.io.ByteArrayInputStream;

import java.io.ByteArrayOutputStream;

import java.io.IOException;

import java.io.ObjectInputStream;

import java.io.ObjectOutputStream;

import java.io.Serializable;

import java.security.MessageDigest;

import java.security.NoSuchAlgorithmException;

/***

* 转码 MD5工具类

* @author spring sky

* Email:vipa1888@163.com

* QQ:840950105

*

*/

public final class ConvertUtil {

public final static char[] BToA = "0123456789abcdef".toCharArray();

private ConvertUtil() {

}

/**

* 把16进制字符串转换成字节数组

*

* @param hex

* @return

*/

public static byte[] hexStringToByte(String hex) {

int len = (hex.length() / 2);

byte[] result = new byte[len];

char[] achar = hex.toCharArray();

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

int pos = i * 2;

result[i] = (byte) (toByte(achar[pos]) << 4 | toByte(achar[pos + 1]));

}

return result;

}

private static byte toByte(char c) {

byte b = (byte) "0123456789ABCDEF".indexOf(c);

return b;

}

/**

* 把字节数组转换成16进制字符串

*

* @param bArray

* @return

*/

public static final String bytesToHexString(byte[] bArray) {

if(bArray == null )

{

return "";

}

StringBuffer sb = new StringBuffer(bArray.length);

String sTemp;

for (int i = 0; i < bArray.length; i++) {

sTemp = Integer.toHexString(0xFF & bArray[i]);

if (sTemp.length() < 2)

sb.append(0);

sb.append(sTemp.toUpperCase());

}

return sb.toString();

}

/**

* 把字节数组转换为对象

*

* @param bytes

* @return

* @throws IOException

* @throws ClassNotFoundException

*/

public static final Object bytesToObject(byte[] bytes) throws IOException,

ClassNotFoundException {

ByteArrayInputStream in = new ByteArrayInputStream(bytes);

ObjectInputStream oi = new ObjectInputStream(in);

Object o = oi.readObject();

oi.close();

return o;

}

/**

* 把可序列化对象转换成字节数组

*

* @param s

* @return

* @throws IOException

*/

public static final byte[] objectToBytes(Serializable s) throws IOException {

ByteArrayOutputStream out = new ByteArrayOutputStream();

ObjectOutputStream ot = new ObjectOutputStream(out);

ot.writeObject(s);

ot.flush();

ot.close();

return out.toByteArray();

}

public static final String objectToHexString(Serializable s)

throws IOException {

return bytesToHexString(objectToBytes(s));

}

public static final Object hexStringToObject(String hex)

throws IOException, ClassNotFoundException {

return bytesToObject(hexStringToByte(hex));

}

/**

* @函数功能: BCD码转为10进制串(阿拉伯数据)

* @输入参数: BCD码

* @输出结果: 10进制串

*/

public static String bcd2Str(byte[] bytes) {

StringBuffer temp = new StringBuffer(bytes.length * 2);

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

temp.append((byte) ((bytes[i] & 0xf0) >>> 4));

temp.append((byte) (bytes[i] & 0x0f));

}

return temp.toString().substring(0, 1).equalsIgnoreCase("0") ? temp

.toString().substring(1) : temp.toString();

}

/**

* @函数功能: 10进制串转为BCD码

* @输入参数: 10进制串

* @输出结果: BCD码

*/

public static byte[] str2Bcd(String asc) {

int len = asc.length();

int mod = len % 2;

if (mod != 0) {

asc = "0" + asc;

len = asc.length();

}

byte abt[] = new byte[len];

if (len >= 2) {

len = len / 2;

}

byte bbt[] = new byte[len];

abt = asc.getBytes();

int j, k;

for (int p = 0; p < asc.length() / 2; p++) {

if ((abt[2 * p] >= '0') && (abt[2 * p] <= '9')) {

j = abt[2 * p] - '0';

} else if ((abt[2 * p] >= 'a') && (abt[2 * p] <= 'z')) {

j = abt[2 * p] - 'a' + 0x0a;

} else {

j = abt[2 * p] - 'A' + 0x0a;

}

if ((abt[2 * p + 1] >= '0') && (abt[2 * p + 1] <= '9')) {

k = abt[2 * p + 1] - '0';

} else if ((abt[2 * p + 1] >= 'a') && (abt[2 * p + 1] <= 'z')) {

k = abt[2 * p + 1] - 'a' + 0x0a;

} else {

k = abt[2 * p + 1] - 'A' + 0x0a;

}

int a = (j << 4) + k;

byte b = (byte) a;

bbt[p] = b;

}

return bbt;

}

public static String BCD2ASC(byte[] bytes) {

StringBuffer temp = new StringBuffer(bytes.length * 2);

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

int h = ((bytes[i] & 0xf0) >>> 4);

int l = (bytes[i] & 0x0f);

temp.append(BToA[h]).append(BToA[l]);

}

return temp.toString();

}

/**

* 两字符数组异或

*/

public static byte[] byteArrXor(byte[] arr1, byte[] arr2, int len){

byte[] dest = new byte[len];

if((arr1.length < len) || (arr2.length < len)){

return null;

}

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

dest[i] = (byte)(arr1[i] ^ arr2[i]);

}

return dest;

}

/**

* MD5加密字符串,返回加密后的16进制字符串

* @param origin

* @return

*/

public static String MD5EncodeToHex(String origin) {

return bytesToHexString(MD5Encode(origin));

}

/**

* MD5加密字符串,返回加密后的字节数组

*

* @param origin

* @return

*/

public static byte[] MD5Encode(String origin) {

return MD5Encode(origin.getBytes());

}

/**

* MD5加密字节数组,返回加密后的字节数组

*

* @param bytes

* @return

*/

public static byte[] MD5Encode(byte[] bytes) {

MessageDigest md = null;

try {

md = MessageDigest.getInstance("MD5");

return md.digest(bytes);

} catch (NoSuchAlgorithmException e) {

e.printStackTrace();

return new byte[0];

}

}

}

以上DES 的ECB模式加密解密已经在android java平台测试,没有任何问题,而且已经和PHP后台互通了,请大家放心使用!如有问题,请联系我!

转载请保留spring sky 版权!

java des ecb_java DES ECB模式对称加密解密相关推荐

  1. java des ecb_【转】 java DES ECB模式对称加密解密

    最近需要又要使用DES加密数据,要求DES加密出来的数据为对称加密,经过研究,发现了一些问题: 1.DES对称ECB模式加密的数据,长度必须为8的倍数 2.加密的数据,加密后先转码(因为加密后的数据我 ...

  2. python调用库函数用ecb模式加密图片_AES中ECB模式的加密与解密(Python3.7)

    本文主要解决的问题 本文主要是讲解AES加密算法中的ECB模式的加密解密的Python3.7实现.具体AES加密算法的原理这里不做过多介绍,想了解的可以参考文末的参考链接. 主要解决了两个问题: 在P ...

  3. golang实现AES ECB模式的加密和解密

    最近有一个需求需要在golang中实现AES ECB模式的加密和解密,  看了一下官方文档和相关资料发现golang 官方包并没有完善的实现,于是自己尝试写了一个,本文中的AES算法是基于ECB模式, ...

  4. java和Vue前后端RSA对称加密

    java和Vue前后端RSA对称加密 参考:https://blog.csdn.net/qq_25623257/article/details/109775531 一.生成秘钥对(公私钥) 在线生成地 ...

  5. Vue前端和Java后端 联调使用AES 前后端加密解密

    Vue前端和Java后端 联调使用AES 前后端加密解密 最近在项目中需要针对重要数据进行加密传输,在网上找了一大推加密方式 最终采用AES 加密 Java端 package com.zk.web.u ...

  6. pyDes 实现 Python 版的 DES 对称加密/解密--转

    https://my.oschina.net/leejun2005/blog/586451 手头有个 Java 版的 DES 加密/解密程序,最近想着将其 Python 重构下,方便后续脚本解析,捣鼓 ...

  7. java中3des cbc,js與java通用的3DES(ECB,CBC)+Base64加密編碼,解碼解密

    J S端加密過程: key的處理: 通過創建指定的key,key必須是16位/24位/32位其中一種,但是常用的3DES加密的key為24位,下面使用的就是24位,key的長度可以隨意指定,在轉換ke ...

  8. 黄聪:【转】C# 对称加密解密算法

    /// <summary>     /// 对称加密算法类,使用系统自带的函数     /// </summary>     public class SymmetricMet ...

  9. Java 实现RSA 签名/验签与加密解密

    文章目录 一.前言 二.签名与验签 1.程序代码如下: 2.程序运行结果: 三.加密解密 1.添加加解密方法 2.程序运行结果 一.前言 RSA 算法相比于AES算法不同的是RSA的秘钥为不同的两个一 ...

最新文章

  1. 2018-3-24论文(Grey Wolf Optimizer)note1----------No Free Lunch Theorem
  2. CodeForces 768E Game of Stones 打表找规律
  3. html5开发桌面界面设计,HTML5触摸界面设计与开发
  4. python画玫瑰花的代码_python绘制玫瑰的实现代码
  5. 面试的算法2(C语言)(整理)
  6. Managing Tables
  7. 分布式事务解决方案——柔性事务与服务模式
  8. 在C#代码中执行BCS外部内容类型方法
  9. Keras官方中文文档:关于Keras模型
  10. 常用API2 正则表达式
  11. 提示,请选择有效的文件
  12. el表达式原样输出问题
  13. jquery动态生成的元素添加事件的方法
  14. orcad中的PSpice仿真加入厂商模型
  15. python爬虫app_Python爬虫:抓取手机APP的数据
  16. CDH6离线安装教程
  17. SPSS作业-如何判别是否服从正态分布
  18. 站在巨人肩膀上——vb.net学习
  19. 飞火流星测试经验总结
  20. html中盒子的定位,css盒子的定位有哪些方法?

热门文章

  1. 目前最全的机器学习知识结构图(11月1日更新)
  2. 过程式计算机语言,Go 语言程序设计——过程式编程(1)
  3. 电网计算机面试专业题,国家电网计算机管理员面试经验|面试题 - 职朋职业圈...
  4. ArcGIS Engine基础(21)之面积测量(带内外环面积计算方法、地理坐标系和投影坐标系通用)
  5. 案例研究:什么是自动驾驶?
  6. vue--后台管理系统问题和功能实现思路集锦
  7. 尝试用Unity还原蔚蓝(Celeste)—— 真·操控、移动、手感篇
  8. DDNS的NAT穿越问题
  9. php高仿互站网源码,2020新版友价高仿互站网源码 虚拟交易商城整站源码
  10. STM32通信:IIC (二)