DESede对称加密算法工具类

利用Cipher的核心功能,自己封装了一个加密解密的工具类,可以直接使用。在使用之前需要先下载commons-codec-1.9.jar,并导入项目。

工具类如下:

package com.pcict.util.test;

import org.apache.commons.codec.binary.Base64;

import javax.crypto.*;
import javax.crypto.spec.DESedeKeySpec;
import java.nio.charset.Charset;
import java.security.InvalidKeyException;
import java.security.Key;
import java.security.NoSuchAlgorithmException;
import java.security.SecureRandom;
import java.security.spec.InvalidKeySpecException;
import java.util.Arrays;

/**
 * DESede对称加密算法
 *
 * @Description
 * @author ljz
 * @created 2015年7月31日 上午11:30:04
 * @version
 * @history
 * @see
 */
public class DESedeUtils {

    // 加密模式
    public static final int ENCRYPT_MODE = Cipher.ENCRYPT_MODE;
    // 解密模式
    public static final int DECRYPT_MODE = Cipher.DECRYPT_MODE;

    private static final String ALGORITHM = "DESede";
    private static final Charset UTF8 = Charset.forName("UTF-8");

    private Cipher cipher = null;
    private int opmode = 0;

    // 初始化加密或解密
    public synchronized boolean init(int mode, String key) {
        if (opmode != 0) {
            return true;
        }

        if (mode != ENCRYPT_MODE && mode != DECRYPT_MODE) {
            return false;
        }

        if (key == null || key.isEmpty()) {
            return false;
        }

        try {
            cipher = Cipher.getInstance(ALGORITHM);
        } catch (NoSuchAlgorithmException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        } catch (NoSuchPaddingException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        } finally {
            if (cipher == null) {
                return false;
            }
        }
        Key secKey = getSecKey(key);
        if (secKey == null) {
            return false;
        }
        try {
            cipher.init(mode, secKey, new SecureRandom());
        } catch (InvalidKeyException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
            return false;
        }
        opmode = mode;
        return true;
    }

    private static Key getSecKey(String key) {
        SecretKey securekey = null;
        try {
            byte[] material = Arrays.copyOf(
                    Base64.decodeBase64(key.getBytes(UTF8)), 24);
            DESedeKeySpec keySpec = new DESedeKeySpec(material);
            SecretKeyFactory keyFactory = SecretKeyFactory
                    .getInstance(ALGORITHM);
            securekey = keyFactory.generateSecret(keySpec);
        } catch (InvalidKeyException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        } catch (NoSuchAlgorithmException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        } catch (InvalidKeySpecException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }
        return securekey;
    }

    // 加密
    public synchronized String encrypt(String data) {
        if (opmode != ENCRYPT_MODE) {
            return null;
        }
        if (data == null) {
            return null;
        }
        byte[] encData = null;
        try {
            encData = cipher.doFinal(data.getBytes(UTF8));
        } catch (IllegalBlockSizeException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        } catch (BadPaddingException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }
        if (encData == null) {
            return null;
        }
        return new String(Base64.encodeBase64(encData), UTF8);
    }

    // 解密
    public synchronized String decrypt(String data) {
        if (opmode != DECRYPT_MODE) {
            return null;
        }
        if (data == null) {
            return null;
        }
        byte[] decData = null;
        try {
            decData = cipher.doFinal(Base64.decodeBase64(data.getBytes(UTF8)));
        } catch (IllegalBlockSizeException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        } catch (BadPaddingException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }
        if (decData == null) {
            return null;
        }
        return new String(decData, UTF8);
    }

}

测试如下:

package com.pcict.util.test;

public class Test {
    public static void main(String[] args) {
        DESedeUtils encoder = new DESedeUtils();
        String key = "123456";
        // 以123456作为加密的密匙,在后面解密的时候也要以该密匙作为解密的密匙
        encoder.init(DESedeUtils.ENCRYPT_MODE, key);
        String str = encoder.encrypt("1");
        System.out.println(str);
        DESedeUtils decoder = new DESedeUtils();
        // 调用初始化解密
        decoder.init(DESedeUtils.DECRYPT_MODE, key);
        String str1 = decoder.decrypt(str);
        System.out.println(str1);
    }
}
时间: 2024-10-26 17:23:19

DESede对称加密算法工具类的相关文章

JAVA的RSA加密算法工具类

需要用到一个jar http://www.bouncycastle.org/latest_releases.html 需要注意的问题 JS用同一秘钥生成的密文用java解密出来是逆序的,即js加密123456用java解密出来是654321,原因未知,需要解密js加密的密文请使用后缀为byJs的方法. HexUtil.java > 1]; // two characters form the hex value. for (int i = 0, j = 0; j >> 4]; out[j

android----Java DES加密算法工具类

1 package entity; 2 3 import javax.crypto.Cipher; 4 import javax.crypto.SecretKey; 5 import javax.crypto.SecretKeyFactory; 6 import javax.crypto.spec.DESKeySpec; 7 import javax.crypto.spec.IvParameterSpec; 8 9 public class Des { 10 private byte[] des

对称加密算法-DES以及DESede算法

一.简述 对称加密算法就是能将数据加解密.加密的时候用密钥对数据进行加密,解密的时候使用同样的密钥对数据进行解密. DES是美国国家标准研究所提出的算法.因为加解密的数据安全性和密钥长度成正比.des的56位的密钥已经形成安全隐患,在1998年之后就很少被采用.但是一些老旧的系统还在使用.因为这个des算法并没有被美国标准委员会公布全部算法,大家一致怀疑被留了后门.所以慢慢就被淘汰掉了. 后来针对des算法进行了改进,有了三重des算法(DESede).针对des算法的密钥长度较短以及迭代次数偏

对称加密算法:DES加密和DESede加密和AES和PBE

对称加密算法是说加密方和解密方使用相同的密钥.常见的对称加密算法包括4个,DES,DESede(3DES),AES,PBE. 本文讨论的内容是加密算法,不是Message Digest,不是编码.下面区分一下这三个概念. 加密算法是一对一映射,明文密文一一对应.加密是不明确的,是隐晦的. 信息摘要是一个密文对应多个明文,它只是明文整体的一个指纹,一个反映,一个摘要. 编码是一对一映射,是明确的,是显然易见的,比如base64编码. DES(Data Encryption Standard)名叫数

php实现对称加密算法DESede

不清楚DES算法的可以看维基百科 <?php class DESede{ /** * 加密 * @param $data 待加密明文 * @param $key DES私钥 * @param $use3des 是否启用3DES加密,默认不启用 */ function encrypt($data='', $key='', $use3des = False) { if (empty($data) || empty($key)) { return False; } $cipher = $use3des

C#对称加密算法实现及相关类说明

采用单钥密码系统的加密方法,同一个密钥可以同时用作信息的加密和解密,这种加密方法称为对称加密,也称为单密钥加密. 需要对加密和解密使用相同密钥的加密算法.由于其速度快,对称性加密通常在消息发送方需要加密大量数据时使用. 所谓对称,就是采用这种加密方法的双方使用方式用同样的密钥进行加密和解密. 密钥是控制加密及解密过程的指令.算法是一组规则,规定如何进行加密和解密. 因此加密的安全性不仅取决于加密算法本身,密钥管理的安全性更是重要. 因为加密和解密都使用同一个密钥,如何把密钥安全地传递到解密者手上

数字签名、数字证书、对称加密算法、非对称加密算法、单向加密(散列算法)

数字签名是什么? 1. 鲍勃有两把钥匙,一把是公钥,另一把是私钥. 2. 鲍勃把公钥送给他的朋友们----帕蒂.道格.苏珊----每人一把. 3. 苏珊给鲍勃写信,写完后用鲍勃的公钥加密,达到保密的效果. 4. 鲍勃收信后,用私钥解密,看到信件内容. 5. 鲍勃给苏珊回信,写完后用Hash函数,生成信件的摘要(digest). 6. 然后,鲍勃使用私钥,对这个摘要加密,生成"数字签名"(signature). 7. 鲍勃将这个签名,附在信件下面,一起发给苏珊. 8. 苏珊收信后,取下数

Java 关于密码处理的工具类[MD5编码][AES加密/解密]

项目中又遇到了加密问题,又去翻了半天,然后做测试,干脆就把常用的两类小结一下. 1.第一种所谓的MD5加密 其实也不算加密,只是基于Hash算法的不可逆编码而已,等于说,一旦经过MD5处理,是不可能从编码后的字符串反推回去的. MD5的方法是基于散列的.本身信息不全.理论上是不能还原成唯一字符串的. 网上所谓的解密,也只是拥有一个足够大的字典映射,将编码前的源字符和编码后的目标字符关联起来而已,大多数常见的还行,复杂点的估计就会话费很长时间,有兴趣的可以试试. 至于MD5的用法,在初次录入的时候

常用加密算法的Java实现总结(二) ——对称加密算法DES、3DES和AES

常用加密算法的Java实现总结(二) ——对称加密算法DES.3DES和AES 日期:2014/7/6 文:阿蜜果 1.对称加密算法 1.1 定义 对称加密算法是应用较早的加密算法,技术成熟.在对称加密算法中,数据发信方将明文(原始数据)和加密密钥(mi yue)一起经过特殊加密算法处理后,使其变成复杂的加密密文发送出去.收信方收到密文后,若想解读原文,则需要使用加密用过的密钥及相同算法的逆算法对密文进行解密,才能使其恢复成可读明文.在对称加密算法中,使用的密钥只有一个,发收信双方都使用这个密钥