java desede 工作模式_Java 加密解密之对称加密算法DESede

本文详细介绍了Java中的三重DES加密算法DESede,包括其加密原理、工作模式以及JDK对其的支持。提供了密钥生成、加密解密的Java代码示例,展示了如何使用DESede进行数据的加密和解密操作。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

JAVA

加密解密系列

Java 加密解密之对称加密算法DESede

DESede即三重 DES加密算法,也被称为3DES或者Triple  DES。使用三(或两)个不同的密钥对数据块进行三次(或两次)DES加密(加密一次要比进行普通加密的三次要快)。三重DES的强度大约和112- bit的密钥强度相当。通过迭代次数的提高了安全性,但同时也造成了加密效率低的问题。正因DESede算法效率问题,AES算法诞生了。(详见:Java 加密解密之对称加密算法AES)

到目前为止,还没有人给出攻击三重DES的有效方法。对其密钥空间中密钥进行蛮干搜索,那么由于空间太大,这实际上是不可行的。若用差分攻击的方法,相对于单一DES来说复杂性以指数形式增长。

三重DES有四种模型

(a)DES-EEE3,使用三个不同密钥,顺序进行三次加密变换。

(b)DES-EDE3,使用三个不同密钥,依次进行加密-解密-加密变换。

(c)DES-EEE2,其中密钥K1=K3,顺序进行三次加密变换。

(d)DES-EDE2, 其中密钥K1=K3,依次进行加密-解密-加密变换。

JDK对DESede算法的支持

密钥长度:112位/168位

工作模式:ECB/CBC/PCBC/CTR/CTS/CFB/CFB8 to CFB128/OFB/OBF8 to OFB128

填充方式:Nopadding/PKCS5Padding/ISO10126Padding/

工作模式和填充方式请参考:     JAVA加密解密基础

十六进制工具类Hex.java,见:DESede加密解密的java实现:DESede.java

Java代码:

import java.security.Key;

import javax.crypto.Cipher;

import javax.crypto.KeyGenerator;

import javax.crypto.SecretKey;

import javax.crypto.SecretKeyFactory;

import javax.crypto.spec.DESedeKeySpec;

/**

* DESede Coder

* secret key length: 112/168 bit, default: 168 bit

* mode: ECB/CBC/PCBC/CTR/CTS/CFB/CFB8 to CFB128/OFB/OBF8 to OFB128

* padding: Nopadding/PKCS5Padding/ISO10126Padding/

* @author Aub

*

*/

public class DESedeCoder {

/**

* 密钥算法

*/

private static final String KEY_ALGORITHM = "DESede";

// private static final String DEFAULT_CIPHER_ALGORITHM = "DESede/ECB/PKCS5Padding";

private static final String DEFAULT_CIPHER_ALGORITHM = "DESede/ECB/ISO10126Padding";

/**

* 初始化密钥

*

* @return byte[] 密钥

* @throws Exception

*/

public static byte[] initSecretKey() throws Exception{

//返回生成指定算法的秘密密钥的 KeyGenerator 对象

KeyGenerator kg = KeyGenerator.getInstance(KEY_ALGORITHM);

//初始化此密钥生成器,使其具有确定的密钥大小

kg.init(168);

//生成一个密钥

SecretKey secretKey = kg.generateKey();

return secretKey.getEncoded();

}

/**

* 转换密钥

*

* @param key 二进制密钥

* @return Key 密钥

* @throws Exception

*/

private static Key toKey(byte[] key) throws Exception{

//实例化DES密钥规则

DESedeKeySpec dks = new DESedeKeySpec(key);

//实例化密钥工厂

SecretKeyFactory skf = SecretKeyFactory.getInstance(KEY_ALGORITHM);

//生成密钥

SecretKey secretKey = skf.generateSecret(dks);

return secretKey;

}

/**

* 加密

*

* @param data 待加密数据

* @param key 密钥

* @return byte[] 加密数据

* @throws Exception

*/

public static byte[] encrypt(byte[] data,Key key) throws Exception{

return encrypt(data, key,DEFAULT_CIPHER_ALGORITHM);

}

/**

* 加密

*

* @param data 待加密数据

* @param key 二进制密钥

* @return byte[] 加密数据

* @throws Exception

*/

public static byte[] encrypt(byte[] data,byte[] key) throws Exception{

return encrypt(data, key,DEFAULT_CIPHER_ALGORITHM);

}

/**

* 加密

*

* @param data 待加密数据

* @param key 二进制密钥

* @param cipherAlgorithm 加密算法/工作模式/填充方式

* @return byte[] 加密数据

* @throws Exception

*/

public static byte[] encrypt(byte[] data,byte[] key,String cipherAlgorithm) throws Exception{

//还原密钥

Key k = toKey(key);

return encrypt(data, k, cipherAlgorithm);

}

/**

* 加密

*

* @param data 待加密数据

* @param key 密钥

* @param cipherAlgorithm 加密算法/工作模式/填充方式

* @return byte[] 加密数据

* @throws Exception

*/

public static byte[] encrypt(byte[] data,Key key,String cipherAlgorithm) throws Exception{

//实例化

Cipher cipher = Cipher.getInstance(cipherAlgorithm);

//使用密钥初始化,设置为加密模式

cipher.init(Cipher.ENCRYPT_MODE, key);

//执行操作

return cipher.doFinal(data);

}

/**

* 解密

*

* @param data 待解密数据

* @param key 二进制密钥

* @return byte[] 解密数据

* @throws Exception

*/

public static byte[] decrypt(byte[] data,byte[] key) throws Exception{

return decrypt(data, key,DEFAULT_CIPHER_ALGORITHM);

}

/**

* 解密

*

* @param data 待解密数据

* @param key 密钥

* @return byte[] 解密数据

* @throws Exception

*/

public static byte[] decrypt(byte[] data,Key key) throws Exception{

return decrypt(data, key,DEFAULT_CIPHER_ALGORITHM);

}

/**

* 解密

*

* @param data 待解密数据

* @param key 二进制密钥

* @param cipherAlgorithm 加密算法/工作模式/填充方式

* @return byte[] 解密数据

* @throws Exception

*/

public static byte[] decrypt(byte[] data,byte[] key,String cipherAlgorithm) throws Exception{

//还原密钥

Key k = toKey(key);

return decrypt(data, k, cipherAlgorithm);

}

/**

* 解密

*

* @param data 待解密数据

* @param key 密钥

* @param cipherAlgorithm 加密算法/工作模式/填充方式

* @return byte[] 解密数据

* @throws Exception

*/

public static byte[] decrypt(byte[] data,Key key,String cipherAlgorithm) throws Exception{

//实例化

Cipher cipher = Cipher.getInstance(cipherAlgorithm);

//使用密钥初始化,设置为解密模式

cipher.init(Cipher.DECRYPT_MODE, key);

//执行操作

return cipher.doFinal(data);

}

private static String showByteArray(byte[] data){

if(null == data){

return null;

}

StringBuilder sb = new StringBuilder("{");

for(byte b:data){

sb.append(b).append(",");

}

sb.deleteCharAt(sb.length()-1);

sb.append("}");

return sb.toString();

}

public static void main(String[] args) throws Exception {

byte[] key = initSecretKey();

// byte[] key = "123456789012345678901".getBytes();

System.out.println("key:"+ showByteArray(key));

Key k = toKey(key);

// String data ="DESede数据";

String data ="123456789";

System.out.println("加密前数据: string:"+data);

System.out.println("加密前数据: byte[]:"+showByteArray(data.getBytes()));

System.out.println();

byte[] encryptData = encrypt(data.getBytes(), k);

System.out.println("加密后数据: byte[]:"+showByteArray(encryptData));

System.out.println("加密后数据: hexStr:"+Hex.encodeHexStr(encryptData));

System.out.println();

byte[] decryptData = decrypt(encryptData, k);

System.out.println("解密后数据: byte[]:"+showByteArray(decryptData));

System.out.println("解密后数据: string:"+new String(decryptData));

}

}

注:参考《java加密解密的艺术》

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值