3DES加密算法32个字节
简介
最近开发的一个项目,使用到了3DES加密算法,加密socket服务端和客户端通信的报文,因为加密秘钥是32个字节,结果折腾了一番,现在记录下来分享!
1、Des3EncryptUtils.java
package des3; import javax.crypto.Cipher;
import javax.crypto.SecretKey;
import javax.crypto.SecretKeyFactory;
import javax.crypto.spec.DESedeKeySpec;
/**
* 3DES加密工具类
* @author QiaoZhenwu
*/
public class Des3EncryptUtils {
/** 密钥 */
private SecretKey securekey;
/**
* 功能:算法中需要通过秘钥的字节数组来得到加密用的key
* @param key 秘钥的字节数组
*/
public void setKey(byte[] key) {
try {
DESedeKeySpec dks = new DESedeKeySpec(key);
SecretKeyFactory keyFactory = SecretKeyFactory.getInstance("DESede");
securekey = keyFactory.generateSecret(dks);
} catch (Exception e) {
System.out.println(e.getMessage());
}
}
/**
* 功能:对明文进行加密
* @param byteS 明文对应的字节数组
* @return 密文对应的字节数组
*/
public byte[] get3DesEncCode(byte[] byteS) {
byte[] byteFina = null;
Cipher cipher;
try {
cipher = Cipher.getInstance("DESede/ECB/NoPadding"); //算法/分组模式/填充模式
cipher.init(Cipher.ENCRYPT_MODE, securekey);
byteFina = cipher.doFinal(byteS);
} catch (Exception e) {
System.out.println(e.getMessage());
} finally {
cipher = null;
}
return byteFina;
}
/**
* 功能:对密文进行解密
* @param byteD 密文对应的字节数组
* @return 明文对应的字节数组
*/
public byte[] get3DesDesCode(byte[] byteD) {
Cipher cipher;
byte[] byteFina = null;
try {
cipher = Cipher.getInstance("DESede/ECB/NoPadding");
cipher.init(Cipher.DECRYPT_MODE, securekey);
byteFina = cipher.doFinal(byteD);
} catch (Exception e) {
System.out.println(e.getMessage());
} finally {
cipher = null;
}
return byteFina;
}
}
2、HexUtils.java
package des3; /**
* 十六进制帮助类
* @author jacky
*/
public class HexUtils {
/** 转换数据 */
private static final char[] HEXDIGITS = { '0', '1', '2', '3', '4', '5', '6', '7', '8', '9', 'A', 'B', 'C', 'D', 'E', 'F' };
/**
* toString(控制长度的将byte[]的转换为相应的十六进制String表示)
*/
public static String toString(byte[] ba, int offset, int length) {
char[] buf = new char[length * 2];
int j = 0;
int k;
for (int i = offset; i < offset + length; i++) {
k = ba[i];
buf[j++] = HEXDIGITS[(k >>> 4) & 0x0F];
buf[j++] = HEXDIGITS[k & 0x0F];
}
return new String(buf);
}
/**
* 功能:将byte[]的转换为相应的十六进制字符串
* @param ba 字节数组
* @return 十六进制字符串
*/
public static String toString(byte[] ba) {
return toString(ba, 0, ba.length);
}
/**
* 功能:将十六进制字符串转换为字节数组
* @param hex 十六进制字符串
* @return 字节数组
*/
public static byte[] fromString(String hex) {
int len = hex.length();
byte[] buf = new byte[(len + 1) / 2];
int i = 0;
int j = 0;
if ((len % 2) == 1) {
buf[j++] = (byte) fromDigit(hex.charAt(i++));
}
while (i < len) {
buf[j++] = (byte) ((fromDigit(hex.charAt(i++)) << 4) | fromDigit(hex.charAt(i++)));
}
return buf;
}
/**
* fromDigit(将十六进制的char转换为十进制的int值)
*/
public static int fromDigit(char ch) {
if (ch >= '0' && ch <= '9') {
return ch - '0';
}
if (ch >= 'A' && ch <= 'F') {
return ch - 'A' + 10;
}
if (ch >= 'a' && ch <= 'f') {
return ch - 'a' + 10;
}
throw new IllegalArgumentException("invalid hex digit '" + ch + "'");
}
}
3、Des3Utils.java
package des3; /**
* 3DES加解密主类,加解密调用内部的方法
* @author QiaoZhenwu
*
*/
public class Des3Utils {
/**
* dec:(解密).
* @param key 密钥
* @param content 密文内容 16位
* @return 返回结果:String
*/
public static String decryption(String key, String content) {
Des3EncryptUtils des = new Des3EncryptUtils();
String enKey = "";//最终解密秘钥 48位
String enContent = "";//解密内容
if(key.length() <= 32){
enKey = (key + key).substring(0, 48);
}else if(key.length() >= 48){
enKey = key.substring(0, 48);
}
if(content.length() == 16){
enContent = content;
}else{
if(content.length() > 16){
throw new RuntimeException("the encrypt content length more than 16");
}else if(content.length() < 16){
throw new RuntimeException("the encrypt content length less than 16");
}
}
des.setKey(enKey.getBytes());
byte[] get3DesDesCode = des.get3DesDesCode(HexUtils.fromString(enContent));
return HexUtils.toString(get3DesDesCode).trim();
} /**
* dec:(加密).
* @param key 密钥
* @param content 明文内容 为16位十六进制字符串
* @return 返回结果:String
*/
public static String encryption(String key, String content) {
Des3EncryptUtils des = new Des3EncryptUtils();
String enKey = "";//最终加密秘钥48位
String enContent = "";//加密内容
if(key.length() <= 32){
enKey = (key + key).substring(0, 48);
}else if(key.length() >= 48){
enKey = key.substring(0, 48);
}
if(content.length() == 16){
enContent = content;
}else{
if(content.length() > 16){
throw new RuntimeException("the encrypt content length more than 16");
}else if(content.length() < 16){
throw new RuntimeException("the encrypt content length less than 16");
}
}
des.setKey(enKey.getBytes());
byte[] bye = des.get3DesEncCode(HexUtils.fromString(enContent));
return HexUtils.toString(bye).trim();
} public static void main(String[] args) {
String str = encryption("12345678123456781234567812345678", "06111111FFFFFFFF");
System.out.println("加密后的密文为====="+str);
}
}
3DES加密算法32个字节的更多相关文章
- DES和3DES加密算法C语言实现【转】
转自:https://blog.csdn.net/leumber/article/details/78043675 版权声明:本文为博主原创文章,未经博主允许不得转载. https://blog.cs ...
- 学习3DES加密算法笔记
3DES(或称为Triple DES)是三重数据加密算法(TDEA,Triple Data Encryption Algorithm)块密码的通称.它相当于是对每个数据块应用三次DES加密算法.由于计 ...
- Java Base64、HMAC、SHA1、MD5、AES DES 3DES加密算法
● BASE64 严格地说,属于编码格式,而非加密算法 ● MD5(Message Digest algorithm 5,信息摘要算法) ● SHA(Secure Hash Algo ...
- python实现AES/DES/RSA/MD5/SM2/SM4/3DES加密算法模板汇总
都是作者累积的,且看其珍惜,大家可以尽量可以保存一下,如果转载请写好出处https://www.cnblogs.com/pythonywy 一.md5加密 1.简介 这是一种使用非常广泛的加密方式,不 ...
- DES & 3DES 加密算法
JAVA坑 跟其他公司java的对接口,一个细节对到吐血,具体: DesUtil.java(别人的反例) //package base_class; import java.io.IOExceptio ...
- 3DES加密算法
在日常设计及开发中,为确保数据传输和数据存储的安全,可通过特定的算法,将数据明文加密成复杂的密文.目前主流加密手段大致可分为单向加密和双向加密. 单向加密:通过对数据进行摘要计算生成密文,密文不可逆推 ...
- python实现DES加密算法和3DES加密算法
pyDes.py ############################################################################# # Documentati ...
- [转] 对称加密算法DES、3DES
转自:http://www.blogjava.net/amigoxie/archive/2014/07/06/415503.html 1.对称加密算法 1.1 定义 对称加密算法是应用较早的加密算法, ...
- 常用加密算法的Java实现总结(二) ——对称加密算法DES、3DES和AES
1.对称加密算法 1.1 定义 对称加密算法是应用较早的加密算法,技术成熟.在对称加密算法中,数据发信方将明文(原始数据)和加密密钥(mi yue)一起经过特殊加密算法处理后,使其变成复杂的加密密文发 ...
随机推荐
- Mingyang.net:Eclipse定义Maven安装
Eclipse默认会使用内置的Maven安装,这样就可能在导致Eclipse编译时下载一次依赖库,用CMD编译时再下载一次依赖库.打开Ecclipse -> Windows -> Pref ...
- 给你出道题:依次去掉离中心最远的M个点
给定一个数组a[N],里面包含N个向量.现在要求进行删点操作,删点原则如下: 1.求出N个向量的中心O1,删除离O1最远的那个点 2.求出N-1个向量的中心O2,删除O2最远的那个点 ...... 重 ...
- 【LeetCode】120. Triangle (3 solutions)
Triangle Given a triangle, find the minimum path sum from top to bottom. Each step you may move to a ...
- xml2-config not found.
在Ubuntu下接着安装php时候,在configure后,又出现错误提示:error: xml2-config not found. Please check your libxml2 instal ...
- 32个Chrome 针对网页设计师和开发人员扩展
http://zmingcx.com/32-chrome-web-designers-and-developers-to-expand.html
- 介绍一款chrom浏览器插件 DHC是一款使用chrome模拟REST客户端向服务器发送测试数据的谷歌浏览器插件
先打个小广告哈 公司招java架构师,月薪25K以上,负责电商平台架构工作,工作地点在北京 1号线永安里站 附近,如有意向 请把简历发我邮箱jia6235@163.com 可以内部推荐. DHC是一款 ...
- 【Linux】忘记root密码
常常有些朋友在配置好了Linux之后,结果root密码给他忘记去!要重新安装吗?不需要的,你只要以单人维护模式登陆即可更改你的root密码!下面以Redhat linux5为例 1)先将系统重新启动, ...
- Python学习笔记015——文件file的常规操作之四(输入重定向)
windows命令提示符(cmd.exe)和Linux Shell(bash等)均可通过">"或”>>“将输出重定向.其中, ">"表示 ...
- go学习 --- Chan (通道)
Golang使用Groutine和channels实现了CSP(Communicating Sequential Processes)模型,channles在goroutine的通信和同步中承担着重要 ...
- 【转】一个对 Dijkstra 的采访视频
一个对 Dijkstra 的采访视频 (也可以访问 YouTube 或者从源地址下载 MPEG1,300M) 之前在微博上推荐了一个对 Dijkstra 的采访视频,看了两遍之后觉得实在很好,所以再正 ...