Android C、C++与java端3DES互通

来源:互联网 发布:艾媒咨询知乎 编辑:程序博客网 时间:2024/05/16 08:08
  1. 为了使C端与java端的3des加解密互通,我们一般使用“DESede/ECB/NoPadding”加密模式;
  2. 而在我们java端,我们都知道3des的密钥都是24字节的,而C端是16字节,此处为重点:我们java端的密钥组成为16字节密钥 + 其前8个字节组成24字节密钥
  3. 请看代码:
private static byte[] fillTo24(byte[] key) {        if (null != key && key.length == 16) {            return Util.pinJie2(key, Util.subBytes(key, 0, 8));        }        return null;    }
  1. 全部代码为:
public class DES3Utils {    // 向量    public final static String iv = "12345678";    // 3des加密    public static final String algorithm = "DESede";    // 加密 src为源数据的字节数组    public static byte[] encryptBy3DES(byte[] src, byte[] key) {        return init(src, key, true, 0);    }    // 解密函数    public static byte[] decryptBy3DES(byte[] src, byte[] key) {        return init(src, key, false, 0);    }    /**     * @param src 需要加密的文字     * @return 加密后的文字     * @throws Exception 加密失败     */    public static byte[] encryptBy3DESCBC(byte[] src, byte[] key) {        byte[] fillTo24 = fillTo24(key);        if (null == fillTo24)            return null;        try {            SecretKey deskey = new SecretKeySpec(fillTo24, algorithm);            Cipher cipher = Cipher.getInstance("DESede/CBC/PKCS5Padding");            IvParameterSpec ips = new IvParameterSpec(iv.getBytes());            cipher.init(Cipher.ENCRYPT_MODE, deskey, ips);            return cipher.doFinal(src);        } catch (Exception e) {            e.printStackTrace();        }        return null;    }    /**     * 3DES解密     *     * @param encryptText 加密文本     * @return     * @throws Exception     */    public static byte[] decryptBy3DESCBC(byte[] encryptText, byte[] key) {        byte[] fillTo24 = fillTo24(key);        if (null == fillTo24)            return null;        try {            SecretKey deskey = new SecretKeySpec(fillTo24, algorithm);            Cipher cipher = Cipher.getInstance("DESede/CBC/PKCS5Padding");            IvParameterSpec ips = new IvParameterSpec(iv.getBytes());            cipher.init(Cipher.DECRYPT_MODE, deskey, ips);            return cipher.doFinal(encryptText);        } catch (Exception e) {            e.printStackTrace();        }        return null;    }    /**     * @param src 需要加密的文字     * @return 加密后的文字     * @throws Exception 加密失败     */    public static byte[] encryptBy3DESECB(byte[] src, byte[] key) {        return init(src, key, true, 1);    }    /**     * 3DES解密     *     * @param encryptText 加密文本     * @return     * @throws Exception     */    public static byte[] decryptBy3DESECB(byte[] encryptText, byte[] key) {        return init(encryptText, key, false, 1);    }    private static byte[] init(byte[] data, byte[] key, boolean mode, int type) {        byte[] fillTo24 = fillTo24(key);        if (null == fillTo24)            return null;        String types = null;        try {            SecretKey deskey = new SecretKeySpec(fillTo24, algorithm);            switch (type) {                case 0:                    types = "DESede";                    break;                case 1:                    types = "DESede/ECB/NoPadding";                    break;                case 2:                    types = "DESede/ECB/PKCS5Padding";                    break;            }            Cipher cipher = Cipher.getInstance(types);            if (mode)                cipher.init(Cipher.ENCRYPT_MODE, deskey);            else                cipher.init(Cipher.DECRYPT_MODE, deskey);            return cipher.doFinal(data);        } catch (Exception e) {            e.printStackTrace();        }        return null;    }    private static byte[] fillTo24(byte[] key) {        if (null != key && key.length == 16) {            return Util.pinJie2(key, Util.subBytes(key, 0, 8));        }        return null;    } }
阅读全文
0 0