`
laozhou
  • 浏览: 37777 次
  • 性别: Icon_minigender_1
  • 来自: 深圳
社区版块
存档分类
最新评论

DES可逆加密算法

阅读更多
/** 
 *@Company: 
 *@Copyright:
 *
 */   
package com.lcudp.util;   

import java.security.Key;
import java.security.Security;

import javax.crypto.Cipher;
  
  
/**   
 *@Title:   DES可逆加密算法:
 *@Description:   
 *@Author:zhoupk
 *@Create:Jan 27, 2011 3:02:18 PM   
 *@Version:1.1   
 */
public class DESPlus {
	private static String strDefaultKey = "szlcsoft";
    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:wangchongan@gmail.com">WangChongAn</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 DESPlus() throws Exception {
        this(strDefaultKey);
    }

    /**
     * 指定密钥构造方法
     * 
     * @param strKey
     *            指定的密钥
     * @throws Exception
     */
    public DESPlus(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; 
    } 
    public static void main(String[] args) throws Exception { 
    	//使用默认的密钥 aec504733cfb4112
    	DESPlus desPlus = new DESPlus(); 
    	String e = desPlus.encrypt("laozhou"); 
    	System.out.println(e); 
    	String d = desPlus.decrypt(e); 
    	System.out.println(d); 
    	//使用新密钥 
    	DESPlus desPlus2 = new DESPlus("wangchongan");
    	String e2 = desPlus2.encrypt("13588888888"); 
    	System.out.println(e2);
    	String d2 = desPlus2.decrypt(e2); System.out.println(d2); 
    	
    }

}

分享到:
评论

相关推荐

    C#可逆加密算法收集

    本文将深入探讨C#语言中实现的可逆加密算法,特别聚焦于Rijndael算法的运用,这一算法是AES(Advanced Encryption Standard)标准的核心,被广泛用于数据保护、网络安全以及各种保密通信场景。 ### C#中的Rijndael...

    c# 可逆 加密 解密算法

    该命名空间包含了多种加密算法的实现,如`DES`、`3DES`、`AES`等。 #### 三、C#可逆加密解密算法实现 在给定的代码示例中,我们看到一个名为`DeEncode`的类,其中实现了数据的加密与解密功能。 ##### 3.1 类结构 -...

    现代密码学~DES加密算法实验报告.doc

    DES 加密算法是一种分组加密算法,对一定大小的明文或密文来做加密或解密动作。DES 加密算法的实现实验目的理解对称加密算法的原理和特点。实验原理 DES 是一种分组加密算法,每次加密或解密的分组大小均为 64 位,...

    DES加密算法—实现(C语言)

    DES(Data Encryption Standard)是一种经典的对称加密算法,由IBM在1970年代初开发,1977年被美国国家标准局(NIST)采纳为标准。它使用64位的数据块和56位的密钥进行加密,是早期广泛应用于保护数据安全的技术。在...

    C编写三层DES的加密算法.rar

    DES(Data Encryption Standard)是一种广泛使用的对称加密算法,它基于Feistel网络结构,具有768位的密钥和64位的数据块。在本压缩包中,"C编写三层DES的加密算法.rar" 提供了使用C语言实现DES、DESX和DES3的代码,...

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

    在Java中,最常见的可逆加密算法包括DES(Data Encryption Standard)、3DES(Triple DES)、AES(Advanced Encryption Standard)等。这些算法都是对称加密算法,因为加密和解密使用的是同一把密钥。我们重点关注的...

    C编写三层DES的加密算法

    DES(Data Encryption Standard)是一种广泛使用的对称加密算法,它基于Feistel结构,通过一系列复杂的数学运算对数据进行加密和解密。在C语言中实现三层DES加密算法,意味着我们将执行三次DES加密过程,以增强数据...

    MD5 RAS DES 加密算法详解

    ### MD5 RAS DES 加密算法详解 #### MD5算法:信息安全的守护者 MD5,全称为Message-Digest Algorithm 5,是由MIT的计算机科学实验室与RSA Data Security Inc.共同研发的一种散列函数,其设计目的是为了保障信息的...

    常用MD5加密算法和3-DES加密算法java实现

    ### 常用MD5加密算法和3-DES加密算法Java实现 在现代软件开发过程中,数据的安全性变得越来越重要。对于数据传输和存储过程中的安全性保障,加密技术发挥着至关重要的作用。本文将详细介绍如何在Java环境中实现两种...

    现代密码学-DES加密算法实验报告.doc

    实验结果表明,DES 加密算法能够正确地加密和解密数据,证明了 DES 加密算法的有效性。 现代密码学是研究秘密通信的原理和破译秘密信息的方法的一门学科。DES 加密算法是一种常用的对称加密算法,能够正确地加密和...

    des加密算法ppt

    DES(Data Encryption Standard)是一种对称加密算法,由IBM在1970年代开发,它使用单一密钥对数据进行加解密。DES的核心特点是它的64位密钥,其中包含8位奇偶校验位,实际上有效密钥长度为56位。这种算法将64位的...

    C SHARP常用加密算法汇总.docx

    首先,我们来看不可逆加密算法,这是用于验证数据完整性和身份认证的常见方法。SHA1和MD5是两种广泛使用的哈希函数。SHA1(Secure Hash Algorithm 1)和MD5(Message-Digest Algorithm 5)都会将任意长度的数据转化...

    PHP可逆字符串加密算法.zip

    2. **加密算法**:常见的加密算法有AES(高级加密标准)、DES(数据加密标准)、RSA(公钥加密算法)等。在这个案例中,未明确指出具体使用哪种算法,但考虑到是“可逆”的,很可能使用的是对称加密算法,如AES,...

    3个著名加密算法(MD5、RSA、DES)的解析

    ### 3个著名加密算法(MD5、RSA、DES)的解析 #### 一、MD5算法 **MD5** 的全称是 **Message-Digest Algorithm 5**,这是一种广泛使用的散列函数,用于生成固定长度(128位)的摘要。MD5算法最初是由MIT的计算机科学...

    定长DES加密算法,使用3Des加密方式.将密码混入再一次加密

    DES(Data Encryption Standard)是一种经典的对称加密算法,1976年由美国国家标准局发布,广泛应用于数据安全领域。在本场景中,我们讨论的是一个变种——3DES(Triple DES),它增强了DES的安全性。 3DES是DES的...

    DESencrypt.rar_des_desencrypt_加密算法

    DES(Data Encryption Standard)作为一种经典的对称加密算法,长期以来一直被用在各种需要数据保密的场合中。尤其在信息安全领域,DES算法为计算机科学学生和专业人士提供了一个理解加密过程和实现基础的良好平台。...

    PHP mcrypt可逆加密算法分析

    首先,`mcrypt`扩展提供了一系列加密算法,包括但不限于DES、3DES、AES等,这些算法支持可逆加密,即加密后的数据能够通过正确的密钥恢复到原始状态。在网络安全领域,可逆加密通常用于保护那些在传输过程中需要保持...

    C#加密算法汇总

    在IT领域,特别是软件开发与信息安全中,加密技术...无论是SHA1、MD5这样的散列算法,还是像DES这样的可逆加密算法,都能够在C#中找到相应的实现方式。理解并正确使用这些加密算法对于构建安全可靠的应用程序至关重要。

    c#可逆加密

    常见的对称加密算法有DES(Data Encryption Standard)、3DES(Triple DES)、AES(Advanced Encryption Standard)等。C#中,可以使用`System.Security.Cryptography`命名空间下的类来实现这些算法,如`Aes`类用于...

    C#加密解密源码,有不可逆加密和可逆加密,可逆加密,MD5不可逆加密等几种方法

    在C#中实现加密通常涉及到多种不同的加密算法和技术,包括但不限于可逆加密(如DES、AES)和不可逆加密(如MD5、SHA1)。这些加密方法各有特点和适用场景。 ### 不可逆加密——MD5 **MD5**(Message-Digest ...

Global site tag (gtag.js) - Google Analytics