使用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();
    }
}