`

DES加解密实例代码

 
阅读更多

运用DES进行密码的加密以及解密

/**
 * DES加密工具
 * @author zhang
 *
 */
public class DesUtil {
    // KeyGenerator 提供对称密钥生成器的功能,支持各种算法  
    private KeyGenerator keygen;  
    // SecretKey 负责保存对称密钥  
    private SecretKey deskey;  
    // Cipher负责完成加密或解密工作  
    private Cipher c;  
    // 该字节数组负责保存加密的结果  
    private byte[] cipherByte;  
      
    @SuppressWarnings("restriction")
    public DesUtil() throws NoSuchAlgorithmException, NoSuchPaddingException{  
        Security.addProvider(new com.sun.crypto.provider.SunJCE());  
        // 实例化支持DES算法的密钥生成器(算法名称命名需按规定,否则抛出异常)  
        keygen = KeyGenerator.getInstance("DES");  
        // 生成密钥  
        deskey = keygen.generateKey();  
        // 生成Cipher对象,指定其支持的DES算法  
        c = Cipher.getInstance("DES");  
    }  
      
    /** 
     * 对字符串加密 
     *  
     * @param str 
     * @return 
     * @throws InvalidKeyException 
     * @throws IllegalBlockSizeException 
     * @throws BadPaddingException 
     */  
    public String Encrytor(String str) throws InvalidKeyException,  
            IllegalBlockSizeException, BadPaddingException {  
        // 根据密钥,对Cipher对象进行初始化,ENCRYPT_MODE表示加密模式  
        c.init(Cipher.ENCRYPT_MODE, deskey);  
        byte[] src = str.getBytes();  
        // 加密,结果保存进cipherByte  
        cipherByte = c.doFinal(src);
        
        return encode(cipherByte);  
    }  
  
    /** 
     * 对字符串解密 
     *  
     * @param buff 
     * @return 
     * @throws InvalidKeyException 
     * @throws IllegalBlockSizeException 
     * @throws BadPaddingException 
     */  
    public String Decryptor(String text) throws InvalidKeyException,  
            IllegalBlockSizeException, BadPaddingException { 
        // 根据密钥,对Cipher对象进行初始化,DECRYPT_MODE表示加密模式  
        c.init(Cipher.DECRYPT_MODE, deskey);
        byte[] buff = decode(text);
        cipherByte = c.doFinal(buff);
        return new String(cipherByte);
    }
    
    private static char[] base64EncodeChars = new char[] { 'A', 'B', 'C', 'D', 'E', 'F', 'G', 'H', 'I', 'J', 'K', 'L',
        'M', 'N', 'O', 'P', 'Q', 'R', 'S', 'T', 'U', 'V', 'W', 'X', 'Y', 'Z', 'a', 'b', 'c', 'd', 'e', 'f', 'g',
        'h', 'i', 'j', 'k', 'l', 'm', 'n', 'o', 'p', 'q', 'r', 's', 't', 'u', 'v', 'w', 'x', 'y', 'z', '0', '1',
        '2', '3', '4', '5', '6', '7', '8', '9', '+', '/' };
    private static byte[] base64DecodeChars = new byte[] { -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1,
            -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1,
            -1, 62, -1, -1, -1, 63, 52, 53, 54, 55, 56, 57, 58, 59, 60, 61, -1, -1, -1, -1, -1, -1, -1, 0, 1, 2, 3, 4,
            5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, -1, -1, -1, -1, -1, -1, 26,
            27, 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, 43, 44, 45, 46, 47, 48, 49, 50, 51, -1, -1,
            -1, -1, -1 };

    /**
     * 编码转换成字符串
     * @param data
     * @return
     */
    public static String encode(byte[] data) {
        StringBuffer sb = new StringBuffer();
        int len = data.length;
        int i = 0;
        int b1, b2, b3;

        while (i < len) {
            b1 = data[i++] & 0xff;
            if (i == len) {
                sb.append(base64EncodeChars[b1 >>> 2]);
                sb.append(base64EncodeChars[(b1 & 0x3) << 4]);
                sb.append("==");
                break;
            }
            b2 = data[i++] & 0xff;
            if (i == len) {
                sb.append(base64EncodeChars[b1 >>> 2]);
                sb.append(base64EncodeChars[((b1 & 0x03) << 4) | ((b2 & 0xf0) >>> 4)]);
                sb.append(base64EncodeChars[(b2 & 0x0f) << 2]);
                sb.append("=");
                break;
            }
            b3 = data[i++] & 0xff;
            sb.append(base64EncodeChars[b1 >>> 2]);
            sb.append(base64EncodeChars[((b1 & 0x03) << 4) | ((b2 & 0xf0) >>> 4)]);
            sb.append(base64EncodeChars[((b2 & 0x0f) << 2) | ((b3 & 0xc0) >>> 6)]);
            sb.append(base64EncodeChars[b3 & 0x3f]);
        }
        return sb.toString();
    }

    /**
     * 字符串转换为字节
     * @param str
     * @return
     */
    public static byte[] decode(String str) {
        byte[] data = str.getBytes();
        int len = data.length;
        ByteArrayOutputStream buf = new ByteArrayOutputStream(len);
        int i = 0;
        int b1, b2, b3, b4;

        while (i < len) {

            
            do {
                b1 = base64DecodeChars[data[i++]];
            } while (i < len && b1 == -1);
            if (b1 == -1) {
                break;
            }

            
            do {
                b2 = base64DecodeChars[data[i++]];
            } while (i < len && b2 == -1);
            if (b2 == -1) {
                break;
            }
            buf.write((int) ((b1 << 2) | ((b2 & 0x30) >>> 4)));

            
            do {
                b3 = data[i++];
                if (b3 == 61) {
                    return buf.toByteArray();
                }
                b3 = base64DecodeChars[b3];
            } while (i < len && b3 == -1);
            if (b3 == -1) {
                break;
            }
            buf.write((int) (((b2 & 0x0f) << 4) | ((b3 & 0x3c) >>> 2)));

            
            do {
                b4 = data[i++];
                if (b4 == 61) {
                    return buf.toByteArray();
                }
                b4 = base64DecodeChars[b4];
            } while (i < len && b4 == -1);
            if (b4 == -1) {
                break;
            }
            buf.write((int) (((b3 & 0x03) << 6) | b4));
        }
        return buf.toByteArray();
    }
   
            	 

这里,运用DES加密,解密返回的本来都是byte[],因为用new String(byte[], "UTF-8")转为字符串之后,再通过String.getBytes()返回的byte[]是不一致的。故需要运用以上的转换方法再次转码。

分享到:
评论

相关推荐

    QT做的DES加解密实例

    在这个“QT做的DES加解密实例”中,我们将深入探讨如何使用QT库来实现DES的加解密功能。 首先,我们需要理解DES的工作原理。DES是一种块加密算法,它将64位的数据块作为输入,并使用56位的密钥进行加密或解密。实际...

    PHP实现的DES加密解密实例代码

    本文介绍的PHP实现DES(Data Encryption Standard,数据加密标准)加密解密实例代码,详细阐述了如何在PHP中使用DES算法进行数据的加密与解密操作。 首先,让我们来了解一下DES算法。DES是一种对称密钥加密算法,即...

    基本DES加解密实例(delphi代码)..rar

    基本DES加解密实例(delphi代码)..rar

    DES加密解密实例网络安全传输系统

    在"DES加密解密实例网络安全传输系统"中,DES算法用于确保在网络上传输的数据不被未授权的第三方获取或篡改。数据在发送端使用DES加密,变为密文,然后通过网络发送到接收端。接收端接收到密文后,使用同样的DES密钥...

    C#实现DES加解密完整类源码

    下面我们将详细讨论C#实现DES加解密的相关知识点。 1. **基本概念**: - **对称加密**:加密和解密使用同一密钥。 - **DES算法**:基于Feistel结构,通过多次迭代实现数据的加密和解密。 - **密钥长度**:DES的...

    C#的3DES加密解密算法实例代码

    这篇文章主要介绍了C#的3DES加密解密算法实例代码,有需要的朋友可以参考一下

    Delphi7与C#实现Des加解密互通Demo,全网找遍只次一份

    总之,这个“Delphi7与C#实现Des加解密互通Demo”项目提供了一个宝贵的实例,让开发者能够了解和掌握如何在两种不同的编程环境下实现相同加密算法的互通,这对于多平台应用开发或者需要在不同系统间交换加密数据的...

    DES加密解密源代码

    在你提供的"DES加密解密源代码"中,我们可以深入探讨以下几个关键知识点: 1. **DES算法原理**:DES使用了Feistel结构,分为初始置换、16轮迭代和逆初始置换三个阶段。每一轮迭代包含分组、扩展、异或、替换四个...

    3des加密解密

    标题 "3DES加密解密" 涉及到的是数据安全领域中的一种...在Java开发中,可以通过Bouncy Castle这样的加密库实现3DES的加解密操作。提供的文件可能包含3DES算法的Java实现代码,可以进一步研究学习其工作原理和应用。

    visual c++ VC实现3DES加解密 加密解密.zip

    本项目是使用Visual C++实现3DES加解密功能的一个实例,下面将详细介绍3DES算法及其在Visual C++中的实现。 3DES,全称为三重DES,是对DES(Data Encryption Standard)的加强版。DES是一种块密码,采用64位的数据...

    DES加密解密实验报告

    在实验中,通常会通过实例演示DES算法如何运作,展示加密和解密的过程,并可能包含运行结果的截图。然而,由于缺少源代码,实验的具体实现细节无法在此提供。通常,DES的实现涉及将算法的各个步骤编程化,可能使用C...

    des加密解密java实现版本

    在`cipher4j-master`这个项目中,可能包含了关于DES加密解密的Java实现,包括完整的类和示例代码,帮助开发者理解和使用DES。你可以下载并研究该项目,进一步了解如何在实际应用中集成DES加密解密功能。

    C# DES 加密解密实例源码 超值!

    C# DES 加密解密是信息安全领域中常用的技术,它基于数据加密标准(DES)算法,为敏感数据提供保护。...这些实例代码可以作为学习和理解DES加密的基础,但为了保障数据安全,建议升级到更现代的加密技术。

    DES加解密源代码

    在提供的"DES加解密源代码"中,我们可以预见到包含以下几个关键部分: 1. **密钥扩展**:DES的56位密钥首先经过初始置换,然后分成左右两半,每半分别进行16轮的Feistel结构操作。每一轮都包括一个子密钥生成过程,...

    C# DES加密解密

    这个类提供了一系列的方法,如`Create()`用于创建一个DES加密实例,`Encrypt()`和`Decrypt()`用于加密和解密数据。 3. **创建DES加密器** 使用`DES.Create()`方法创建一个DES加密器对象。由于默认的DES实现不支持...

    des加解密、互补性和弱密钥验证及代码展示

    1. **DES加解密**:DES加密过程分为16轮迭代,每轮包括一个置换(Permutation)和一个子密钥产生(Substitution)步骤。解密过程与加密类似,只是使用的子密钥顺序相反。在实际编程中,可以使用如Java的`javax....

    android端写的DES加密解密代码对应C#写的加密解密代码。两者加密解密结果完全一致

    C#代码可能使用`DESCryptoServiceProvider`类来实例化DES算法,然后使用`CreateEncryptor`和`CreateDecryptor`方法进行加密和解密。密钥和IV的处理方式与Android类似,都需要适当地管理和传递。 为了确保Android和...

    DES加密解密类

    首先,`DESCoder.java`、`Des.java`和`Coder.java`可能是实现DES加密解密功能的Java源代码文件。`DESCoder`可能是一个包含加密和解密方法的类,`Des`可能是用于执行具体加密操作的核心类,而`Coder.java`可能是一个...

    Des加密解密源码——JAVA版

    `111.doc` 和 `111.txt` 文件可能是用来测试加密和解密功能的样本文件,可以用来检查代码是否能正确地对文本或文档进行加解密。 `readme.txt` 文件通常包含有关资源的说明和使用指南,例如如何编译和运行源码,或者...

Global site tag (gtag.js) - Google Analytics