java 3des_java 3des加密问题记录

本文介绍了Java中3DES加密的两种实现方式,包括ECB模式和无填充模式。强调了在加解密过程中保持加密模式和填充模式一致的重要性,并详细解释了3DES加密的过程,包括双倍长和三倍长的差异。同时指出Java中3DES密钥长度必须为24字节,不足或超出都会导致错误。
摘要由CSDN通过智能技术生成

3des加密有不同的加密模式和填充模式,这个网上很多不多说了,只要保证加解密的时候加密模式和填充模式保持一致就可以了

首先对于密钥的生成,java中有2种方式:

1.第一种,采用ECB模式和不填充模式

//加密

public static byte[] des3EncodeECB(byte[] key, byte[] data)

throwsException {

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);

returnbOut;

}

//解密

public static byte[] des3DecodeECB(byte[] key, byte[] data)

throwsException {

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);

returnbOut;

}

2.第二种,同样采用ECB模式和不填充模式

//加密

public static byte[] encrypt(byte[] targetToByte, String algorithm,String mode, String key) throwsException {

Cipher cipher=Cipher.getInstance(algorithm);

cipher.init(Cipher.ENCRYPT_MODE, getKey(key, mode));byte[] result =cipher.doFinal(targetToByte);//System.out.println("base64:" +encryptByBase64(result));

returnresult;

}//解密

public static byte[] decrypt(byte[] targetToByte, String algorithm,String mode, String key) throwsException {

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"));

returnresult;

}public staticKey getKey(String key, String algorithm) {try{

KeyGenerator generator=KeyGenerator.getInstance(algorithm);//注意此处将key按照16进制数字解析成byte数组,按需要修改,比如key.getBytes()

generator.init(newSecureRandom(HexString2Bytes(key)));returngenerator.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 );

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值