加密算法 使用了BASE64 和 3DES 进行联合加密


        众多的加密手段大致可以分为单项加密和双向加密。单项加密指通过对数据进行摘要计算生成密文,密文不可逆推还原,比如有Base64、MD5、SHA等;双向加密则相反,指可以把密文逆推还原成明文,其中双向加密又分为对称加密和非对称加密。对称加密是指数据使用者必须拥有同样的密钥才可以进行加密解密,就像大家共同约定了一组暗号一样,对称加密的手段有DES、3DES、AES、IDEA、RC4、RC5等;而非对称加密相对于对称加密而言,无需拥有同一组密钥,它是一种“信息公开的密钥交换协议”。非对称加密需要公开密钥和私有密钥两组密钥,公开密钥和私有密钥是配对起来的,也就是说使用公开密钥进行数据加密,只有对应的私有密钥才能进行解密。此类的加密手段有RSA、DSA等

     所以使用了3DES进行加密。具体代码如下 

/**
 *
 * 使用3DES进行数据的加密 和 解密
 *
 * Created by abing on 2015/11/5.
 */
public class SecurituyLevel {

    //目前使用先这地方使用 后面去数据库进行查询 并进行操作
    private static final String Algorithm = "DESede";
    private static final String PASWORD_KEY = "";//输入自己的加密密钥

    /**
     * 加密算法
     *
     * @param src 源数据的字节数组
     * @return
     */
    public static byte[] encyptMode(byte[] src) {

        try {

            SecretKey desKey = new SecretKeySpec( buildDesKey(PASWORD_KEY), Algorithm);
            Cipher cipher = Cipher.getInstance(Algorithm);
            cipher.init(Cipher.ENCRYPT_MODE, desKey);

            return cipher.doFinal(src);

        } catch (NoSuchAlgorithmException e) {
            e.printStackTrace();
        } catch (NoSuchPaddingException e) {
            e.printStackTrace();
        } catch (InvalidKeyException e) {
            e.printStackTrace();
        } catch (IllegalBlockSizeException e) {
            e.printStackTrace();
        } catch (BadPaddingException e) {
            e.printStackTrace();
        }
        return null;
    }



    /**
     * 解密密算法
     * @param src
     * @return
     */
    public static byte[] decryptMode(byte[] src){

        try {

            SecretKey desKey = new SecretKeySpec(buildDesKey(PASWORD_KEY) , Algorithm);
            Cipher cipher = Cipher.getInstance(Algorithm);
            cipher.init(Cipher.DECRYPT_MODE, desKey);

            return cipher.doFinal(src);

        } catch (NoSuchAlgorithmException e) {
            e.printStackTrace();
        } catch (NoSuchPaddingException e) {
            e.printStackTrace();
        } catch (InvalidKeyException e) {
            e.printStackTrace();
        }catch (IllegalBlockSizeException e) {
            e.printStackTrace();
        } catch (BadPaddingException e) {
            e.printStackTrace();
        }
        return null;
    }

    /**
     * 根据加密字符串生成密钥字节数组
     *
     *
     * @param keyStr    密钥字符串
     * @return
     */
    public static byte[] buildDesKey(String keyStr){

        try {

            byte[] key = new byte[24];
            byte[] tmp = keyStr.getBytes("UTF-8");
            if (key.length > tmp.length){
                System.arraycopy(tmp , 0 , key , 0 , tmp.length);
            } else {
                System.arraycopy(tmp , 0 , key , 0 , key.length);
            }

            return key;
        } catch (UnsupportedEncodingException e) {
            PlatformLogger.error("buildDesKay is error" , e);
        }

        return null;
    }

}

上面的代码是进行加密,解密使用

由于系统中需要对字符串进行加密 解密  而3DES生成的密文,转换成字符串,再解密的时候会报错。所以引用了BASE64进行编码,以及解码。

Base64是网络上最常见的用于传输8Bit字节代码的编码方式之一,大家可以查看RFC2045~RFC2049,上面有MIME的详细规范。Base64编码可用于在HTTP环境下传递较长的标识信息。例如,在Java Persistence系统Hibernate中,就采用了Base64来将一个较长的唯一标识符(一般为128-bit的UUID)编码为一个字符串,用作HTTP表单和HTTP GET URL中的参数。在其他应用程序中,也常常需要把二进制数据编码为适合放在URL(包括隐藏表单域)中的形式。此时,采用Base64编码具有不可读性,即所编码的数据不会被人用肉眼所直接看到。

BASE64 是编码,解码的,不是加密,解密的方法。 把3DES生成的字节数组 , 通过BASE64进行编码。生成相应的字符。

/**
 * 编码
 *
 * @param src
 * @return
 */
public static String encode(byte[] src){
    return  new BASE64Encoder().encode(src);
}

/**
 * 解码
 *
 * @param src
 * @return
 */
public static byte[] decode(String src) {
    byte[] b = null;
    try {

        BASE64Decoder decoder = new BASE64Decoder();
        b = decoder.decodeBuffer(src);

    } catch (IOException e) {
        e.printStackTrace();
    }

    return b;
}


上面是用BASE64进行编码 , 解码的操作。



具体的加密流程为:

利用3DES加密 , 然后再用BASE64编码生成加密的字符串

解密流程为:

 首先用BASE64解码 , 生成相应的字节数组 , 再用3DES解密  , 返回相应的字符串


一个完整的加解密过程完成了。

你可能感兴趣的:(加密算法 使用了BASE64 和 3DES 进行联合加密)