import java.security.SecureRandom;
import javax.crypto.Cipher;
import javax.crypto.SecretKey;
import javax.crypto.SecretKeyFactory;
import javax.crypto.spec.DESKeySpec;
//结果与DES算法工具一致
public class DES{
public static void main(String[] args) {
String key = "F2C04AD9F598EE61C424C9C7D39BA75F";
String data = "06321643FF8B67EB";
String des = encryptECB3Des(key,data);
System.out.println(des);
} public static String encryptECB3Des(String key, String src) {
System.out.println("encryptECB3Des->" + "key:" + key);
System.out.println("encryptECB3Des->" + "src:" + src);
int len = key.length();
if (key == null || src == null) {
return null;
}
if (src.length() % 16 != 0) {
return null;
}
if (len == 32) {
String outData = "";
String str = "";
for (int i = 0; i < src.length() / 16; i++) {
str = src.substring(i * 16, (i + 1) * 16);
outData += encECB3Des(key, str);
}
return outData;
}
return null;
} public static String encECB3Des(String key, String src) {
byte[] temp = null;
byte[] temp1 = null;
temp1 = encryptDes(hexStringToBytes(key.substring(0, 16)), hexStringToBytes(src));
temp = decryptDes(hexStringToBytes(key.substring(16, 32)), temp1);
temp1 = encryptDes(hexStringToBytes(key.substring(0, 16)), temp);
return bytesToHexString(temp1);
} public static String decECB3Des(String key, String src) {
byte[] temp2 = decryptDes(hexStringToBytes(key.substring(0, 16)), hexStringToBytes(src));
byte[] temp1 = encryptDes(hexStringToBytes(key.substring(16, 32)), temp2);
byte[] dest = decryptDes(hexStringToBytes(key.substring(0, 16)), temp1);
return bytesToHexString(dest);
} public static String bytesToHexString(byte[] src) {
StringBuilder stringBuilder = new StringBuilder("");
if (src == null || src.length <= 0) {
return null;
}
for (int i = 0; i < src.length; i++) {
int v = src[i] & 0xFF;
String hv = Integer.toHexString(v);
if (hv.length() < 2) {
stringBuilder.append(0);
}
stringBuilder.append(hv);
}
return stringBuilder.toString();
} public static byte[] hexStringToBytes(String hexString) {
if (hexString == null || hexString.equals("")) {
return null;
}
hexString = hexString.toUpperCase();
int length = hexString.length() / 2;
char[] hexChars = hexString.toCharArray();
byte[] d = new byte[length];
for (int i = 0; i < length; i++) {
int pos = i * 2;
d[i] = (byte) (charToByte(hexChars[pos]) << 4 | charToByte(hexChars[pos + 1]));
}
return d;
}
private static byte charToByte(char c) {
return (byte) "0123456789ABCDEF".indexOf(c);
} /**
* 3DES(双倍长) 解密
*
* @param keybyte
* @param src
* @return
*/
public static String decryptECB3Des(String key, String src) {
if (key == null || src == null) {
return null;
}
if (src.length() % 16 != 0) {
return null;
}
if (key.length() == 32) {
String outData = "";
String str = "";
for (int i = 0; i < src.length() / 16; i++) {
str = src.substring(i * 16, (i + 1) * 16);
outData += decECB3Des(key, str);
}
return outData;
}
return null;
} /**
* DES加密
*
*/
public static byte[] encryptDes(byte[] key, byte[] src) {
try {
// 创建一个DESKeySpec对象
DESKeySpec desKey = new DESKeySpec(key);
// 创建一个密匙工厂
SecretKeyFactory keyFactory = SecretKeyFactory.getInstance("DES");
// 将DESKeySpec对象转换成SecretKey对象
SecretKey secretKey = keyFactory.generateSecret(desKey);
// Cipher对象实际完成解密操作
Cipher cipher = Cipher.getInstance("DES/ECB/NoPadding");
// 用密匙初始化Cipher对象
cipher.init(Cipher.ENCRYPT_MODE, secretKey);
// 现在,获取数据并加密
// 正式执行加密操作
return cipher.doFinal(src);
} catch (Exception e) {
e.printStackTrace();
}
return null;
} /**
* des解密
*
* @param key
* @param src
* @return
*/
public static byte[] decryptDes(byte[] key, byte[] src) {
try {
// DES算法要求有一个可信任的随机数源
SecureRandom random = new SecureRandom();
// 创建一个DESKeySpec对象
DESKeySpec desKey = new DESKeySpec(key);
// 创建一个密匙工厂
SecretKeyFactory keyFactory = SecretKeyFactory.getInstance("DES");
// 将DESKeySpec对象转换成SecretKey对象
SecretKey secretKey = keyFactory.generateSecret(desKey);
// Cipher对象实际完成解密操作
Cipher cipher = Cipher.getInstance("DES/ECB/NoPadding");
// 用密匙初始化Cipher对象
cipher.init(Cipher.DECRYPT_MODE, secretKey, random);
// 现在,获取数据并加密
// 正式执行加密操作
return cipher.doFinal(src);
} catch (Exception e) {
e.printStackTrace();
}
return null;
}
}

3DES双倍长加密的更多相关文章

  1. 与POS机通信时的3DES(双倍长)加密解密

    项目中有个SocketServer要和移动便携POS机通信,POS开发商就告诉我们他们用的3DES(双倍长)加密,给了个Key.数据和结果,让我们实现. c#用TripleDESCryptoServi ...

  2. Delphi编写的等长加密与解密

    最近在看一本关于网络游戏服务端开发的书,虽然该书是个空架子,里面没有多少实际的内容(此书评价不好),但其中关于等长加密与解密的代码还是有一定的借鉴作用的.他山之石,可以攻玉.因为书中是C++的代码,所 ...

  3. DES、3DES、AES加密方式

    详见:http://blog.yemou.net/article/query/info/tytfjhfascvhzxcyt165 DES 支持8位加密解密,3Des支持24位,Aes支持32位.3De ...

  4. iOS 3DES DES AES加密注意事项!!很重要,否则会加密失败

    今天做项目,需要进行3des加密. 加密的gkey:abcdefgh   giv:(偏移量)abcdefgh 加密后结果:p+X985x5bFS6dWjAnm6sdQ== 下面是代码: +(NSStr ...

  5. 使用3DES+Base64来加密传输iOS应用数据

    本文转载至 http://www.erblah.com/post/objective-c/shi-yong-3des-base64lai-jia-mi-chuan-shu-iosying-yong-s ...

  6. PBOC圈存时用到3DES加密解密以及MAC计算方法

    最近在做PBOC圈存时用到了3DES的加密解密以及MAC计算问题,在网上了解一些知识,复制了一些demo学习,我这里没有深入研究,只是把我用到的和了解的做个总结,便于以后使用和学习. 3DES分双倍长 ...

  7. java 3des加密问题记录

    3des加密有不同的加密模式和填充模式,这个网上很多不多说了,只要保证加解密的时候加密模式和填充模式保持一致就可以了 首先对于密钥的生成,java中有2种方式: 1.第一种,采用ECB模式和不填充模式 ...

  8. 3DES加密

    本文介绍了3DES加密特性,加密特点,3DES是对称加密,用一个密钥对内容进行加密,必须使用相同的密钥进行解密, 密钥必须配置,而且长度为24位,不足24位,用0位进行补全,本文也顺带介绍了其它加密算 ...

  9. C# 3Des加密解密

      第三方的加密规则约定:加密经过3DES加密后的Base64 编码 最近在对接一个第三方接口,请求参数和响应参数全采用3des加密规则,由于我是用.NET对接的,而第三方是Java开发的,所以两种程 ...

随机推荐

  1. 双向认证 HTTPS双向认证

    [微信支付]微信小程序支付开发者文档 https://pay.weixin.qq.com/wiki/doc/api/wxa/wxa_api.php?chapter=4_3 HTTPS双向认证使用说明 ...

  2. 图的遍历:DFS和BFS

    图的遍历一般由两者方式:深度优先搜索(DFS),广度优先搜索(BFS),深度优先就是先访问完最深层次的数据元素,而BFS其实就是层次遍历,每一层每一层的遍历. 1.深度优先搜索(DFS) 我一贯习惯有 ...

  3. C++ Primer笔记14_面向对象程序设计

    版权声明:本文为博主原创文章,未经博主同意不得转载. https://blog.csdn.net/scottly1/article/details/31371611 OOP概述 面向对象程序设计(ob ...

  4. mapper文件提示:No data sources are configured to run this sql

    mapper文件发出黄色警告. 输入数据库用户名和密码等等. 自动同步ok 就会发现代码变绿了,ok

  5. 20170411 debug窗口执行文件

    [FUNCTION] Command=/H Title=Debugger Type=SystemCommand

  6. 前端基础之jquery练习

    实例练习 左侧菜单 <!DOCTYPE html> <html lang="en"> <head> <meta charset=" ...

  7. Activity的生命周期整理

    Activity主要的三种状态: Running(运行):在屏幕前台(位于当前任务堆栈的顶部) Paused(暂停):失去焦点但仍然对用户可见(覆盖Activity可能是透明或未完全遮挡) Stopp ...

  8. 防止基本的XSS攻击 滤掉HTML标签

    /** * 防止基本的XSS攻击 滤掉HTML标签 * 将HTML的特殊字符转换为了HTML实体 htmlentities * 将#和%转换为他们对应的实体符号 * 加上了$length参数来限制提交 ...

  9. hadoop02---高可用网站架构

    tomcat每个请求都会占用内存cpu,tomcat没有代理功能.nginx是俄国人写的,nginx是静态资源服务器,既可以自己返回请求,也可以做代理进行转发,和负载均衡.Tomcat是动态资源jav ...

  10. P4501 [ZJOI2018]胖

    题目 P4501 [ZJOI2018]胖 官方口中的送分题 做法 我们通过手玩(脑补),\(a_i\)所作的贡献(能更新的点)为:在\(a_i\)更新\(\forall x\)更新前前没有其他点能把\ ...