热门标签 | HotTags
当前位置:  开发笔记 > Android > 正文

java实现DES加密解密的示例

这篇文章主要介绍了java实现DES加密解密的示例代码,帮助大家更好的理解和使用Java进行加解密,感兴趣的朋友可以了解下
package com.cn.peitest;

import javax.crypto.Cipher;
import javax.crypto.SecretKey;
import javax.crypto.SecretKeyFactory;
import javax.crypto.spec.DESKeySpec;
import javax.crypto.spec.IvParameterSpec;

/**
 * @功能说明:  
* @创建日期:2016年9月21日
* @变更记录:
* 1、2016年9月21日 LeoLu 更新 */ public class DESUtil { /**用于建立大写的十六进制字符的输出*/ private static final char[] DIGITS_UPPER = { '0', '1', '2', '3', '4', '5', '6', '7', '8', '9', 'A', 'B', 'C', 'D', 'E', 'F' }; /**DES向量*/ private static final byte[] iv = {0x12, 0x34, 0x56, 0x78, (byte) 0x90, (byte) 0xab, (byte) 0xcd, (byte) 0xef}; //private static final Logger log = LoggerFactory.getLogger(DESUtil.class); /** * @函数名称:encodeHex
* @创建日期:2016年9月22日
* @功能说明: 将字节数组转换为十六进制字节数组
* @参数说明:data byte[] 字节数组
* @参数说明:toDigits char[] 向量
* @返回说明:十六进制char[] */ private static char[] encodeHex(byte[] data, char[] toDigits) { int l = data.length; char[] out = new char[l <<1]; for (int i = 0, j = 0; i >> 4]; out[j++] = toDigits[0x0F & data[i]]; } return out; } /** * @函数名称:encodeHexStr
* @创建日期:2016年9月22日
* @功能说明:将16进制字节数组转换为十六进制字符串
* @参数说明:data byte[] 16进制字节数组
* @参数说明:toDigits char[] 向量
* @返回说明:String 返回16进制字符串 */ private static String encodeHexStr(byte[] data, char[] toDigits) { return new String(encodeHex(data, toDigits)); } /** * @函数名称:hexStringToString
* @创建日期:2016年9月21日
* @功能说明:将16进制字符串转换为10进制字符串
* @参数说明:str String 16进制字符串
* @返回说明:String */ private static String hexStringToString(String str) { if (str == null || str.equals("")) { return null; } str = str.replace(" ", ""); byte[] baKeyword = new byte[str.length() / 2]; for (int i = 0; i * @创建日期:2016年9月22日
* @功能说明:加密字节数组
* @参数说明:arrB byte[] 需要加密的字节数组
* @参数说明:key String 秘钥
* @返回说明:byte[] */ private static byte[] encrypt(byte[] arrB, String key) throws Exception { return converCrypt(arrB, key, true); } /** * @函数名称:encrypt
* @创建日期:2016年9月22日
* @功能说明:加密字符串
* @参数说明:xml String 加密字符串
* @参数说明:key String 秘钥
* @返回说明:String 返回加密后的16进制字符串 */ public static String encrypt(String xml, String key) { try { return encodeHexStr(encrypt(xml.getBytes("UTF-8"), key), DIGITS_UPPER); } catch (Exception e) { System.out.println(e); return ""; } } /** * @函数名称:decrypt
* @创建日期:2016年9月22日
* @功能说明: 将16进制字节数组进行解密
* @参数说明: arrB byte[] 解密字节数组
* @参数说明:key String 秘钥
* @返回说明:byte[] 返回解密后 的16位字节数组 */ private static byte[] decrypt(byte[] arrB, String key) throws Exception { return converCrypt(arrB, key, false); } /** * @函数名称:converCrypt
* @创建日期:2016年9月22日
* @功能说明:将16位的字节数据进行加密或解密
* @参数说明: arrB byte[] 需要加密的字节数组
* @参数说明: key String 秘钥
* @参数说明:encrypt boolean是否加密,true加密,false解密
* @返回说明:byte[] 返回16进制字节数组 */ private static byte[] converCrypt(byte[] arrB, String key, boolean encrypt) throws Exception{ String vikey = MD5.sign(key).substring(0, 8).toUpperCase(); DESKeySpec desKeySpec = new DESKeySpec(vikey.getBytes()); SecretKeyFactory keyFactory = SecretKeyFactory.getInstance("DES"); SecretKey secretKey = keyFactory.generateSecret(desKeySpec); IvParameterSpec ivp = new IvParameterSpec(vikey.getBytes()); Cipher cipher = Cipher.getInstance("DES/CBC/PKCS5Padding"); /**加密*/ if (encrypt == true) { cipher.init(Cipher.ENCRYPT_MODE, secretKey, ivp); } else{ /**解密*/ cipher.init(Cipher.DECRYPT_MODE, secretKey, ivp); } return cipher.doFinal(arrB); } /** * @函数名称:decrypt
* @创建日期:2016年9月22日
* @功能说明:解密16进制字符串
* @参数说明: desStr String 需要解密的16进制字符串
* @参数说明: key String 秘钥
* @返回说明:String 返回解密后的10进制字符串 */ public static String decrypt(String desStr, String key) { try{ if (null == desStr || null == key) { return ""; } return hexStringToString(encodeHexStr(decrypt(hexStringToByte(new String(desStr.getBytes("UTF-8"))), key), DIGITS_UPPER)); } catch (Exception e) { System.out.println(); return ""; } } /** * @函数名称:hexStringToByte
* @创建日期:2016年9月22日
* @功能说明:将16进制字符串转换为16进制字节数组
* @参数说明:hex String需要转换的16进制字符串
* @返回说明:byte[] 返回转换后的16进制字节数组 */ private static byte[] hexStringToByte(String hex) { int len = (hex.length() / 2); byte[] result = new byte[len]; char[] achar = hex.toCharArray(); for (int i = 0; i * @创建日期:2016年9月22日
* @功能说明: 将字符转换为字节
* @参数说明: c char 需要转换的字符
* @返回说明:int 返回字符对应的字节码 */ private static int toByte(char c) { byte b = (byte) "0123456789ABCDEF".indexOf(c); return b; } /** * @构造函数 */ public DESUtil() { // TODO Auto-generated constructor stub } /** * @函数名称:main
* @创建日期:2016年9月21日
* @功能说明:
* @参数说明:
* @返回说明:void */ public static void main(String[] args) { // TODO Auto-generated method stub try { System.out.println("-----------------------------"); String bStr = "123"; String key = "SZAOA589"; String binSing = encrypt(bStr, key); System.out.println("加密前:"+bStr); System.out.println("加密后:"+binSing); System.out.println("解密后:"+decrypt(binSing, key)); System.out.println("-------------------------"); } catch (Exception e) { // TODO Auto-generated catch bloc e.printStackTrace(); } //3B976A2A2919A60B57DFF3518F65E1FF //3B976A2A2919A60B57DFF3518F65E1FF /* * C4A737D04D0D05E2 BD2DD4FC5050EBD0 */ } } //================================ package com.cn.peitest; import java.security.MessageDigest; public class MD5 { // 生成MD5(截取16位长度) public static String sign(String message) { String md5 = ""; try { MessageDigest md = MessageDigest.getInstance("MD5"); // 创建一个md5算法对象 byte[] messageByte = message.getBytes("UTF-8"); byte[] md5Byte = md.digest(messageByte); // 获得MD5字节数组,16*8=128位 md5 = bytesToHex(md5Byte).substring(0, 16); // 转换为16进制字符串 } catch (Exception e) { e.printStackTrace(); } return md5; } // 二进制转十六进制 public static String bytesToHex(byte[] bytes) { StringBuffer hexStr = new StringBuffer(); int num; for (int i = 0; i

以上就是java 实现DES 加密解密的示例代码的详细内容,更多关于java des加密解密的资料请关注其它相关文章!


推荐阅读
  • 本文详细介绍了Java编程语言中的核心概念和常见面试问题,包括集合类、数据结构、线程处理、Java虚拟机(JVM)、HTTP协议以及Git操作等方面的内容。通过深入分析每个主题,帮助读者更好地理解Java的关键特性和最佳实践。 ... [详细]
  • 探讨一个显示数字的故障计算器,它支持两种操作:将当前数字乘以2或减去1。本文将详细介绍如何用最少的操作次数将初始值X转换为目标值Y。 ... [详细]
  • 优化ListView性能
    本文深入探讨了如何通过多种技术手段优化ListView的性能,包括视图复用、ViewHolder模式、分批加载数据、图片优化及内存管理等。这些方法能够显著提升应用的响应速度和用户体验。 ... [详细]
  • Android LED 数字字体的应用与实现
    本文介绍了一种适用于 Android 应用的 LED 数字字体(digital font),并详细描述了其在 UI 设计中的应用场景及其实现方法。这种字体常用于视频、广告倒计时等场景,能够增强视觉效果。 ... [详细]
  • RecyclerView初步学习(一)
    RecyclerView初步学习(一)ReCyclerView提供了一种插件式的编程模式,除了提供ViewHolder缓存模式,还可以自定义动画,分割符,布局样式,相比于传统的ListVi ... [详细]
  • 从零开始构建完整手机站:Vue CLI 3 实战指南(第一部分)
    本系列教程将引导您使用 Vue CLI 3 构建一个功能齐全的移动应用。我们将深入探讨项目中涉及的每一个知识点,并确保这些内容与实际工作中的需求紧密结合。 ... [详细]
  • 本文详细介绍了 Java 中 org.apache.xmlbeans.SchemaType 类的 getBaseEnumType() 方法,提供了多个代码示例,并解释了其在不同场景下的使用方法。 ... [详细]
  • libsodium 1.0.15 发布:引入重大不兼容更新
    最新发布的 libsodium 1.0.15 版本带来了若干不兼容的变更,其中包括默认密码散列算法的更改和其他重要调整。 ... [详细]
  • 非公版RTX 3080显卡的革新与亮点
    本文深入探讨了图形显卡的进化历程,重点介绍了非公版RTX 3080显卡的技术特点和创新设计。 ... [详细]
  • 深入理解OAuth认证机制
    本文介绍了OAuth认证协议的核心概念及其工作原理。OAuth是一种开放标准,旨在为第三方应用提供安全的用户资源访问授权,同时确保用户的账户信息(如用户名和密码)不会暴露给第三方。 ... [详细]
  • 本文基于对相关论文和开源代码的研究,详细介绍了LOAM(激光雷达里程计与建图)的工作原理,并对其关键技术进行了分析。 ... [详细]
  • 本文详细探讨了KMP算法中next数组的构建及其应用,重点分析了未改良和改良后的next数组在字符串匹配中的作用。通过具体实例和代码实现,帮助读者更好地理解KMP算法的核心原理。 ... [详细]
  • 深入解析Android自定义View面试题
    本文探讨了Android Launcher开发中自定义View的重要性,并通过一道经典的面试题,帮助开发者更好地理解自定义View的实现细节。文章不仅涵盖了基础知识,还提供了实际操作建议。 ... [详细]
  • Søren Kierkegaard famously stated that life can only be understood in retrospect but must be lived moving forward. This perspective delves into the intricate relationship between our lived experiences and our reflections on them. ... [详细]
  • 计算机网络复习:第五章 网络层控制平面
    本文探讨了网络层的控制平面,包括转发和路由选择的基本原理。转发在数据平面上实现,通过配置路由器中的转发表完成;而路由选择则在控制平面上进行,涉及路由器中路由表的配置与更新。此外,文章还介绍了ICMP协议、两种控制平面的实现方法、路由选择算法及其分类等内容。 ... [详细]
author-avatar
Dr-xuan_484
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有