3DES自定义密钥问题

isskingdom 2015-05-04 08:20:50
使用3DES加密算法的时候,需要用到自定义的密钥K1、K2、K3(每个都是8字节的),其中K1=K3。
明文P={(byte)0x00, (byte)0x00, (byte)0x00, (byte)0x00, (byte)0x00, (byte)0x00,(byte)0x00, (byte)0x00}
期待的 密文C={(byte)0x0B, (byte)0x54, (byte)0x57, (byte)0x07, (byte)0x45, (byte)0xFE,(byte)0x3A, (byte)0xE7}
转码成16进制字符后C=“0B54570745FE3AE7”
P ---> DES(K1) ---> DES-1(K2) ---> DES(K3) ---> C
加密 解密 加密

现在的问题是我用K1K2K3连接成24字节的密钥
final byte[] keyBytes = { (byte)0xFE, (byte)0xFE, (byte)0xFE, (byte)0xFE, (byte)0xFE, (byte)0xFE,(byte)0x7E, (byte)0x00,
(byte)0x00, (byte)0x7E, (byte)0xFE, (byte)0xFE, (byte)0xFE, (byte)0xFE,(byte)0xFE, (byte)0xFE,
(byte)0xFE, (byte)0xFE, (byte)0xFE, (byte)0xFE, (byte)0xFE, (byte)0xFE,(byte)0x7E, (byte)0x00 };

使用Java提供的Cipher进行3DES加密后,发现得出的结果
C="847CAC05A5CBAF2B"

不是我期待的j结果。不知道问题出在哪里?

代码如下:

main函数中:
final byte[] keyBytes = { (byte)0xFE, (byte)0xFE, (byte)0xFE, (byte)0xFE, (byte)0xFE, (byte)0xFE,(byte)0x7E, (byte)0x00,(byte)0x00, (byte)0x7E, (byte)0xFE, (byte)0xFE, (byte)0xFE, (byte)0xFE,(byte)0xFE, (byte)0xFE,(byte)0xFE, (byte)0xFE,(byte)0xFE, (byte)0xFE, (byte)0xFE, (byte)0xFE,(byte)0x7E, (byte)0x00 };

byte[] startBytes = { (byte)0x00, (byte)0x00, (byte)0x00, (byte)0x00, (byte)0x00, (byte)0x00,(byte)0x00, (byte)0x00};
String srcString = TriDES.byte2hex(startBytes);
System.out.println("3DES加密前的字符串:" + TriDES.byte2hex(startBytes));

byte[] encoded = TriDES.encryptMode(keyBytes, startBytes);
System.out.println("3DES加密后的字符串:" + TriDES.byte2hex(encoded));

byte[] srcBytes = TriDES.decryptMode(keyBytes, encoded);
System.out.println("3DES解密后的字符串:" + TriDES.byte2hex(srcBytes));

加密算法类的代码:
public class TriDES {
private static final String Algorithm = "DESede/ECB/Nopadding"; // 定义 加密算法
private static final String hexString="0123456789ABCDEF";
/**
*
* @param keybyte 加密密钥,长度为24字节
* @param src 字节数组(根据给定的字节数组构造一个密钥。 )
* @return
*/
public static byte[] encryptMode(byte[] keybyte, byte[] src) {
try {
// 从原始密匙数据创建一个DESKeySpec对象
KeySpec dks = new DESedeKeySpec(keybyte);

// 创建一个密匙工厂,然后用它把DESKeySpec对象转换成
// 一个SecretKey对象
SecretKey secKey = SecretKeyFactory.getInstance("DESede").generateSecret(dks);
// 加密
Cipher c1 = Cipher.getInstance(Algorithm);
// DES算法要求有一个可信任的随机数源
SecureRandom sr = new SecureRandom();
c1.init(Cipher.ENCRYPT_MODE, secKey,sr);
return c1.doFinal(src);
} catch (java.security.NoSuchAlgorithmException e1) {
e1.printStackTrace();
} catch (javax.crypto.NoSuchPaddingException e2) {
e2.printStackTrace();
} catch (java.lang.Exception e3) {
e3.printStackTrace();
}
return null;
}

/**
*
* @param keybyte 密钥
* @param src 需要解密的数据
* @return
*/
public static byte[] decryptMode(byte[] keybyte, byte[] src) {
try {
// 解密
KeySpec dks = new DESedeKeySpec(keybyte);

// 创建一个密匙工厂,然后用它把DESKeySpec对象转换成
// 一个SecretKey对象
SecretKey secKey = SecretKeyFactory.getInstance("DESede").generateSecret(dks);
Cipher c1 = Cipher.getInstance(Algorithm);
SecureRandom sr = new SecureRandom();
c1.init(Cipher.DECRYPT_MODE, secKey, sr);
return c1.doFinal(src);
} catch (java.security.NoSuchAlgorithmException e1) {
e1.printStackTrace();
} catch (javax.crypto.NoSuchPaddingException e2) {
e2.printStackTrace();
} catch (java.lang.Exception e3) {
e3.printStackTrace();
}
return null;
}


// 转换成十六进制字符串
public static String byte2hex(byte[] b) {
String hs = "";
String stmp = "";
for (int n = 0; n < b.length; n++) {
stmp = (java.lang.Integer.toHexString(b[n] & 0XFF));
if (stmp.length() == 1)
hs = hs + "0" + stmp;
else
hs = hs + stmp;
// if (n < b.length - 1)
// hs = hs + ":";
}
return hs.toUpperCase();
}
}
...全文
715 4 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
4 条回复
切换为时间正序
请发表友善的回复…
发表回复
qq_28690895 2017-09-16
  • 打赏
  • 举报
回复
楼主这个问题解决了吗?也在做3DES加密,这个密钥不知道该怎么设置了
「已注销」 2016-05-14
  • 打赏
  • 举报
回复
楼主这个问题解决了吗?也在做3DES加密,遇到一些问题,能否请教一下
isskingdom 2015-05-05
  • 打赏
  • 举报
回复
追加分数了,希望看到的高手能帮忙,谢谢啊
isskingdom 2015-05-04
  • 打赏
  • 举报
回复
求大神解答呀~~

81,122

社区成员

发帖
与我相关
我的任务
社区描述
Java Web 开发
社区管理员
  • Web 开发社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧