java des ecb_java DES ECB模式对称加密解密

java des ecb_java DES ECB模式对称加密解密最近需要又要使用 DES 加密数据 要求 DES 加密出来的数据为对称加密 经过研究 发现了一些问题 1 DES 对称 ECB 模式加密的数据 长度必须为 8 的倍数 2 加密的数据 加密后先转码 因为加密后的数据我是转码了 否则解密是乱码格式一下是源代码 这个是加密的工具类 packagecom palmfu sql importjava security Key importjavax crypto Ci

最近需要又要使用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:

* :

*

*/

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 = “”;

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:

* :

*

*/

public final class ConvertUtil {

public final static char[] BToA = “0abcdef”.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) “0ABCDEF”.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 版权!

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请联系我们举报,一经查实,本站将立刻删除。

发布者:全栈程序员-站长,转载请注明出处:https://javaforall.net/217585.html原文链接:https://javaforall.net

(0)
上一篇 2026年3月18日 上午9:14
下一篇 2026年3月18日 上午9:15


相关推荐

  • es6 转es5_es6转换es5

    es6 转es5_es6转换es5为什么要es6转es5?答:es6代码在老版本的浏览器中无法执行。怎么将es6代码转为es5代码,让其在老版本的浏览器中执行?答:使用babel模块,babel是一个使用非常广泛的es6转换器,这就意味着我们可以将es6代码转为es5代码,从而在老版本的浏览器中执行。使用步骤:新建一个新的用来编写es6代码的文件夹,进入到该文件中,初始化一个项目npminit表示一步步通过配置来初始化一个项目npminit-y表示使用默认设置来快速初始化一个项目局部安装babel-cli

    2026年3月6日
    6
  • Electron那些事10:本地数据库sqlite

    Electron那些事10:本地数据库sqlite【前言】上一节讲了本地日志,本地数据(文件)的部分,详见:Electron那些事09:本地数据_uikoo9的博客-CSDN博客虽然本地日志可以记录日志信息,本地数据可以记录简单的配置文件,但是像一些复杂的业务,需要维护一个本地数据库进行查询,本节讲一下本地数据库sqlite【sqlite】sqlite是有名的本地数据库,在很多系统中都有应用,SQLiteHomePage当然也有nodejs的版本,一般配套和electron使用,sqlite3-np…

    2022年5月11日
    61
  • convert命令参数

    convert命令参数-adaptive-blur  自适应的模糊操作,在边缘处降低模糊效果-adaptive-resize采用数据依赖的三角滤波算法进行图像尺寸调整-adaptive-sharpen自适应的锐化操作,在边缘处加强锐化效果-adjoin 连接多张图片到同一张图片中-affine 仿射变换矩阵-alpha对阿尔法通道(透明通道)进行开关等操作-annotate 给…

    2022年7月13日
    15
  • JSP页面通过URL传递中文参数出现中文乱码问题

    JSP页面通过URL传递中文参数出现中文乱码问题做项目时遇到这个问题问题描述:通过点击这个参数名并进行跳转control层,进行参数接受并处理。${cs.name}里面包含中文&lt;a href="${pageContext.request.contextPath}/recommend_navCategory?name=${cs.name}"&gt;${cs.name}&lt;/a&gt;服务器端:ISO-8859-1是tomca…

    2022年6月13日
    32
  • 伪元素和伪类的区别总结

    伪元素和伪类的区别总结其中伪类和伪元素的根本区别在于 它们是否创造了新的元素 伪元素 伪对象 不存在在 DOM 文档中 是虚拟的元素 是创建新元素 代表某个元素的子元素 这个子元素虽然在逻辑上存在 但却并不实际存在于文档树中 伪元素选择符伪类 存在 DOM 文档中 逻辑上存在但在文档树中却无须标识的 幽灵 分类 伪类选择符再看看 W3C 中对于二者应用的描述 伪类 用于向某些选择器添加特殊的效果伪元素 用于将特殊

    2026年3月19日
    2
  • 豆包大模型2.0即将发布

    豆包大模型2.0即将发布

    2026年3月12日
    1

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注全栈程序员社区公众号