# Android 安全加密:對稱加密詳解
## 定義:
加密和解密都使用同一把秘鑰,這種加密方法稱為對稱加密,也稱為單密鑰加密。
簡單理解為:==加密解密都是同一把鑰匙。==
加密應用場景:敏感信息加密,比如,證件號碼,銀行卡賬號,郵件信息,聊天記錄cookie信息,私鑰保護等等
## 對稱加密常用算法
AES、DES、3DES、TDEA、Blowfish、RC2、RC4、RC5、IDEA、SKIPJACK 等。
---
### AES
高級加密標準(英語:Advanced Encryption Standard,縮寫:AES)
#### AES支持三種長度的密鑰:128位,192位,256位
#### AES加密原理:**分組加密**

AES算法在對明文加密的時候,並不是把整個明文一股腦加密成一整段密文,而是把==明文拆分成一個個獨立的明文塊,每一個明文塊長度128bit==。
這些明文塊經過AES加密器的複雜處理,生成一個個獨立的密文塊,這些==密文塊拼接在一起,就是最終的AES加密結果==。
明文長度有問題:
假如一段明文長度是192bit,如果按每128bit一個明文塊來拆分的話,第二個明文塊只有64bit,不足128bit。這時候怎麼辦呢?就需要對明文塊進行**填充**(Padding)。
#### 舉例幾種填充形式:
1. NoPadding:
不做任何填充,但是要求明文必須是16字節的整數倍。
3. PKCS5Padding(默認):
如果明文塊少於16個字節(128bit),在明文塊末尾補足相應數量的字符,且每個字節的值等於缺少的字符數。
比如明文:{1,2,3,4,5,a,b,c,d,e},缺少6個字節,則補全為{1,2,3,4,5,a,b, c,d,e,6,6,6,6,6,6}
3. ISO10126Padding:
如果明文塊少於16個字節(128bit),在明文塊末尾補足相應數量的字節,最後一個字符值等於缺少的字符數,其他字符填充隨機數。比如明文:{1,2,3,4,5,a,b,c,d,e},缺少6個字節,則可能補全為{1,2,3,4,5,a,b ,c,d,e,5,c,3,G,$,6}
#### 工作模式:
AES的工作模式,體現在把明文塊加密成密文塊的處理過程中。
#### AES加密算法提供了五種不同的工作模式:
ECB、CBC、CTR、CFB、OFB
### 1. ECB模式(默認):
**電碼本模式(Electronic Codebook Book)**
是最簡單的工作模式,在該模式下,每一個==明文塊的加密都是完全獨立,互不干涉的==。

**優點:**
1.簡單
2.有利於並行計算
**缺點:**
相同的明文塊經過加密會變成相同的密文塊,因此安全性較差。
### 2. CBC :
**密碼分組鏈接模式Cipher Block Chaining**
初始向量IV(Initialization Vector),簡稱IV。
==目的是防止同樣的明文塊始終加密成同樣的密文塊。==
上一個密文分組和下一個明文分組的內容混合加密出的密文塊相**異或**。這樣以來,相同的明文塊加密出的密文塊顯然是不一樣的,==因此可以避免ECB模式的缺陷==。
==但當加密第一個明文分組時,由於不存在上一個密文分組,因此需要準備與分組等長的初始化向量IV,來代替上一個密文分組。==

**優點:**
安全性更高
**缺點:**
1.無法並行計算,性能上不如ECB
2.引入初始化向量IV,增加複雜度
>
> 異或 XOR
> 兩個運算元的一種邏輯分析類型。與一般的邏輯或不同,當兩兩數值相同為否,而數值不同時為真。
> https://zh.wikipedia.org/wiki/%E9%80%BB%E8%BE%91%E5%BC%82%E6%88%96
>
### 3. CTR :
**計數器模式 Counter**
==每個分組對應一個逐次累加的計數器,並通過對計數器進行加密來生成金鑰流。==
也即最終的密文分組是通過將計數器加密得到的位元序列,與明文分組進行異或運算得到的。

### 4. CFB :
**密文反饋模式 Cipher FeedBack**
上一個密文分組作為加密演算法的輸入,輸出與明文異或作為下一個分組的密文。在CFB模式中,明文分組和密文分組之間只有一次異或。
CFB模式與一次性密碼本相似,都是通過將==明文與隨機位元序列進行異或運算來生成密文==。
但由於CFB模式中==密碼演算法的輸出是通過計算得到的,並非真正的隨機數==,因此不具備一次性密碼本那樣理論上不可破譯的性質。
==CFB模式可以看做使用分組方式實現流密碼的方式。==

### 5. OFB :
**輸出反饋模式 Output Feedback**
OFB模式與CFB模式類似,只是加密演算法的輸入是上一次加密的輸出。
在OFB模式中,異或所需的金鑰流,可以事先通過密碼演算法生成,即生成金鑰流的操作可以與異或運算並行。
OFB模式加密和處理解密邏輯相同,明文與金鑰流異或生成密文,密文與金鑰流異或生成明文。

---
### DES :
**Data Encryption Standard**
即數據加密標準,是一種歷史比較悠久的加密算法,上世紀70年代就在使用,是由IBM公司設計的算法,並被美國政府於1976年確定為國家標準局確定為聯邦資料處理標準,這種加密算法再七八十年代廣為流傳,但隨著計算機硬件的指數級發展,處理能力不斷提高,DES 加密算法已經不再安全,早在1999年,就有組織宣稱使用在23小時之內成功破解了,使用64位數據塊,這主要是由於DES算法的秘鑰太短,只有56位,很容易通過暴力方式破解。目前,DES算法已經被AES算法所取代。
---
### 3DES:
三重數據加密算法,Triple DES,也叫三級DES。3DES 不算是一種新的加密算法,它相當於在DES加密算法之上做的增強。由於DES算法本身的短秘鑰容易被暴力破解,所以3DES通過增加DES的秘鑰長度,使用3個56位的秘鑰對數據進行加密,從而能夠增強安全性,延緩暴力破解的可能。但加密效率會更慢,3DES被認為是DES向AES發展的過度算法。
參考資料:
https://blog.csdn.net/lazyer_dog/article/details/90695895
https://iter01.com/169925.html
https://coderxing.gitbooks.io/architecture-evolution/di-san-pian-ff1a-bu-luo/642-shu-ju-jia-mi/6421-chang-jian-dui-cheng-jia-mi-suan-fa.html