`

DESUtil 加密 解密

    博客分类:
  • java
 
阅读更多

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();
        }
    }

}

分享到:
评论

相关推荐

    VB实现DES加密解密算法,vb加密和解密,VBA

    这需要创建一个.NET类库项目,实现DES加密解密功能,然后在VBA中通过CreateObject或早绑定的方式调用这些函数。 以下是VB.NET中实现DES加密解密的简单示例代码: ```vbnet Imports System.IO Imports System....

    给hibernate配置文件加密解密的方案

    Hibernate 配置文件加密解密方案 在本文中,我们将讨论如何在 Hibernate 配置文件中对数据库密码进行加密和解密,以保护数据的安全。该方案通过使用 Java 的 Cipher 类和 DES 对称加密算法来实现加密和解密操作。 ...

    vue DES加密解密工具类 des.js

    vue DES加密解密工具类 des.js,与博文中的匹配,为封装好的完整工具类

    Java调用dll实现des加密解密

    4. **加载DLL和调用方法**: 在Java代码中,使用`System.loadLibrary`加载本地库,然后可以调用`DesUtil.encrypt`和`DesUtil.decrypt`进行DES加密解密。 ```java public class Main { public static void main...

    Java实现的3des加密解密工具类示例

    V3DESUtil工具类提供了一个完整的Java实现的3DES加密解密工具类的示例,通过设置密钥和加密/解密信息,可以对数据进行加密和解密操作。该工具类的使用可以分为以下几个步骤: 1. 导入所需的类库:import org.bouncy...

    DESUtil.zip_DES 加密_DesUtil

    总之,DESUtil 类是一个用于简化 DES 加密和解密操作的工具类,它封装了 DES 算法的关键步骤,使得开发者可以方便地在项目中集成加密解密功能。尽管 DES 在某些场景下仍可使用,但考虑到安全性,建议考虑更新的加密...

    DES加密工具

    DES加密的过程主要分为两个阶段:加密和解密。它基于Feistel结构,将明文分成左半部分L和右半部分R,然后通过一系列迭代的步骤进行加密。每个迭代过程中,都会用到一个64位的密钥,但实际上只有56位参与加密,因为有...

    Java实现用AES+des对文件加密解密Java实现用AES+des对文件加密解密

    总的来说,Java的`javax.crypto`包提供了强大的加密能力,可以轻松实现AES和DES加密解密。在实际应用中,根据项目需求选择合适的加密算法,并确保遵循最佳实践,如使用足够长度的密钥,避免明文存储密钥,以及定期...

    jni des加密解密实现

    在Android开发中,JNI常用于提升性能、调用系统级API或者利用C/C++库来处理特定任务,如加密解密。本话题将探讨如何使用JNI在Android中实现DES(Data Encryption Standard)加密和解密。 DES是一种对称加密算法,它...

    用JAVA实现DES加密解密

    ### 使用JAVA实现DES加密解密的关键知识点 #### 1. DES算法概述 DES(Data Encryption Standard),即数据加密标准,是一种对称密钥算法,由IBM公司开发,并于1977年被美国国家标准局(ANSI)采纳为数据加密标准。...

    Java实现的DES加密解密工具类实例

    "Java实现的DES加密解密工具类实例" 本文主要介绍了Java实现的DES加密解密工具类的定义和使用方法,并通过实例形式对其进行了分析。Java中的DES加密解密工具类是一个非常重要的工具,可以用来对数据进行加密和解密...

    android DES加密解密 javax.crypto.IllegalBlockSizeException: last block incomplete in

    本话题将围绕在Android中使用DES加密和解密时遇到的一个常见问题展开:`javax.crypto.IllegalBlockSizeException: last block incomplete in decryption`。 这个异常通常发生在解密过程中,当输入的数据块大小与DES...

    java 实现 des加解密、mac算法

    它使用64位的密钥对数据进行加密和解密,但实际有效密钥长度只有56位。DES的工作模式包括ECB(Electronic Codebook)、CBC(Cipher Block Chaining)等,其中CBC模式由于其更好的安全性,常在实际应用中使用。 在...

    java中使用DES加密解密实例

    需要注意的是,虽然这段代码给出了一个基本的DES加密解密实现,但在实际应用中,由于DES的安全性问题,通常会使用更强大的算法,如AES(高级加密标准)。此外,硬编码的密钥和初始化向量在生产环境中是不可取的,...

    PHP、Java des加密解密实例

    以下是一个Java DES加密解密的例子: ```java import javax.crypto.Cipher; import javax.crypto.spec.SecretKeySpec; public class DESUtil { private final static String ALGORITHM = "DES"; public static ...

    JAVA可逆带秘钥字符串加密算法

    `DESUtil.java`文件很可能包含一个名为`DESUtil`的类,该类提供了静态方法来进行DES加密和解密操作。类中可能会有如下的方法签名: ```java public static byte[] encrypt(String plainText, byte[] key) throws ...

    C#与JAVA平台通用DES

    1、C#平台上的加密与解密 2、JAVA平台上的加密与解密 3、C#平台上的加密,能在JAVA平台上解密 4、JAVA平台上的加密,能在C#平台上解密 这个工具类,是基于平台的,不调用任何第三方软件,已经运用在实际项目中。

    JAVA实现DES加密

    在提供的`DESUtil.java`文件中,可能包含了实现DES加密和解密功能的类。这个类通常会有以下几个核心方法: 1. **生成密钥**:`generateKey()` 方法,通过`KeyGenerator.getInstance("DES")`获取DES的KeyGenerator...

Global site tag (gtag.js) - Google Analytics