移動端加解密

voyagelab發表於2016-09-09

本文主要介紹移動端的加解密演算法的分類、其優缺點特性及應用,幫助讀者由淺入深地瞭解和選擇加解密演算法。文中會包含演算法的關鍵程式碼,以利於讀者理解使用。

演算法分類

  根據加密結果是否可以被解密,演算法可以分為可逆加密和不可逆加密(單向加密),從這個意義上來說,單向加密只能稱之為加密演算法而不是加解密演算法。對於可逆加密,又可以根據金鑰的的對稱性分為對稱加密和非對稱加密。具體的分類結構如下:

  • 可逆加密

  • 對稱加密:DES,3DES,AES,PBE

  • 非對稱加密:RSA,DSA,ECC

  • 不可逆加密(單向加密):MD5,SHA,HMAC

金鑰介紹

  在詳細介紹各種加解密演算法之前,我們需要對“金鑰”這一概念做一下簡單介紹,方便我們對下面內容的展開。

  金鑰在加解密演算法中是一個引數,其長度根據不同的演算法有所不同,同一演算法的金鑰長度也有可能有不同的要求。一般來說,金鑰的長度與安全性成正比。在使用時,將明文(或密文)連同金鑰放入相應的加密(或解密容器),即可得到密文(或明文),實現加解密。

  在加密演算法誕生之初,金鑰的形式為對稱的,這是說,加密與解密的金鑰是相同的。這樣是符合我們的思維習慣的。但是,這裡存在一個問題,就是金鑰在傳遞或儲存的過程中如果被竊取,那麼黑客是很容易將密文解密獲得正確的明文的。對稱形式的金鑰雖然簡單高效,但是安全性不高。

  鑑於對稱金鑰的缺陷,人們又提出了一種新的金鑰形式,非對稱金鑰。非對稱金鑰的加解密金鑰不再相同,而是分為公鑰和私鑰,公鑰用於加密,私鑰用於解密。私鑰是不公開不傳送的,僅僅由通訊雙方持有保留;而公鑰是可以公開傳送的,甚至不擔心丟失,因為即便公鑰被竊取,黑客還是無法將密文解密為明文(這一功能由私鑰提供)。可以看到,非對稱金鑰的安全性較對稱金鑰是更好的。

  非對稱金鑰還提供一種功能,即數字簽名。通過私鑰進行簽名,公鑰進行認證,達到身份認證的目的。

  需要說明的是,上面對於金鑰的介紹均是基於可逆加密,對於不可逆加密,是不存在金鑰概念的。

模式介紹

  在詳細介紹各種加解密演算法之前,我們需要對“模式”這一概念做一下簡單介紹,方便我們對下面內容的展開。

  對於可逆加密,在加密時可以選擇加密模式,可以理解為加密演算法可以有不同的工作方式,不同的工作方式之間存在效率、方式等方面的區別。要注意的是,對同一個資料,加密選擇的模式與解密選擇的模式必須相同,否則解密得不到正確的結果。

  Android可逆加密的模式主要有四種:ECB (電子密碼本模式)、CBC(分組連線模式)、CFB(密碼反饋模式)、OFB (輸出反饋模式)。

ECB (電子密碼本模式):

  其使用方式是一個明文分組加密成一個密文分組,相同的明文分組永遠被加密成相同的密文分組。直接利用加密演算法分別對每個64位明文分組使用相同的64位金鑰進行加密。每個明文分組的處理是相互獨立的。

  缺點:在給定金鑰k 下,同一明文組總是產生同一密文組,這會暴露明文組的資料格式。某些明文的資料格式會使得明文組有大量的重複或較長的零串,一些重要的資料常常會在同一位置出現,特別是格式化的報頭、作業號、發報時間、地點等特徵都將被洩露到密文之中,使攻擊者可以利用這些特徵。

  優點:用同個金鑰加密的單獨訊息,其結果是沒有錯誤傳播。實際上,每一個分組可被看作是用同一個金鑰加密的單獨訊息。密文中資料出了錯,解密時,會使得相對應的整個明文分組解密錯誤,但它不會影響其他明文。然而,如果密文中偶爾丟失或新增一些資料位,那麼整個密文序列將不能正確的解密。除非有某幀結構能夠重新排列分組的邊界。

CBC(分組連線模式):

  對於相同的明文,加密結果不同。這就加大了密碼破解者的破譯難度。在金鑰固定不變的情況下,改變每個明文組輸入的連結技術,這樣, 密文組不僅與當前的明文組有關,而且通過反饋的作用還與以前的明文組有關。這從密碼學的本質上來說是一種混淆操作。

  優點:能隱蔽明文的資料模式; 在某種程度上能防止資料篡改, 諸如明文組的重放,嵌入和刪除等.

  缺點:會出現錯誤傳播(errorpropagation). 密文中任一位發生變化會涉及後面一些密文組. 但CBC 模式的錯誤傳播不大, 一個傳輸錯誤至多影響兩個訊息組的接收結果,錯誤傳播最多持續2個分組

CFB(密碼反饋模式):
  採用密文反饋的模式增強密文之間的相關性。若待加密的訊息必須按字元位元處理時,可採用CFB。每次加密s bit 明文。(1<= s<= 原來的固有長度)

  優點:CFB 模式除有CBC 模式的優點外, 其自身獨特的優點是它特別適用於使用者資料格式的需要。

  缺點:一是對通道錯誤較敏感且會造成錯誤傳播。CFB由於採用的是密文反饋,故若某個密文分組在傳輸中出現一位或多位的錯誤,將會引起當前分組和後續部分分組的解密錯誤。二是資料加密的速率降低。但這種模式多用於資料網中較低層次, 其資料速率都不太高。

OFB (輸出反饋模式):
  克服了CBC和CFB模式帶來的錯誤傳播問題,但對密文被篡改難於進行檢測

演算法介紹

單向加密

  前面說過,單向加密的結果是不可以被解密的,因此,單向加密的主要用途並不是傳統意義上的加解密工作,而是對明文資料的保密和摘要提取。單向加密主要有MD5、SHA、HMAC等演算法。

特點

  1. 壓縮性:任意長度的資料,單向加密後長度都是固定的。
  2. 抗修改性:對原資料進行任何改動,哪怕只修改1個位元組,所得到的結果都有很大區別。
  3. 弱抗碰撞性:已知原資料和其單向加密結果,想找到一個具有相同結果的資料(即偽造資料)是非常困難的。
  4. 強抗碰撞性:想找到兩個不同的資料,使它們具有相同的單向加密結果,是非常困難的。
  5. 簡單高效:對資料進行單向加密處理速度是很快的。

注:上述特點是基於某一特定單向加密演算法而言,不同的單向加密演算法之間有區別

  我們可以看到,單向加密對資料加密結果的一致性是有較高的保證的,也就是,對一個資料進行加密,想要偽造一個資料去得到相同的結果,幾乎是不可能的。同時,由於單向加密速度較快而且加密結果長度一定,常常將單向加密的結果作為生成可逆加密中金鑰的第一個步驟,這個我們在後文中會講到。

  • 應用:

1. 資料加密,安全訪問認證

  這是單向加密最廣泛的用途。具體來說,就是對使用者密碼的保護。我們在登陸一個網站或應用時,常常需要輸入自己的密碼或者要求客戶端或瀏覽器幫助我們儲存密碼。但是,密碼是不能明文傳輸驗證或儲存的。這是因為使用者往往是一個密碼用於多個網站甚至銀行,一旦其中的某一個網站洩露了使用者密碼,那麼該使用者的其他網站資訊也會存在被竊取的可能。因此,一般的做法為在使用者登入驗證或儲存密碼時,先對密碼明文做一次單項加密,然後將該結果與伺服器端的使用者密碼單向加密結果進行比對,如果一致則允許訪問,否則拒絕。例如,2012年QQ的記住密碼功能就是將使用者的密碼進行了一次MD5加密,然後存在了本地的資料庫中。

  可能有讀者會意識到,既然單向加密對同一明文的加密結果永遠不變,那麼如果使用者的密碼不變,黑客只要拿到加密後的結果就可以隨意登陸對應網站了,安全性又如何保證呢?確實是這樣的。這就要求工程師在設計登陸或儲存密碼策略時,儘量不要洩漏加密演算法的選擇;另一方面,也可以採取一些特別的手段來對加密物件進行處理,比如對密碼加“鹽”。加鹽的思想會在後面對HMAC的介紹中有所體現。

2.檔案完整性驗證,數字簽名

  有時候,我們需要對檔案或者資料是否被篡改進行確認,用到的就是單向加密技術,主要是基於單向加密的壓縮性、抗修改性和簡單高效性。在這裡舉一個例子,便於讀者理解。有事我們下載了一個映象之後,會發現下載頁面還提供了一組 MD5 值,這組 MD5 值是用來驗證檔案的一致性的,當我們下載好映象之後,需要對該映象做一次 MD5 的校驗,得到的 MD5 值與下載頁面提供的 MD5 值進行對比,以此來驗證該映象是否被篡改。

  • 安全性:

  單向加密的安全性主要取決於加密結果的長度,對於同一加密演算法,安全性與加密結果的長度成正比。單向加密是存在被破解的可能的,主要有暴力破解、查字典法破解和社會工學破解等。但破解成本很高而且需要的時間較長,如果不是極重要的資料,幾乎沒有破解的必要。

  • 演算法分類:

  1. MD5:
      MD5是應用最廣泛的一種單向加密演算法,其在資料加密、安全訪問認證和檔案完整性驗證等方面都有應用。MD5加密輸出是一個128位的十六進位制數字串。Android SDK提供了MD5的使用介面,使用時直接呼叫即可。示例如下:

    
            MessageDigest md5 = MessageDigest.getInstance("MD5"); //獲得MD5加密例項 
            md5.update(stringToEncrypt.getBytes());  
            byte[] encrypted = md5.digest();//加密返回值為byte[]陣列 
  2. SHA:
      SHA實際上是一組加密演算法的合稱,包括SHA-1,SHA-256,SHA-384,SHA-512。其中應用最廣的是SHA-1,HTTPS中使用的HASH雜湊函式多使用SHA-1。相比較於MD5,SHA族有更高的安全性,到目前為止還沒有人能破譯其加密結果,但其加密速度比MD5慢,是以速度換取了安全性。另一方面,SHA對加密的資料有一定的長度限制。具體各SHA演算法的比較如下表格:

  對於SHA演算法,Android SDK也提供了相應介面,方便開發者使用。與MD5類似,以SHA-1為例:

         
        MessageDigest sha = MessageDigest.getInstance("SHA-1"); //獲得SHA-1加密例項 
        sha.update(stringToEncrypt.getBytes());  
        byte[] encrypted = sha.digest();//加密返回值為byte[]陣列
  1. HMAC:
      HMAC不同於上面的傳統單向加密演算法,它的加密形式與可逆加密相同,加密過程需要一個金鑰和一個訊息為輸入,生成一個訊息摘要作為輸出。定義HMAC需要一個加密用雜湊函式(表示為H,可以是MD5或者SHA-1)和一個金鑰K。我們用B來表示資料塊的位元組數。(以上所提到的雜湊函式的分割資料塊字長B=64),用L來表示雜湊函式的輸出資料位元組數(MD5中L=16,SHA-1中L=20)。鑑別金鑰的長度可以是小於等於資料塊字長的任何正整數值。應用程式中使用的金鑰長度若是比B大,則首先用使用雜湊函式H作用於它,然後用H輸出的L長度字串作為在HMAC中實際使用的金鑰。一般情況下,推薦的最小金鑰K長度是L個位元組,結合SHA-1的HMAC程式碼實現如下:

        SecretKeySpec secret = new SecretKeySpec(key.getBytes(), type);//key為開發者自己設定的金鑰字串
        Mac mac = Mac.getInstance("HmacSHA1");//SHA-1的HMAC
        mac.init(secret);
        byte[] digest = mac.doFinal(stringToEncrypt.getBytes());//加密返回值為byte[]陣列

對稱加密

  對稱加密演算法,應用的時間比較早,技術相對來說比較成熟,在對稱加密演算法中,資料發信方將明文(原始資料)和加密金鑰一起經過特殊加密演算法處理後,使其變成複雜的加密密文傳送出去。收信方收到密文後,若想解讀原文,則需要使用加密用過的金鑰及相同演算法的逆演算法對密文進行解密,才能使其恢復成可讀明文。在對稱加密演算法中,使用的金鑰只有一個,發收信雙方都使用這個金鑰對資料進行加密和解密,這就要求解密方事先必須知道加密金鑰。對稱加密演算法的特點是演算法公開、計算量小。不足之處是,交易雙方都使用同樣鑰匙,安全性得不到保證。

  • 特點

    1. 金鑰較小(一般小於256bit),金鑰越大,加密越強,但加密解密越慢

    2. 優點:演算法公開、計算量小、加密速度快、加密效率高,適用於大量資料的加密

    3. 缺點:金鑰分配與管理,安全性較低

    4. 四種演算法DES,3DES,AES,PBE

  • 演算法

    1.DES:

  DES演算法是一種分組加密機制,將明文分成N個組,然後對各個組進行加密,形成各自的密文,最後把所有的分組密文進行合併,形成最終的密文。把64位的明文輸入塊變為64位的密文輸出塊,它所使用的金鑰也是64位。

  • 簡介:
    DES演算法是這樣工作的:

  如Mode為加密,則用Key 去把資料Data進行加密, 生成Data的密碼形式(64位)作為DES的輸出結果;
  如Mode為解密,則用Key去把密碼形式的資料Data解密,還原為Data的明碼形式(64位)作為DES的輸出結果。
  在通訊網路的兩端,雙方約定一致的Key, 在通訊的源點用Key對核心資料進行DES加密,然後以密碼形式在公共通訊網(如電話網)中傳輸到通訊網路的終點,資料到達目的地後,用同樣的Key對密 碼資料進行解密,便再現了明碼形式的核心資料。這樣,便保證了核心資料(如PIN、MAC等)在公共通訊網中傳輸的安全性和可靠性。

  • 支援模式:
      ECB、CBC、CFB、OFB

  • 優缺點:

        (1)DES演算法加密解密速度比較快,金鑰比較短,加密效率很高但通訊雙方都要保持金鑰的祕                    密性,為了安全還需要經常更換DES金鑰
    
        (2)產生金鑰簡單,但安全性完全依賴金鑰,金鑰必須高度保密,因而難以做到一次一密
    
  • 應用:DES演算法在POS、ATM、磁卡及智慧卡(IC卡)、加油站、高速公路收費站等領域被廣泛應用,以此來實現關鍵資料的保密,如信用卡持卡人的PIN的加密傳輸,IC卡與POS間的雙向認證、金融交易資料包的MAC校驗等,均用到DES演算法。

  • 演算法實現:Android的SDK提供了DES的介面,我們可以直接呼叫實現。DES演算法的入口引數有三個:Key、Data、Mode。其中Key為8個位元組共64位,是DES演算法的工作金鑰;Data也為8個位元組64位,是要被加密或被解密的資料;Mode為DES的工作方式,有兩種:加密或解密。

        加密:
            DESKeySpec dks = new DESKeySpec(key);//建立DESKeySpec物件,其中key為64位的金鑰  
            SecretKeyFactory keyFactory = SecretKeyFactory.getInstance("DES");//DES金鑰工廠例項    
            SecretKey securekey = keyFactory.generateSecret(dks);
            Cipher cipher = Cipher.getInstance("DES/ECB/PKCS5Padding");//金鑰容器的例項。傳入的引數依次為加密演算法,加密模式,填充模式(可選NOPadding,PKCS5Padding,PKCS7Padding)
            cipher.init(Cipher.ENCRYPT_MODE, securekey);//初始化金鑰容器。加密時第一個引數必須是Cipher.ENCRYPT_MODE
            byte[] encryptResult=cipher.doFinal(stringToEncrypt.getBytes());
    
      解密:
            DESKeySpec dks = new DESKeySpec(key);//key必須與加密時保持一致  
            SecretKeyFactory keyFactory = SecretKeyFactory.getInstance("DES");
            SecretKey securekey = keyFactory.generateSecret(dks);
            Cipher cipher = Cipher.getInstance("DES/ECB/PKCS5Padding");//傳入的引數必須與加密時保持一致
            cipher.init(Cipher.DECRYPT_MODE, securekey);//解密時第一個引數必須是Cipher.DECRYPT_MODE
            byte[] decryptResult=cipher.doFinal(encryptResult.getBytes());
    
    

    2.3DES:

  3DES演算法是在DES的基礎上發展出來的。在一些對安全性要求較高的場景下,DES的64位金鑰安全性不能滿足要求,於是人們採取了一種“簡單暴力”的辦法——三重資料加密,對資料進行加密,這樣來說,破解的概率就小了很多。3DES的金鑰長度為168位。由於3DES與DES的使用極其相似,只是金鑰的長度有所改變,這裡就不展開介紹了,感興趣的讀者可以嘗試使用相應介面。

3.AES:
  AES 加密演算法作為新一代的資料加密標準匯聚了強安全性、高效能、高效率、易用和靈活等優點。AES 設計有三個金鑰長度:128,192,256 位。是目前可獲得的最安全的加密演算法。

  • 支援模式:
      CFB/OFB/ECB/CBC

  • 優缺點:
      AES各方面均優於其他對稱加密演算法,缺點也只在於對稱加密的侷限。

  • 應用:
      AES的應用十分廣泛,與DES是對稱加密中的主流使用演算法,並有逐漸取代DES的趨勢。

  • 程式碼實現:
    加密:
    SecretKey secretKey = KeyGenerator.getInstance(“AES”).generateKey();//獲得金鑰例項
    cipher = Cipher.getInstance(“AES/ECB/PKCS5Padding”);//金鑰容器的例項。傳入的引數依次為加密演算法,加密模式,填充模式(可選NOPadding,PKCS5Padding,PKCS7Padding)
    cipher.init(Cipher.ENCRYPT_MODE, secretKey);//使用加密模式初始化 金鑰容器
    byte[] encryptResult = cipher.doFinal(stringToEncrypt.getBytes());

    解密:

    SecretKey secretKey = KeyGenerator.getInstance(“AES”).generateKey();//金鑰必須與加密時保持一致
    Cipher cipher = Cipher.getInstance(“AES/ECB/PKCS5Padding”);//傳入的引數必須與加密時保持一致
    cipher.init(Cipher.DECRYPT_MODE, secretKey);//解密時必須是Cipher.DECRYPT_MODE
    byte[] decryptResult=cipher.doFinal(encryptResult.getBytes());

4.PBE:
  PBE演算法使用的場景並不多,我們不必拘泥於它的使用和實現,但是它提供了一種加密思想是值得我們學習參考的——加“鹽”擾亂。

  • “加鹽”介紹:
      前面我們曾說到,對稱加密很大的一個安全缺陷就是加密解密使用相同的金鑰,這種金鑰的不變性給金鑰的安全傳輸和儲存造成了很大的問題。那麼有沒有辦法解決這個問題呢?一個辦法就是給金鑰加“鹽”。這裡的“鹽”可以是隨機數、使用者ID、位置地理資訊等等。“鹽”最重要的作用就是對金鑰的擾亂,使黑客無法確定真實的金鑰,只要通訊雙方約定“鹽”的形式,並且不洩漏,就能保證加密的安全性。我們通過PBE加鹽的方式來了解加“鹽”的思想:

      PBE加密首先用口令取代了金鑰的概念。在加密時,PBE並不是使用口令直接加密,而是使用演算法中的KDF函式通過“鹽”對口令進行擾亂生成準金鑰,然後使用一種雜湊函式多次迭代生成最終的金鑰,金鑰生成後,PBE在選用對稱加密演算法對資料進行加密。

具體的實現可以是這樣的:

    

1、訊息傳遞雙方約定口令,這裡甲方構建口令

2、甲方構建口令後,公佈給乙方

3、由口令構建方(甲方)構建本次訊息傳遞使用的鹽,其實也可以雙方約定一個資料,例如硬碟號,今天的日期等等,不一定非要寫個安全演算法計算出來,只要雙方一致就行

4、甲方使用口令、鹽對資料加密

5、甲方將鹽、加密資料傳送給訊息接收者(乙方)

6、乙方用收到的口令、鹽(可以是約定的資料)對資料進行解密
        

  我們可以看到,對金鑰加“鹽”實際上是一種混淆擾亂的手段。但我們還可以從PBE的加鹽思想中抽取出一種更簡單的理解,“鹽”就是金鑰的一部分,只不過這一部分金鑰是通訊雙方在通訊之前就協商好的不被外界所知道的,通訊過程中,雙方只需傳輸另一部分非鹽金鑰即可,即使非鹽金鑰被截獲,黑客也無法拿到整個金鑰破解密文。

非對稱加密     

  非對稱加密演算法需要兩個金鑰來進行加密和解密,分別是公鑰和私鑰,需要注意的一點,這個公鑰和私鑰必須是一對的,如果用公鑰對資料進行加密,那麼只有使用對應的私鑰才能解密,反之亦然。非對稱加密演算法的出現,就是為了解決只有一把金鑰的加解密,只要這一把金鑰丟失或者被公開,那麼加密資料就很容易被攻擊。同時,也正是由於非對稱加密演算法的出現,才有了後面的數字簽名、數字證書等等。

  • 特點:演算法強度複雜、安全性依賴於演算法與金鑰但是由於其演算法複雜,而使得加密解密速度沒有對稱加密解密的速度快。

  • 使用:非對稱加密主要有兩種使用方面:加解密和數字簽名驗證。

公鑰加密,私鑰解密;私鑰簽名,公鑰驗證
  主要說一下數字簽名:
  數字簽名採用公開金鑰演算法實現,數字簽名與通常的資料加密演算法作用是不同的,它們的實現過程與使用的金鑰不同。數字簽名使用的是傳送方的金鑰對,傳送方用自己的私有金鑰進行加密,接收方用傳送方的公開金鑰進行解密。數字簽名是為了證實資訊確實是由某個使用者傳送,對網路中是否有人看到該資訊並不關心。 資料加密使用的是接受方的金鑰對,傳送方用接收方的公開金鑰進行加密,接受方用自己的私有金鑰進行解密。加密是一個多對一的關係:任何知道接受方公開金鑰的人都可以向接收方傳送加密資訊,只有擁有接收方私有金鑰的人才能對資訊解密。一個使用者通常有兩個金鑰對,一個用來對數字簽名進行加密解密,一個用來對私密金鑰進行加密解密。

  • 演算法

1.RSA:
  RSA是企業級應用標準,很多第三方的加密軟體使用RSA 2048bit加密

  • 優點:
      密碼分配簡單,安全保障性高

  • 缺點:

      1.速度慢,RSA最快的情況也比DES慢上好幾倍,RSA的速度比對應同樣安全級別的對稱密碼演算法要慢1000倍左右

  2.一般來說只用於少量資料加密
  3.產生金鑰很麻煩,受到素數產生技術的限制,因而難以做到一次一密。

實際上,這些缺點是非對稱加密本身的侷限。

  • 演算法實現:

            KeyPairGenerator kpg = KeyPairGenerator.getInstance("RSA");//產生RSA金鑰對產生器
            kpg.initialize(2048);//金鑰對產生器初始化,引數為金鑰長度,可選長度 512 1024 2048
            KeyPair kp = kpg.genKeyPair();//得到金鑰對
            PublicKey publicKey = kp.getPublic();//公鑰
            PrivateKey privateKey = kp.getPrivate();//私鑰
            
            加密:
            BigInteger e = publicKey.getPublicExponent();//獲取引數
            BigInteger n = publicKey.getModulus();//獲取引數
            BigInteger m = new BigInteger(stringToEncrypt.getBytes());
            BigInteger c = m.modPow(e, n);//計算密文C
    
            解密:
            BigInteger c = new BigInteger(stringToDecrypt);
            BigInteger d = privateKey.getPrivateExponent();//獲取引數
            BigInteger n = privateKey.getModulus();//獲取引數
            BigInteger m = c.modPow(d, n);//計算解密結果m
    

2.DSA:
  一般用於數字簽名和認證,在DSA數字簽名和認證中,傳送者使用自己的私鑰對檔案或訊息進行簽名,接受者收到訊息後使用傳送者的公鑰來驗證簽名的真實性。DSA只是一種演算法,和RSA不同之處在於它不能用作加密和解密,也不能進行金鑰交換,只用於簽名,它比RSA要快很多。

  • 優點:
      安全性與RSA相近,產生金鑰速度比RSA快很多

  • 缺點:
      如果使用DSA作為數字簽名的加密演算法,則只能使用SHA1作為訊息雜湊(即訊息摘要)演算法。

而如果使用RSA作為數字簽名加密演算法,對訊息摘要演算法則會有多種選擇

  • 演算法實現:
      由於DSA主要用於數字簽名認證,不用於加解密工作,這裡就不寫加解密程式碼的具體實現了。

    3.ECC:

  ECC是一種高效的非對稱加密演算法,經常使用於移動裝置上。

  • 優點:
      ECC 與 RSA 相比,有以下的優點:

    (1)相同金鑰長度下,安全效能更高,如160位ECC已經與1024位RSA、DSA有相同的安全強度。

    (2)計算量小,處理速度快,在私鑰的處理速度上(解密和簽名),ECC遠 比RSA、DSA快得多。

    (3)儲存空間佔用小 ECC的金鑰尺寸和系統引數與RSA、DSA相比要小得多, 所以佔用的儲存空間小得多。

    (4)頻寬要求低使得ECC具有廣泛得應用前景。
  • 演算法實現:
      ECC與RSA有著相似的特性,它們的程式碼實現也十分相似,只是在產生金鑰對產生器時有所區別,其它地方沒有差別,因此這裡不寫程式碼實現。有需要的讀者可以參照上面RSA的實現。

總結

  到這裡,我們對三大類演算法的介紹就結束了。可以看到,不同演算法有著不同的特點特性,開發者在選擇使用時需要結合考慮使用場景、需求、成本等各個方面的因素。對於單向加密與可逆加密,開發者很容易區別選擇;但對於對稱加密與非對稱加密,選擇可能就不是很容易決斷了,這裡,我們提供一種思路,也是被廣泛接納使用的——由於對稱加密速度快但相對安全性低,非對稱加密安全性高但速度相對慢——我們使用對稱加密對大量的資料明文做加密,然後使用非對稱加密對對稱加密金鑰進行加密,這樣就兼顧了速度與安全的問題。

相關文章