使用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();
}
}
明文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();
}
}
解决方案 »
免费领取超大流量手机卡,每月29元包185G流量+100分钟通话, 中国电信官方发货