3des加密有不同的加密模式和填充模式,这个网上很多不多说了,只要保证加解密的时候加密模式和填充模式保持一致就可以了
首先对于密钥的生成,java中有2种方式:
1.第一种,采用ECB模式和不填充模式
//加密
public static byte[] des3EncodeECB(byte[] key, byte[] data)
throws Exception {
Key deskey = null;
SecretKeySpec spec = new SecretKeySpec(key,"desede");
SecretKeyFactory keyfactory = SecretKeyFactory.getInstance("desede");
deskey = keyfactory.generateSecret(spec);
Cipher cipher = Cipher.getInstance("desede" + "/ECB/NoPadding");
cipher.init(Cipher.ENCRYPT_MODE, deskey);
byte[] bOut = cipher.doFinal(data);
return bOut;
}
//解密
public static byte[] des3DecodeECB(byte[] key, byte[] data)
throws Exception {
Key deskey = null;
SecretKeySpec spec = new SecretKeySpec(key,"desede");
SecretKeyFactory keyfactory = SecretKeyFactory.getInstance("DESede");
deskey = keyfactory.generateSecret(spec);
Cipher cipher = Cipher.getInstance("DESede" + "/ECB/NoPadding");
cipher.init(Cipher.DECRYPT_MODE, deskey);
byte[] bOut = cipher.doFinal(data);
return bOut;
}
2.第二种,同样采用ECB模式和不填充模式
//加密
public static byte[] encrypt(byte[] targetToByte, String algorithm,String mode, String key) throws Exception {
Cipher cipher = Cipher.getInstance(algorithm);
cipher.init(Cipher.ENCRYPT_MODE, getKey(key, mode));
byte[] result = cipher.doFinal(targetToByte);
// System.out.println("base64:" +encryptByBase64(result));
return result;
}
//解密
public static byte[] decrypt(byte[] targetToByte, String algorithm,String mode, String key) throws Exception {
Cipher cipher = Cipher.getInstance(algorithm);
cipher.init(Cipher.DECRYPT_MODE, getKey(key, mode));
byte[] result = cipher.doFinal(targetToByte);
// System.out.println("base:" + new String(result,"UTF-8"));
return result;
} public static Key getKey(String key, String algorithm) {
try {
KeyGenerator generator = KeyGenerator.getInstance(algorithm);
//注意此处将key按照16进制数字解析成byte数组,按需要修改,比如key.getBytes()
generator.init(new SecureRandom(HexString2Bytes(key)));
return generator.generateKey(); } catch (Exception e) {
e.printStackTrace();
}
return null;
}

  两种方式的区别,第一种就是使用你给定的key作为密钥,当与其他客户端进行通信,加解密不是由同一方操作的时候推荐使用,第二种是根据你给的key来生成一个新的key,这个新的key才是真正加密时使用的key,所以如果用第一种加密出来的密文用第二种来解密,是解不出来的。

  另外,java中只提供了3倍长3des的算法,也就是key的长度必须是24字节,如果想要使用2倍长3des,需要自己将后8个字节补全(就是将16个字节的前8个字节补到最后,变成24字节)。如果提供的key不足24字节,将会报错,如果超过24字节,将会截取前24字节作为key(坑了我好长时间)
 
3des的加密过程
3DES,分为2种,一个是双倍长3DES,一个是三倍长3DES。
如果是双倍长3DES,密钥为16字节长,按左右,分别LK(密钥的左边8字节),RK(密钥的右边8字节)。加密内容DATA为8字节。
假设单倍长DES加密过程为:DES( data, key, dest ),其中,data为被加密数据,key为加密密钥,dest为加密结果。单倍长DES解密过程为:UDES(data, key, dest ),其中,data为被解密的数据,key为解密密钥,dest为解密结果。
那么,双倍长3DES的加密方法为:
DES( DATA, LK, TMP1 );
UDES( TMP1, RK, TMP2 );
DES( DATA, LK, DEST );
DEST是最终得到的密文。具体过程简述如下:
1)使用密钥的前8字节,对数据DATA进行加密,得到加密的结果TMP1;
2)使用密钥的后8字节,对第一的计算结果TMP1,进行解密,得到解密的结果TMP2;
3)再次使用密钥的前8字节,对第二次的计算结果TMP2,进行加密,得到加密的结果DEST。DEST就为最终的结果。
对于三倍长3DES,密钥长度的为24字节长。可以分为LK(密钥的左边8字节),CK(密钥的中间8字节),RK(密钥的左边8字节)。与二倍长3DES的加密过程基本相同,只是第一次计算,使用密钥LK;第二次计算,使用密钥CK;第三次计算,使用密钥LK。基本过程如下:
DES( DATA, LK, TMP1 );
UDES( TMP1, CK, TMP2 );
DES( TMP2, RK, DEST );
 
 

java 3des加密问题记录的更多相关文章

  1. C# Java 3DES加密解密 扩展及修正\0 问题

    注: C#已亲测及做扩展, Java 部分未做验证 /// <summary> /// 3DES加密解密 /// ------------------------------------- ...

  2. 【推荐】JAVA基础◆浅谈3DES加密解密

    国内私募机构九鼎控股打造APP,来就送 20元现金领取地址:http://jdb.jiudingcapital.com/phone.html内部邀请码:C8E245J (不写邀请码,没有现金送)国内私 ...

  3. Java实现3DES加密--及ANSI X9.8 Format标准 PIN PAN获取PIN BlOCK

    1, 采用银联ANSI X9.8标准 PIN xor PAN获取PIN BlOCK 2, 采用3Des进行加密 参考: des和3Des加密算法实现 要点:因为3DES是对称加密算法,key是24位, ...

  4. JAVA和C# 3DES加密解密

    最近 一个项目.net 要调用JAVA的WEB SERVICE,数据采用3DES加密,涉及到两种语言3DES一致性的问题, 下面分享一下, 这里的KEY采用Base64编码,便用分发,因为Java的B ...

  5. JAVA安卓和C# 3DES加密解密的兼容性问题(2013年8月修改版)

    近 一个项目.net 要调用JAVA的WEB SERVICE,数据采用3DES加密,涉及到两种语言3DES一致性的问题, 下面分享一下, 这里的KEY采用Base64编码,便用分发,因为Java的By ...

  6. Java中3DES加密解密与其他语言(如C/C++)通信

    国内私募机构九鼎控股打造APP,来就送 20元现金领取地址:http://jdb.jiudingcapital.com/phone.html内部邀请码:C8E245J (不写邀请码,没有现金送)国内私 ...

  7. 你真的了解字典(Dictionary)吗? C# Memory Cache 踩坑记录 .net 泛型 结构化CSS设计思维 WinForm POST上传与后台接收 高效实用的.NET开源项目 .net 笔试面试总结(3) .net 笔试面试总结(2) 依赖注入 C# RSA 加密 C#与Java AES 加密解密

    你真的了解字典(Dictionary)吗?   从一道亲身经历的面试题说起 半年前,我参加我现在所在公司的面试,面试官给了一道题,说有一个Y形的链表,知道起始节点,找出交叉节点.为了便于描述,我把上面 ...

  8. Android: JAVA和C# 3DES加密解密

    最近 一个项目.net 要调用JAVA的WEB SERVICE,数据采用3DES加密,涉及到两种语言3DES一致性的问题,下面分享一下,这里的KEY采用Base64编码,便用分发,因为Java的Byt ...

  9. php 3des加密 兼容JAVA 多么痛的领悟呀

    最近和别人做接口用到SOCKET TCP/IP方式 其中需要对账号和密码进行3DES加密 对方提供了一个加密比对的软件和JAVA的实现代码 并且给了我们一个长度为32位的密钥 这边需要用PHP来实现! ...

随机推荐

  1. pefile解析PE格式

    import os,sys import pefile import pydasm import struct #print sys.argv def show_section(pe): print ...

  2. Linux内核代码布局

    上文参考:http://www.cnblogs.com/long123king/p/3545991.html 先分析一下linker script的语法. #ifdef CONFIG_X86_32#d ...

  3. Spring 学习笔记 IoC 基础

    Spring IoC Ioc 是什么 IoC -- Inversion of Control(控制反转)什么是控制?什么是反转? 控制反转了什么? 在很早之前写项目不用 Spring 的时候,都是在 ...

  4. MFC VC 双缓冲绘图基本原理与实现,详细解释

    转自:http://blog.csdn.net/foreverhuylee/article/details/21548107 当然你可以直接搜索到能用的代码,并且基本能满足要求.不过这样总不是学习的态 ...

  5. C语言指针和字符串

    #include <stdio.h> int main() { /********************************************* * 内存: * 1.常量区 * ...

  6. Oracle之视图联合查询加排序问题

    在公司修改bug,有这样的需求:需要从两张视图中查出相同字段的数据,按照导师姓名先排序,再按照学号排序 union联合两张表,SELECT * from((SELECT DS_ID,PYLX_ID,Y ...

  7. 笔记36 Spring Web Flow——配置

    Spring Web Flow是一个Web框架,它适用于元素按规定流程运行的程序.Spring Web Flow是Spring MVC的扩展,它支持开发基于流程的应用程 序.它将流程的定义与实现流程行 ...

  8. vue组件基础之父子传值

    可以看出数据从后端获取过来,最外层的父组件接收数据,子组件不能直接获取,必须由父组件传递,此时使用props,并且父组件的值更新后,子组件的值也会随之更新,但是反过来通过修改子组件props来影响父组 ...

  9. CSIC_716_20191206【并发编程理论基础】

    进程:正在执行的一个过程,进程是对正在执行过程的一个抽象.区别于程序, 进程的三种状态:  进程是动态的. 就绪态ready:   进程具备运行状态,等待操作系统分配处理器 运行状态running:进 ...

  10. nacos配置服务入门

    1.nacos服务端部署 参见官方文档:https://nacos.io/zh-cn/docs/quick-start.html 2.nacos配置中心功能使用 在pol文件中添加依赖: 在启动类中使 ...