加解密詳解

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

算法分類

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

  • 可逆加密
  • 對稱加密: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的實現。

總結

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

最后編輯于
?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市,隨后出現的幾起案子,更是在濱河造成了極大的恐慌,老刑警劉巖,帶你破解...
    沈念sama閱讀 228,119評論 6 531
  • 序言:濱河連續發生了三起死亡事件,死亡現場離奇詭異,居然都是意外死亡,警方通過查閱死者的電腦和手機,發現死者居然都...
    沈念sama閱讀 98,382評論 3 415
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人,你說我怎么就攤上這事。” “怎么了?”我有些...
    開封第一講書人閱讀 176,038評論 0 373
  • 文/不壞的土叔 我叫張陵,是天一觀的道長。 經常有香客問我,道長,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 62,853評論 1 309
  • 正文 為了忘掉前任,我火速辦了婚禮,結果婚禮上,老公的妹妹穿的比我還像新娘。我一直安慰自己,他們只是感情好,可當我...
    茶點故事閱讀 71,616評論 6 408
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著,像睡著了一般。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發上,一...
    開封第一講書人閱讀 55,112評論 1 323
  • 那天,我揣著相機與錄音,去河邊找鬼。 笑死,一個胖子當著我的面吹牛,可吹牛的內容都是我干的。 我是一名探鬼主播,決...
    沈念sama閱讀 43,192評論 3 441
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了?” 一聲冷哼從身側響起,我...
    開封第一講書人閱讀 42,355評論 0 288
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后,有當地人在樹林里發現了一具尸體,經...
    沈念sama閱讀 48,869評論 1 334
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內容為張勛視角 年9月15日...
    茶點故事閱讀 40,727評論 3 354
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發現自己被綠了。 大學時的朋友給我發了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 42,928評論 1 369
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖,靈堂內的尸體忽然破棺而出,到底是詐尸還是另有隱情,我是刑警寧澤,帶...
    沈念sama閱讀 38,467評論 5 358
  • 正文 年R本政府宣布,位于F島的核電站,受9級特大地震影響,放射性物質發生泄漏。R本人自食惡果不足惜,卻給世界環境...
    茶點故事閱讀 44,165評論 3 347
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧,春花似錦、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 34,570評論 0 26
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至,卻和暖如春,著一層夾襖步出監牢的瞬間,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 35,813評論 1 282
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人。 一個月前我還...
    沈念sama閱讀 51,585評論 3 390
  • 正文 我出身青樓,卻偏偏與公主長得像,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當晚...
    茶點故事閱讀 47,892評論 2 372

推薦閱讀更多精彩內容

  • 概述 之前一直對加密相關的算法知之甚少,只知道類似DES、RSA等加密算法能對數據傳輸進行加密,且各種加密算法各有...
    Henryzhu閱讀 3,042評論 0 14
  • 這篇文章主要講述在Mobile BI(移動商務智能)開發過程中,在網絡通信、數據存儲、登錄驗證這幾個方面涉及的加密...
    雨_樹閱讀 2,546評論 0 6
  • 隨著對于安全度的不斷要求,對于數據加解密與破解之間的斗爭,加解密的方式也在不斷發生著變化,來看看現在流行的一些加解...
    zhouhao_180閱讀 2,110評論 1 12
  • 在開發應用過程中,客戶端與服務端經常需要進行數據傳輸,涉及到重要隱私安全信息時,開發者自然會想到對其進行加密,即使...
    閑庭閱讀 3,288評論 0 11
  • 說到西游記,我印象中最深的是孫悟空,為什么,我印象中最深的是孫悟空,第一點,孫悟空在整一本西游記中,大部分時間都出...
    神了天閱讀 361評論 2 1