使用java庫中的對稱加密算法


對稱加密算法是說加密方和解密方使用相同的密鑰.常見的對稱加密算法包括4個,DES,DESede(3DES),AES,PBE.

本文討論的內容是加密算法,不是Message Digest,不是編碼.下面區分一下這三個概念.

加密算法是一對一映射,明文密文一一對應.加密是不明確的,是隱晦的.

信息摘要是一個密文對應多個明文,它只是明文整體的一個指紋,一個反映,一個摘要.

編碼是一對一映射,是明確的,是顯然易見的,比如base64編碼.

一.DES(Data Encryption Standard)

DES(Data Encryption Standard)名叫數據加密標准.它明文分成64位一組分塊加密,密鑰也是64位.其中,密鑰的第7,15,23,31,39,47,56,63位是為了湊成奇校驗位(保證一個字節中1的個數為奇數個),所以密鑰實際有效位數是56位.

java中的DES可以如下調用:

public class DES {
    private final static String KEY_DES = "DESede";
    static String tos(byte[] b) {
        String ans = "";
        for (int i = 0; i < b.length; i++) {
            ans += String.format("%02X", b[i]);
        }

        return ans;
    }
    public static void main(String[] args)
            throws NoSuchAlgorithmException, InvalidKeyException,
            NoSuchPaddingException, InvalidKeySpecException,
            IllegalBlockSizeException, BadPaddingException {
        SecureRandom secure = new SecureRandom("weidiao".getBytes());;
        KeyGenerator generator = KeyGenerator.getInstance(KEY_DES);
        generator.init(secure);
        byte[] key = generator.generateKey().getEncoded();
        // DESKeySpec dks = new DESKeySpec(key);
        // SecretKeyFactory factory = SecretKeyFactory.getInstance(KEY_DES);
        // SecretKey secretKey = factory.generateSecret(dks);
        // 上述三行代碼與下面這行代碼等效,但是上面代碼只適用於DES,而下面的代碼可以適用於很多其它加密方式
        // 實際上,下面這行代碼會自動調用上述代碼
        SecretKeySpec secretKey = new SecretKeySpec(key, KEY_DES);
        byte[] data = "123".getBytes();
        Cipher cipher = Cipher.getInstance(KEY_DES);
        cipher.init(Cipher.ENCRYPT_MODE, secretKey);
        byte[] encrypt = cipher.doFinal(data);
        cipher.init(Cipher.DECRYPT_MODE, secretKey);
        byte[] decrypt = cipher.doFinal(encrypt);
        System.out.println("密鑰: " + tos(key));
        System.out.println("原始數據: " + tos(data));
        System.out.println("加密后: " + tos(encrypt));
        System.out.println("解密后:" + tos(decrypt));
    }
}

二.DESede(DES encrypt-decrypt-encrypt)

DESede又名3DES,它並不是一種新的加密算法,而是在DES的基礎上多運算了幾次,使得加密效果更好,如果破解它需要花費原來三倍的時間.它充分利用了DES的可逆性,即充分利用了DES的明文密文為一對一映射.

DESede中的e表示加密,d表示解密,實際上3DES算法如下所示,e表示加密函數,d表示解秘函數,一共用到3對加解密密鑰:

encrypt=e3(d2(e1(data)))

decrypt=d1(e2(d3(encrypt)))

將上述DES代碼中的KEY_DES改成"DESede"即可運行DESede加密算法.

三.AES(Advanced Encryption Standard)

AES(高級加密標准)是為了替代DES(數據加密標准)而出現的.AES 設計有三個密鑰長度:128,192,256 位。相對而言,AES 的 128 密鑰比 DES 的 56 位密鑰強了 1021 倍。WPA(無線局域網受保護訪問協議)是一種新型的無線安全技術,它的實現就采用了AES加密.

將上述DES代碼中的KEY_DES改成"AES"即可運行AES加密算法.

四.PBE(Password Base Encryption)

PBE算法是一個集大成者,它能夠將消息摘要算法和對稱加密算法整合起來.

前面說的DES,3DES,AES都是只需要一個密鑰就能夠進行加密,有人說這個密鑰太難記了,能不能用用戶密碼作為密鑰?試想如果有人知道了你的密碼,什么加密都是沒有用的,他們可以直接用你的密碼進行登錄,加密過程只能擋住想偷盜密碼的人卻不能擋住已經偷到密碼的人.所以,用用戶密碼作為密鑰是可行的.別人得不到你的密鑰等價於別人得不到你的密碼,這就是用密碼作為密鑰的合理性.

那么問題來了,密碼通常很短,而上述DES和3DES需要64位公鑰,AES需要128位公鑰(還有更長的公鑰).解決方法是用MD5或者SSHA將密碼進行消息摘要,這樣一來就可以將密碼弄成固定長度了.所以PBE算法有如下幾種類型:

  • PBEWithSHAAndDES
  • PBEWithSHAAndBlowfish
  • PBEWithSHAAnd128BitRC4
  • PBEWithSHAAndIDEA-CBC
  • PBEWithSHAAnd3-KeyTripleDES-CBC

如果害怕密碼被試探出來,可以加點鹽.PBE算法是支持加鹽的,但是加鹽之后的PBE需要把鹽作為密鑰.這樣跟上面AES,DES,3DES之流又有何分別?所以對於這個算法加鹽並無卵用,反倒破壞了它本身的優勢----除了密碼沒有密鑰,還是要把密碼設置的復雜些,防止被試探出來.

PBE的優點是不需要來回傳輸密鑰了,簡單容易記憶.它的缺點正是它的優點,因為如果入侵者通過抓包抓到了密文,就算他不知道密碼,也依舊能夠使用密文進行登錄,因為密碼並不總是變.也就是說,密鑰最好只能用一次.如果密鑰固定,那就跟密碼沒有差別了.


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM