加密算法 使用了BASE64 和 3DES 進行聯合加密


        衆多的加密手段大體能夠分爲單項加密和雙向加密。單項加密指經過對數據進行摘要計算生成密文,密文不可逆推還原,好比有Base6四、MD五、SHA等;雙向加密則相反,指能夠把密文逆推還原成明文,其中雙向加密又分爲對稱加密和非對稱加密。對稱加密是指數據使用者必須擁有一樣的密鑰才能夠進行加密解密,就像你們共同約定了一組暗號同樣,對稱加密的手段有DES、3DES、AES、IDEA、RC四、RC5等;而非對稱加密相對於對稱加密而言,無需擁有同一組密鑰,它是一種「信息公開的密鑰交換協議」。非對稱加密須要公開密鑰和私有密鑰兩組密鑰,公開密鑰和私有密鑰是配對起來的,也就是說使用公開密鑰進行數據加密,只有對應的私有密鑰才能進行解密。此類的加密手段有RSA、DSA等java

     因此使用了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進行編碼。生成相應的字符。ui

/**
 * 編碼
 *
 * @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編碼生成加密的字符串

解密流程爲:spa

 首先用BASE64解碼 , 生成相應的字節數組 , 再用3DES解密  , 返回相應的字符串


一個完整的加解密過程完成了。code

相關文章
相關標籤/搜索