各種加密算法簡介及其Java實現

jopen 10年前發布 | 46K 次閱讀 算法

 1. 加密算法的介紹

        根據密鑰類型不同將現代密碼技術分為兩類:對稱加密算法(秘密鑰匙加密)和非對稱加密算法(公開密鑰加密)。對稱鑰匙加密系統是加密和解密均采用同一把秘密鑰匙,而且通信雙方都必須獲得這把鑰匙,并保持鑰匙的秘密。非對稱密鑰加密系統采用的加密鑰匙(公鑰)和解密鑰匙(私鑰)是不同的。

 

對稱加密技術,常見的有:

DES(Data Encryption Standard):數據加密標準,速度較快,適用于加密大量數據的場合。

3DES(Triple DES):是基于DES,對一塊數據用三個不同的密鑰進行三次加密,強度更高。

AES(Advanced Encryption Standard):高級加密標準,是下一代的加密算法標準,速度快,安全級別高;

 

常見的非對稱加密算法如下:

RSA:由 RSA 公司發明,是一個支持變長密鑰的公共密鑰算法,需要加密的文件塊的長度也是可變的;

DSA(Digital Signature Algorithm):數字簽名算法,是一種標準的 DSS(數字簽名標準);

ECC(Elliptic Curves Cryptography):橢圓曲線密碼編碼學。

  • 在管理方面:公鑰密碼算法只需要較少的資源就可以實現目的,在密鑰的分配上,兩者之間相差一個指數級別(一個是n一個是n2)。所以私鑰密碼算法不適應廣域網的使用,而且更重要的一點是它不支持數字簽名。
  •  在安全方面:由于公鑰密碼算法基于未解決的數學難題,在破解上幾乎不可能。對于私鑰密碼算法,到了AES雖說從理論來說是不可能破解的,但從計算機的發展角度來看。公鑰更具有優越性。
  • 從速度上來看:AES的軟件實現速度已經達到了每秒數兆或數十兆比特。是公鑰的100倍,如果用硬件來實現的話這個比值將擴大到1000倍。
  • </ul>

    2. 加密算法的選擇:

           我們應該根據自己的使用特點來確定,由于非對稱加密算法的運行速度比對稱加密算法的速度慢很多,當我們需要加密大量的數據時,建議采用對稱加密算法,提高加解密速度。

           對稱加密算法不能實現簽名,因此簽名只能非對稱算法。

           由于對稱加密算法的密鑰管理是一個復雜的過程,密鑰的管理直接決定著他的安全性,因此當數據量很小時,我們可以考慮采用非對稱加密算法。

    在實際的操作過程中,我們通常采用的方式是:采用非對稱加密算法管理對稱算法的密鑰,然后用對稱加密算法加密數據,這樣我們就集成了兩類加密算法的優點,既實現了加密速度快的優點,又實現了安全方便管理密鑰的優點。

           如果在選定了加密算法后,那采用多少位的密鑰呢?一般來說,密鑰越長,運行的速度就越慢,應該根據的我們實際需要的安全級別來選擇,一般來說,RSA建議采用1024位的數字,ECC建議采用160位,AES采用128為即可。

     

    3. 加密算法的未來:

             隨著計算方法的改進,計算機運行速度的加快,網絡的發展,越來越多的算法被破解。

              在2004年國際密碼學會議(Crypto’2004)上,來自中國山東大學的王小云教授做的破譯MD5、HAVAL-128、MD4和RIPEMD算法的報告,令在場的國際頂尖密碼學專家都為之震驚,意味著這些算法將從應用中淘汰。隨后,SHA-1也被宣告被破解。

             歷史上有三次對DES有影響的攻擊實驗。1997年,利用當時各國 7萬臺計算機,歷時96天破解了DES的密鑰。1998年,電子邊境基金會(EFF)用25萬美元制造的專用計算機,用56小時破解了DES的密鑰。 1999年,EFF用22小時15分完成了破解工作。因此。曾經有過卓越貢獻的DES也不能滿足我們日益增長的需求了。

             最近,一組研究人員成功的把一個512位的整數分解因子,宣告了RSA的破解。

              我們說數據的安全是相對的,可以說在一定時期一定條件下是安全的,隨著硬件和網絡的發展,或者是另一個王小云的出現,目前的常用加密算法都有可能在短時間內被破解,那時我們不得不使用更長的密鑰或更加先進的算法,才能保證數據的安全,因此加密算法依然需要不斷發展和完善,提供更高的加密安全強度和運算速度。

             縱觀這兩種算法一個從DES到3DES再到AES,一個從RSA到ECC。其發展角度無不是從密鑰的簡單性,成本的低廉性,管理的簡易性,算法的復雜性,保密的安全性以及計算的快速性這幾個方面去考慮。因此,未來算法的發展也必定是從這幾個角度出發的,而且在實際操作中往往把這兩種算法結合起來,也需將來一種集兩種算法優點于一身的新型算法將會出現,到那個時候,電子商務的實現必將更加的快捷和安全。

     

    現在不同的開發語言都多多少少支持各種加密算法,并且都在不斷更新。在此提供一個簡單的用DES算法加密的例子,該例子用JAVA編寫。

     

    更多的例子請參考:http://download.csdn.net/detail/lrenjundk/4192983,包括經典對稱密鑰加密算法,非對稱密鑰加密算法,數字簽名的實現,以及測試運行時間的小程序,程序代碼中有詳細的注釋

    import java.security.NoSuchAlgorithmException;  
    import java.security.SecureRandom;  
    
    import javax.crypto.Cipher;  
    import javax.crypto.KeyGenerator;  
    import javax.crypto.SecretKey;  
    
    /** 
     * @author root 
     * 
     */  
    public class CryptTest {  
    
        /** 
         * 創建密鑰 
         *  
         * @param algorithm 
         *          加密算法,可以用于DES,DESede,Blowfish 
         * @return SecretKey,對稱密鑰 
         */  
        public SecretKey createSecretKey(String algorithm){  
            KeyGenerator keygen;  
            SecretKey deskey = null;  
            try {  
                keygen = KeyGenerator.getInstance(algorithm);  
                deskey = keygen.generateKey();  
            } catch (NoSuchAlgorithmException e) {  
                // TODO Auto-generated catch block  
                e.printStackTrace();  
            }  
    
            return deskey;  
        }  
    
        /** 
         * 將二進制轉化為16進制字符串 
         *  
         * @param b 
         *          二進制字節數組 
         * @return 
         */  
        public 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;  
                }  
            }  
            return hs.toUpperCase();  
        }  
    
        /** 
         * 根據密鑰進行DES 加密 
         *  
         * @param key 
         *           密鑰 
         * @param info 
         *           要加密的信息 
         * @return 
         *           加密后的信息 
         */  
        public String encryptToDES(SecretKey key, String info){  
            String Algorithm = "DES";  
            //隨機數生成,可以不寫  
            SecureRandom secureRandom = new SecureRandom();  
            byte[] cipherByte = null;  
            try {  
                //等到加密/解密器  
                Cipher cl = Cipher.getInstance(Algorithm);  
                cl.init(Cipher.ENCRYPT_MODE, key, secureRandom);  
                cipherByte = cl.doFinal(info.getBytes());  
            } catch (Exception e) {  
                // TODO Auto-generated catch block  
                e.printStackTrace();  
            }  
            //返回密文的十六進制形式  
            return byte2hex(cipherByte);  
        }  
    
    
        /** 
         * 測試 
         *  
         * @param args 
         */  
        public static void main(String[] args){  
            CryptTest cryptTest = new CryptTest();  
    
            String testString = "hello world";  
    
            //生成一個DES算法的密鑰  
            SecretKey key = cryptTest.createSecretKey("DES");  
            //用DES算法加密testString  
            String strl = cryptTest.encryptToDES(key, testString);  
            System.out.println("使用DES加密,原文為:"+testString+"\n密文為:"+strl);  
        }  
    
    }  
 本文由用戶 jopen 自行上傳分享,僅供網友學習交流。所有權歸原作者,若您的權利被侵害,請聯系管理員。
 轉載本站原創文章,請注明出處,并保留原始鏈接、圖片水印。
 本站是一個以用戶分享為主的開源技術平臺,歡迎各類分享!