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);
}
}
附commons-codec-1.9.jar文件:点击下载
DESede对称加密算法工具类的更多相关文章
- android----Java DES加密算法工具类
DESUtil类 public class DESUtil { private static byte[] iv = {0x12, 0x34, 0x56, 0x78, (byte) 0x90, (by ...
- JAVA的RSA加密算法工具类
须要用到一个jar http://www.bouncycastle.org/latest_releases.html 须要注意的问题 JS用同一秘钥生成的密文用java解密出来是逆序的,即js加密12 ...
- SHA加密算法工具类
1.利用Apache的工具类实现加密: maven: <dependency> <groupId>commons-codec</groupId> <artif ...
- MD5加密算法工具类
import java.math.BigInteger; import java.security.MessageDigest; import java.security.NoSuchAlgorith ...
- Java AES加密算法工具类
AESCodec.java package util; import java.security.Key; import javax.crypto.Cipher; import javax.crypt ...
- Java MD5加密算法工具类
MD5.java package util; import java.security.MessageDigest; import java.security.NoSuchAlgorithmExcep ...
- 对称加密算法-DES以及DESede算法
一.简述 对称加密算法就是能将数据加解密.加密的时候用密钥对数据进行加密,解密的时候使用同样的密钥对数据进行解密. DES是美国国家标准研究所提出的算法.因为加解密的数据安全性和密钥长度成正比.des ...
- AES算法工具类
什么是对称加密算法? AES已经变成目前对称加密中最流行算法之一:AES可以使用128.192.和256位密钥,并且用128位分组加密和解密数据. 对称加密算法安全吗? 看过间谍局的知友们一定知道电台 ...
- RSA和AES工具类
AESUtil import com.xxx.common.BssException; import com.xxx.common.constants.CommonConstants; import ...
随机推荐
- Vue 2.0 生命周期-钩子函数理解
Vue 2.0 + 生命周期钩子在项目过程中经常用到,所以闲下来整理了下,直接复制下面的实例运行: <!DOCTYPE html> <html lang="en" ...
- 如何将json拼接在url后面当做地址栏参数?
function param(data) { let url = '' for (var k in data) { let value = data[k] !== undefined ? data[k ...
- div随意拖动,基于jquery。
$("#box").mousedown(function (e) { //e鼠标事件 var offset = $(this).position();//DIV在页面的位置 使用p ...
- Java篇:IO流
流(IO) 四个基本流: InputStream(输入字节流).OutputStream(输出字节流).writer(输出字符流).reader(输入字符流)-四个基本流都是抽象类不能实例化,固只能用 ...
- css div图片上下左右居中
<style type="text/css"> div{border:1px solid #ccc;height:500pc;width:500px;text-alig ...
- HDU 6280 From Tree to Graph(2018 湘潭邀请 E题,树的返祖边)
其实打返祖边就相当于$x$到祖先这一段点(不包括两端)答案都要减$1$. 然后每个点最多减$1$次$1$. #include <bits/stdc++.h> using namespace ...
- 洛谷P2224 [HNOI2001] 产品加工 [DP补完计划,背包]
题目传送门 产品加工 题目描述 某加工厂有A.B两台机器,来加工的产品可以由其中任何一台机器完成,或者两台机器共同完成.由于受到机器性能和产品特性的限制,不同的机器加工同一产品所需的时间会不同,若同时 ...
- AndroidManifest.xml文件详解(uses-feature)
http://blog.csdn.net/think_soft/article/details/7596796 语法(SYNTAX): <uses-featureandroid:name=&qu ...
- 最简单的Web Service实现
概述 这里提供一个最简单的Web Service的实现,基于JAX-WS.除了jdk不需要任何其他jar包,使用Eclipse提供的Web Services Explorer访问服务. 服务端的实现 ...
- Bzoj 2286 & Luogu P2495 消耗战(LCA+虚树+欧拉序)
题面 洛谷 Bzoj 题解 很容易想到$O(nk)$的树形$dp$吧,设$f[i]$表示处理完这$i$颗子树的最小花费,同时再设一个$mi[i]$表示$i$到根节点$1$路径上的距离最小值.于是有: ...