這篇文章是對base64和3des演算法以及他們如何在iphone平台上實現的一點總結。本文吸收了很多前人的資料和成果,在修正了其中的一些錯誤的基礎上新增了自己的理解。在此向前人出色的工作表示感謝。本文主要參考資料如下:
base64加密演算法
base64是網路上最常見的用於傳輸8bit位元組**的編碼方式之一,可用於在http環境下傳遞較長的標識資訊。它的優點是演算法效率高,編碼出來的結果比較簡短,同時也具有不可讀性。
base64要求把每三個8bit的位元組按照每6bit一組的長度分割成四組(3*8 = 4*6 = 24),然後給每組6bit的資料新增兩位高位0,組成四個新的8bit的位元組。也就是說,轉換後的字串理論上將要比原來的長1/3。然後將新產生的四個8bit位元組根據轉換表對映為ascii字元,轉換表如下所示(最後兩個字元的定義在不同的系統中有所不同):
索引 對應字元 索引 對應字元 索引 對應字元 索引 對應字元
0 a 16 q 32 g 48 w
1 b 17 r 33 h 49 x
2 c 18 s 34 i 50 y
3 d 19 t 35 j 51 z
4 e 20 u 36 k 52 0
5 f 21 v 37 l 53 1
6 g 22 w 38 m 54 2
7 h 23 x 39 n 55 3
8 i 24 y 40 o 56 4
9 j 25 z 41 p 57 5
10 k 26 a 42 q 58 6
11 l 27 b 43 r 59 7
12 m 28 c 44 s 60 8
13 n 29 d 45 t 61 9
14 o 30 e 46 u 62 +
15 p 31 f 47 v 63 /
那麼如果原文的位元組數不是3的倍數,即轉換到最後部分時bit數不夠6的倍數該怎麼辦呢?我們規定,當遇到這種情況,不足的bit位使用全0來補足,轉換後需要在密文的末尾新增=號來標註。如果原文剩餘1位元組(即需要補足4位0),那麼就在密文末尾新增兩個=號,如果原文剩餘2位元組(即需要補足2位0),則新增乙個=號,這就是為什麼有些編碼後的結果會以=號結束的原因。
下面舉乙個例子
編碼「man」
「m」的ascii碼 = 77 = 01001101
「a」的 = 97 = 01100001
「n」的 = 110 = 01101110
將這三個位元組拼合,得出乙個24位的資料:
010011010110000101101110
現在六個一組的分開並補高位0,得到4個新的位元組為:
00010011 00010110 00000101 00101110
對應的十進位制值為:
19 22 5 46
對應的ascii字元為
t w f u
所以「man」經過base64加密後的結果為「twfu」。
解碼同理,把 twfu的二進位制位分割,去掉高位0,重組後得到三個8位值,最後得出原碼。
下面是乙個原碼位元組數不是三的倍數的例子:
加密「m」
「m」的ascii碼 = 77 = 01001101
位數不夠6的倍數,補0後變為
六個一組分開是
010011 010000,結果是tq
在密文末尾加兩個「=」,結果就是「tq==」。
3des加密演算法
要理解3des,就必須先搞懂什麼是des。des是美國一種由來已久的加密標準,它的工作原理是將資料按照8個位元組一段進行加密或解密,從而得到一段8個位元組的密文或者明文。之後按照順序將計算所得的資料連在一起即可。這裡需要注意的是,由於des加密解密時要求資料長度必須為8個位元組的倍數,因此當資料長度不足時必須先進行資料填充,這裡使用的填充演算法根據系統的不同可能會略有不同。
des演算法有兩種工作模式,ecb(電子密本方式)和cbc(密文分組鏈結方式),下面具體解釋一下這兩種工作模式的不同。
des ecb其實非常簡單,就是將資料按照8個位元組一段分別進行des加密或解密(不足8個位元組的按照需求先進行資料填充),最後按照順序將加密或解密後的結果連在一起即可,各段資料之間互不影響。
des cbc稍微複雜一些,它在每一段加密或解密的過程中都要與前一段的結果做一次異或操作。同時cbc模式定義了乙個特殊的8位元組key(稱為初始化向量),用以和第一段的結果做異或時用。這種機制使得加密的各段資料之間有了聯絡。
加密步驟如下:
1)首先將資料按照8個位元組一組進行分組得到d1d2……dn(若資料長度不是8位元組的整數倍,先進行資料填充)
2)第一組資料d1與初始化向量i異或後的結果進行des加密得到第一組密文c1
3)第二組資料d2與第一組的加密結果c1異或以後的結果進行des加密,得到第二組密文c2
4)之後的資料以此類推,得到cn
5)按順序連為c1c2c3……cn即為加密結果。
解密是加密的逆過程,步驟如下:
1)首先將資料按照8個位元組一組進行分組得到c1c2c3……cn
2)將第一組資料進行解密後與初始化向量i進行異或得到第一組明文d1(注意:一定是先解密再異或)
3)將第二組資料c2進行解密後與第一組密文資料進行異或得到第二組資料d2
4)之後依此類推,得到dn
5)按順序連為d1d2d3……dn即為解密結果。
這裡注意一點,解密的結果並不一定是我們原來的加密資料,可能還含有你補得位,一定要把補位去掉才是你的原來的資料。
ok,最後我們來說說3des。3des又稱triple des,顧名思義就是三次des演算法。比起最初的des,3des更為安全。它是以des為基本模組,通過組合分組方法設計出的分組加密演算法。設ek()和dk()代表des演算法的加密和解密過程,k代表des演算法使用的金鑰,p代表明文,c代表密文,則3des加密解密的過程可表示為:
c=ek3(dk2(ek1(p)))
p=dk1(ek2(dk3(c)))
這裡可以k1=k3,但不能k1=k2=k3(如果相等的話就成了des演算法了)
3des with 2 diffrent keys(k1=k3),可以是3des-cbc,也可以是3des-ecb,3des-cbc整個演算法的流程和des-cbc一樣,但是在原來的加密或者解密處增加了異或運算的步驟,使用的金鑰是16位元組長度的金鑰,將金鑰分成左8位元組和右8位元組的兩部分,即k1=k3=左8位元組,k2=右8位元組,然後進行加密運算和解密運算。
3des with 3 different keys,和3des-cbc的流程完全一樣,只是使用的金鑰是24位元組的,它將金鑰分為3段8位元組的金鑰k1,k2,k3,在3des加密時依次使用k1、k2、k3,在3des解密時依次使用k3、k2、k1。
3DES加密演算法
des是乙個經典的對稱加密演算法,但也缺陷明顯,即56位的金鑰安全性不足,已被證實可以在短時間內破解。為解決此問題,出現了3des,也稱triple des,3des為des向aes過渡的加密演算法,它使用3條56位的金鑰對資料進行三次加密。為了相容普通的des,3des並沒有直接使用 加密 加密 ...
Base64 加密演算法原理
base64是網路上最常見的用於傳輸8bit位元組碼的編碼方式之一,base64就是一種基於64個可列印字元來表示二進位制資料的方法。因為在記憶體中每個位元組佔8位,即 1 byte 8 bit,所有的資料都可以先轉成ascii碼,然後將對應的ascii碼轉為8位長度的二進位制資料,比如 s 對應 ...
iOS中Base64加密演算法
base64加密演算法 base64是網路上最常見的用於傳輸8bit位元組 的編碼方式之一,可用於在http環境下傳遞較長的標識資訊。它的優點是演算法效率高,編碼出來的結果比較簡短,同時也具有不可讀性。base64要求把每三個8bit的位元組按照每6bit一組的長度分割成四組 3 8 4 6 24 ...