import java.security.Key;
import java.security.SecureRandom;
import java.security.Security;
import javax.crypto.Cipher;
import javax.crypto.KeyGenerator;
public class DESUtil {
/** 字符串默认键值 */
private static String strDefaultKey = "national";
/** 加密工具 */
private Cipher encryptCipher = null;
/** 解密工具 */
private Cipher decryptCipher = null;
/**
* 将byte数组转换为表示16进制值的字符串, 如:byte[]{8,18}转换为:0813, 和public static byte[]
* hexStr2ByteArr(String strIn) 互为可逆的转换过程
*
* @param arrB
* 需要转换的byte数组
* @return 转换后的字符串
* @throws Exception
* 本方法不处理任何异常,所有异常全部抛出
*/
public static String byteArr2HexStr(byte[] arrB) throws Exception {
int iLen = arrB.length;
// 每个byte用两个字符才能表示,所以字符串的长度是数组长度的两倍
StringBuffer sb = new StringBuffer(iLen * 2);
for (int i = 0; i < iLen; i++) {
int intTmp = arrB[i];
// 把负数转换为正数
while (intTmp < 0) {
intTmp = intTmp + 256;
}
// 小于0F的数需要在前面补0
if (intTmp < 16) {
sb.append("0");
}
sb.append(Integer.toString(intTmp, 16));
}
return sb.toString();
}
/**
* 将表示16进制值的字符串转换为byte数组, 和public static String byteArr2HexStr(byte[] arrB)
* 互为可逆的转换过程
*
* @param strIn
* 需要转换的字符串
* @return 转换后的byte数组
* @throws Exception
* 本方法不处理任何异常,所有异常全部抛出
* @author <a href="mailto:leo841001@163.com">LiGuoQing</a>
*/
public static byte[] hexStr2ByteArr(String strIn) throws Exception {
byte[] arrB = strIn.getBytes();
int iLen = arrB.length;
// 两个字符表示一个字节,所以字节数组长度是字符串长度除以2
byte[] arrOut = new byte[iLen / 2];
for (int i = 0; i < iLen; i = i + 2) {
String strTmp = new String(arrB, i, 2);
arrOut[i / 2] = (byte) Integer.parseInt(strTmp, 16);
}
return arrOut;
}
/**
* 默认构造方法,使用默认密钥
*
* @throws Exception
*/
public DESUtil() throws Exception {
this(strDefaultKey);
}
/**
* 指定密钥构造方法
*
* @param strKey
* 指定的密钥
* @throws Exception
*/
public DESUtil(String strKey) throws Exception {
Security.addProvider(new com.sun.crypto.provider.SunJCE());
Key key = getKey(strKey.getBytes());
encryptCipher = Cipher.getInstance("DES");
encryptCipher.init(Cipher.ENCRYPT_MODE, key);
decryptCipher = Cipher.getInstance("DES");
decryptCipher.init(Cipher.DECRYPT_MODE, key);
}
/**
* 加密字节数组
*
* @param arrB
* 需加密的字节数组
* @return 加密后的字节数组
* @throws Exception
*/
public byte[] encrypt(byte[] arrB) throws Exception {
return encryptCipher.doFinal(arrB);
}
/**
* 加密字符串
*
* @param strIn
* 需加密的字符串
* @return 加密后的字符串
* @throws Exception
*/
public String encrypt(String strIn) throws Exception {
return byteArr2HexStr(encrypt(strIn.getBytes()));
}
/**
* 解密字节数组
*
* @param arrB
* 需解密的字节数组
* @return 解密后的字节数组
* @throws Exception
*/
public byte[] decrypt(byte[] arrB) throws Exception {
return decryptCipher.doFinal(arrB);
}
/**
* 解密字符串
*
* @param strIn
* 需解密的字符串
* @return 解密后的字符串
* @throws Exception
*/
public String decrypt(String strIn) throws Exception {
return new String(decrypt(hexStr2ByteArr(strIn)));
}
/**
* 从指定字符串生成密钥,密钥所需的字节数组长度为8位 不足8位时后面补0,超出8位只取前8位
*
* @param arrBTmp
* 构成该字符串的字节数组
* @return 生成的密钥
* @throws java.lang.Exception
*/
private Key getKey(byte[] arrBTmp) throws Exception {
// 创建一个空的8位字节数组(默认值为0)
byte[] arrB = new byte[8];
// 将原始字节数组转换为8位
for (int i = 0; i < arrBTmp.length && i < arrB.length; i++) {
arrB[i] = arrBTmp[i];
}
// 生成密钥
Key key = new javax.crypto.spec.SecretKeySpec(arrB, "DES");
return key;
}
/**
* 校验数据是否被修改
*
* @param signEnc
* 加密后数据
* @param msg
* 原始数据
* @param key
* 密钥
* @return true or false
* @throws Exception
*/
public static boolean validate(String signEnc, String msg, String key)
throws Exception {
boolean flag = false;
DESUtil des = new DESUtil(key);// 实例化一个对像
// 生成密匙
String strDes = des.decrypt(signEnc);
if (msg.equals(strDes)) {
flag = true;
}
return flag;
}
public static void main(String[] args) {
try {
String test = "20121012000007<测试>";
DESUtil des = new DESUtil("test");// 自定义密钥
System.out.println("加密前的字符:" + test);
System.out.println("加密后的字符:" + des.encrypt(test));
System.out.println("解密后的字符:" + des.decrypt(des.encrypt(test)));
} catch (Exception e) {
e.printStackTrace();
}
}
}
- 浏览: 267175 次
- 性别:
- 来自: 上海
文章分类
- 全部博客 (187)
- spring (10)
- jquery (14)
- js (18)
- java (44)
- freemarker (7)
- 框架介绍 (1)
- tomcat (4)
- oracle (7)
- 喜欢的诗文 (4)
- linux (19)
- nokia (1)
- 那些事 (1)
- apache (3)
- dom4j (1)
- SOA (1)
- 企业架构 (2)
- baidu (1)
- svn (1)
- 测试 (4)
- liunx (0)
- memcahce (1)
- mysql (25)
- maven (4)
- 推广 (1)
- 网络 (1)
- vpn (1)
- drools (1)
- mongodb (1)
- redis (3)
- xlightweb (1)
- wifi (1)
- 学习资料 (1)
- git (1)
- 系统设计 (1)
- springboot (1)
- 自考 (0)
最新评论
-
zuo_qin_bo:
if(df==null){ //这个地方并发多的情况 ...
ThreadLocal解决dateFormat多线程错误 -
kongnan93:
好文!赞一个!!!!
jquery blockUI 居中显示 -
cxc_110928:
如果加上不能出现连续的数字或者字母 如 1234 abcd ...
用java 匹配一个数字和字母密码的正则表达式 -
wzwahl36:
http://www.atool.org/json2javab ...
JSON和JAVA的POJO的相互转换
发表评论
-
折半查找法
2019-06-17 18:11 375public static void main(String[ ... -
js 加密 java解密
2017-12-05 16:27 890https://github.com/noisyle/cr ... -
java工程师成长之路
2017-03-04 17:43 589一、基础篇 1.1 JVM 1.1.1. J ... -
java 启动jar
2017-03-04 15:40 1655#!/bin/sh PRG="$0&qu ... -
ThreadLocal解决dateFormat多线程错误
2016-09-19 17:44 2173出处 http://www.blogjava.net/ki ... -
设计模式
2016-06-02 17:11 489http://www.cnblogs.com/xing9010 ... -
list分页
2016-05-11 09:56 406//分批保存数据 if(null!=aassetO ... -
根据输入执行代码块
2015-05-11 17:25 693/** * f-road.com Inc. * Copyrig ... -
java装饰器模式
2015-03-17 18:00 861java装饰器模式 意图:动态的将责任附加到对象上什么 ... -
java适配器模式
2015-03-17 17:54 650定义:属于结构型模式,其主要作用是将一个类的接口转换成客户 ... -
Java垃圾回收机制
2015-02-04 09:43 743垃圾收集GC(Garbage Coll ... -
jvisualvm结合jstatd进行远程监控
2015-01-27 16:17 856jvisualvm是Jdk自带的,具体点,据说是jdk1 ... -
最佳线程数总结
2015-01-26 11:53 0最佳线程数: 性能压 ... -
线程dump
2015-01-26 11:19 0Java 的线程 线程是指 ... -
几种阻塞队列
2015-01-26 11:11 0转自:http://blog.csdn.net/yydcj/ ... -
线程池的原理及实现
2015-01-26 10:53 7081、线程池简介: ... -
线程同步通信技术-wait notify 用法
2014-10-22 20:58 706/** * * <pre> * 子线程 ... -
Cisco VPN Client 442
2014-10-18 21:17 162典型的Cisco VPN Client 442 错误,之前的 ... -
JDK安装
2014-10-18 15:15 749学习Java 开发的第一步就是构建开发环境,JDK(Java ... -
MultiThreadHttpClient
2014-09-15 17:05 455package com.froad.points.bankse ...
相关推荐
这需要创建一个.NET类库项目,实现DES加密解密功能,然后在VBA中通过CreateObject或早绑定的方式调用这些函数。 以下是VB.NET中实现DES加密解密的简单示例代码: ```vbnet Imports System.IO Imports System....
Hibernate 配置文件加密解密方案 在本文中,我们将讨论如何在 Hibernate 配置文件中对数据库密码进行加密和解密,以保护数据的安全。该方案通过使用 Java 的 Cipher 类和 DES 对称加密算法来实现加密和解密操作。 ...
vue DES加密解密工具类 des.js,与博文中的匹配,为封装好的完整工具类
4. **加载DLL和调用方法**: 在Java代码中,使用`System.loadLibrary`加载本地库,然后可以调用`DesUtil.encrypt`和`DesUtil.decrypt`进行DES加密解密。 ```java public class Main { public static void main...
V3DESUtil工具类提供了一个完整的Java实现的3DES加密解密工具类的示例,通过设置密钥和加密/解密信息,可以对数据进行加密和解密操作。该工具类的使用可以分为以下几个步骤: 1. 导入所需的类库:import org.bouncy...
总之,DESUtil 类是一个用于简化 DES 加密和解密操作的工具类,它封装了 DES 算法的关键步骤,使得开发者可以方便地在项目中集成加密解密功能。尽管 DES 在某些场景下仍可使用,但考虑到安全性,建议考虑更新的加密...
DES加密的过程主要分为两个阶段:加密和解密。它基于Feistel结构,将明文分成左半部分L和右半部分R,然后通过一系列迭代的步骤进行加密。每个迭代过程中,都会用到一个64位的密钥,但实际上只有56位参与加密,因为有...
总的来说,Java的`javax.crypto`包提供了强大的加密能力,可以轻松实现AES和DES加密解密。在实际应用中,根据项目需求选择合适的加密算法,并确保遵循最佳实践,如使用足够长度的密钥,避免明文存储密钥,以及定期...
在Android开发中,JNI常用于提升性能、调用系统级API或者利用C/C++库来处理特定任务,如加密解密。本话题将探讨如何使用JNI在Android中实现DES(Data Encryption Standard)加密和解密。 DES是一种对称加密算法,它...
### 使用JAVA实现DES加密解密的关键知识点 #### 1. DES算法概述 DES(Data Encryption Standard),即数据加密标准,是一种对称密钥算法,由IBM公司开发,并于1977年被美国国家标准局(ANSI)采纳为数据加密标准。...
"Java实现的DES加密解密工具类实例" 本文主要介绍了Java实现的DES加密解密工具类的定义和使用方法,并通过实例形式对其进行了分析。Java中的DES加密解密工具类是一个非常重要的工具,可以用来对数据进行加密和解密...
本话题将围绕在Android中使用DES加密和解密时遇到的一个常见问题展开:`javax.crypto.IllegalBlockSizeException: last block incomplete in decryption`。 这个异常通常发生在解密过程中,当输入的数据块大小与DES...
它使用64位的密钥对数据进行加密和解密,但实际有效密钥长度只有56位。DES的工作模式包括ECB(Electronic Codebook)、CBC(Cipher Block Chaining)等,其中CBC模式由于其更好的安全性,常在实际应用中使用。 在...
需要注意的是,虽然这段代码给出了一个基本的DES加密解密实现,但在实际应用中,由于DES的安全性问题,通常会使用更强大的算法,如AES(高级加密标准)。此外,硬编码的密钥和初始化向量在生产环境中是不可取的,...
以下是一个Java DES加密解密的例子: ```java import javax.crypto.Cipher; import javax.crypto.spec.SecretKeySpec; public class DESUtil { private final static String ALGORITHM = "DES"; public static ...
`DESUtil.java`文件很可能包含一个名为`DESUtil`的类,该类提供了静态方法来进行DES加密和解密操作。类中可能会有如下的方法签名: ```java public static byte[] encrypt(String plainText, byte[] key) throws ...
1、C#平台上的加密与解密 2、JAVA平台上的加密与解密 3、C#平台上的加密,能在JAVA平台上解密 4、JAVA平台上的加密,能在C#平台上解密 这个工具类,是基于平台的,不调用任何第三方软件,已经运用在实际项目中。
在提供的`DESUtil.java`文件中,可能包含了实现DES加密和解密功能的类。这个类通常会有以下几个核心方法: 1. **生成密钥**:`generateKey()` 方法,通过`KeyGenerator.getInstance("DES")`获取DES的KeyGenerator...