Base64是網絡上最多見的用於傳輸8Bit字節代碼的編碼方式之一,本質上是一種將二進制數據轉成文本數據的方案,對於非二進制數據,是先將其轉換成二進制形式,而後每連續6比特(2的6次方=64)計算其十進制值,根據該值在A--Z,a--z,0--9,+,/ 這64個字符中找到對應的字符,最終獲得一個文本字符串。html
嚴格來說,Base64只能算是一個編碼算法,並非安全領域的加密算法。 標準Base64編碼解碼無需額外信息即徹底可逆,即便你本身自定義字符集設計一種類Base64的編碼方式用於數據加密,在多數場景下也較容易破解。
標準Base64只有64個字符:英文大小寫(A-Z、a-z)、數字(0-9)、加號(+)、斜槓(/)和用做後綴的等號(=);
java
1 bit = 1 二進制數據 1 byte = 8 bit 1 字母 = 1 byte = 8 bit 1 漢字 = 2 byte = 16 bit
標點符號:android
A>. 漢字輸入狀態下,默認爲全角輸入方式,標點符號佔2字節; B>. 英文輸入狀態下,默認爲半角輸入方式,標點符號佔1字節;
轉換前 10101101,10111010,01110110 轉換後 00101011, 00011011 ,00101001 ,00110110 十進制 43 27 41 54 對應Base64編碼表中的值 r b p 2
如上,轉換前,Base64收到一個8位字節的序列,首先將這個序列分割成6位的字節序列,而後在每一位的高位補兩個0,組成8位的字節序列,也就是轉換後的字節長度增長了13;再講補0後的二進制轉換成Base64編碼表中對應的值;git
base64編碼收到一個8位字節序列,將這個二進制序列流劃分紅6位的塊。二進制序列有時不能正好平均地分爲6位的塊,在這種狀況下,就在序列末尾填充零位,使二進制序列的長度成爲24的倍數(6和8的最小公倍數)。github
對已填充的二進制進行編碼時,任何徹底填充(不包括原始數組中的位)的6位組都有特殊的第65個符號"="表示。若是6位組是部分填充的,就將填充位設置爲0.算法
借用張亞濤 的一個例子說明:segmentfault
a:a -- 011000 010011 101001 100001 -- YTph a:aa -- 011000 010011 101001 100001 011000 01xxxx xxxxxx xxxxxx -- YTphYQ== a:aaa -- 011000 010011 101001 100001 011000 010110 0001xx xxxxxx -- YTphYWE= a:aaaa -- 011000 010011 101001 100001 011000 010110 000101 1000001 -- YTphYWFh
如上,初始輸入字符串爲"a:a"爲3個字節(24位)。24是6和8的倍數,所以按照上面給出的例子計算。無需填充就會獲得base64編碼爲"YTph"。 然而,再增長一個字符,輸入字符串變爲"a:aa",轉換爲二進制就會有32位長。而6和8的下一個公倍數爲48.所以要添加16爲的填充碼。填充的前4位是與數據位混合在一塊兒的。獲得的6位組01xxxx,會被看成010000、十進制中的16,或者base64編碼的Q來處理。剩下的兩個6位組都是填充碼,用=來表示。數組
DEFAULT:使用默認的方法來加密 NO_PADDING:略去加密字符串最後的「=」 NO_WRAP:略去全部的換行符(設置後CRLF就沒用了) CRLF:使用CR LF這一對做爲一行的結尾而不是Unix風格的LF URL_SAFE:加密時不使用對URL和文件名有特殊意義的字符來做爲加密字符,具體以-和_取代+和/
索引 | 對應字符 | 索引 | 對應字符 | 索引 | 對應字符 | 索引 | 對應字符 |
---|---|---|---|---|---|---|---|
0 | A | 17 | R | 34 | i | 51 | Z |
1 | B | 18 | S | 35 | j | 52 | 0 |
2 | C | 19 | T | 36 | k | 53 | 1 |
3 | D | 20 | U | 37 | l | 54 | 2 |
4 | E | 21 | V | 38 | m | 55 | 3 |
5 | F | 22 | W | 39 | n | 56 | 4 |
6 | G | 23 | X | 40 | o | 57 | 5 |
7 | H | 24 |
|
41 | p | 58 | 6 |
8 | I | 25 | Z | 42 | q | 59 | 7 |
9 | J | 26 | a | 43 | r | 60 | 8 |
10 | K | 27 | b | 44 | s | 61 | 9 |
11 | L | 28 | c | 45 | t | 62 | + |
12 | M | 29 | d | 46 | u | 63 | / |
13 | N | 30 | e | 47 | v | ||
14 | O | 31 | f | 48 | w | ||
15 | P | 32 | g | 49 | x | ||
16 | Q | 33 | h | 50 | y |
MD2算法中,首先對信息進行數據補位,使信息的字節長度是16的倍數。而後,以一個16位的檢驗和追加到信息末尾。而且根據這個新產生的信息計算出散列值。若是忽略了檢驗和將產生MD2衝突。MD2算法的加密後結果是惟一的,即沒有重複。安全
MD4算法一樣須要填補信息以確保信息的字節長度加上64後能被512整除(信息字節長度mod 512 = 448)。而後,一個以64位二進制表示的信息的最初長度被添加進來。信息被處理成512位Damg?rd/Merkle迭代結構的區塊,並且每一個區塊要經過三個不一樣步驟的處理。服務器
MD5爲計算機安全領域普遍使用的一種散列函數,用以提供消息的完整性保護。
MD5以512位分組來處理輸入的信息,且每一分組又被劃分爲16個32位子分組,通過了一系列的處理後,算法的輸出由四個32位分組組成,將這四個32位分組級聯後將生成一個128位散列值。
一、壓縮性:任意長度的數據,算出的MD5值長度都是固定的。 二、容易計算:從原數據計算出MD5值很容易。 三、抗修改性:對原數據進行任何改動,哪怕只修改1個字節,所獲得的MD5值都有很大區別。 四、強抗碰撞:已知原數據和其MD5值,想找到一個具備相同MD5值的數據(即僞造數據)是很是困難的。
md5算法主要運用在數字簽名、文件完整性驗證以及口令加密(安全訪問認證)等方面。
RSA加密算法是一種非對稱加密算法。是第一個能同時用於加密和數字簽名的算法,也易於理解和操做。
先生成一對RSA密鑰,保密密鑰用戶保存,公開密鑰可對外公開,甚至可在網絡服務器中註冊。爲提升保密強度,RSA密鑰至少爲500位長,通常推薦使用1024位。這就使加密的計算量很大。爲減小計算量,在傳送信息時,常採用傳統加密方法與公開密鑰加密方法相結合的方式,即信息採用改進的DES或IDEA對話密鑰加密,而後使用RSA密鑰加密對話密鑰和信息摘要。對方收到信息後,用不一樣的密鑰解密並可覈對信息摘要。
RSA涉及三個參數:N,e1,e2
1.隨機選擇兩個大質數p和q,p不等於q,計算N=pq;N的二進制表示時所佔用的位數,就是所謂的密鑰長度; 2.根據歐拉函數,求得r=(p-1)*(q-1); 3.選擇小於r的e1,e1能夠任意取,但要求e1與r互質; 4.選擇e2,e2爲e1關於r的模反元素,即:(e1*e2)=1(mod r); 4.銷燬p,q;
(n,e1),(n,e2)就是密鑰對。其中(n,e1)爲公鑰,(n,e2)爲私鑰。
RSA加解密的算法徹底相同,設A爲明文,B爲密文,則:A≡B^e2( mod n);B≡A^e1 (mod n);(公鑰加密體制中,通常用公鑰加密,私鑰密)
e1和e2能夠互換使用,即:A≡B^e1 (mod n);B≡A^e2( mod n);
RSA算法基於一個十分簡單的數論事實:將兩個大質數相乘十分容易,可是想要對其乘積進行因式分解卻極其困難,所以能夠將乘積公開做爲加密密鑰。
SHA-3:2015年正式發佈,SHA-3並非要取代SHA-2,由於SHA-2目前並無出現明顯的弱點。因爲對MD5出現成功的破解,以及對SHA-0和SHA-1出現理論上破解的方法,NIST感受須要一個與以前演算法不一樣的,可替換的加密雜湊演算法,也就是如今的SHA-3。
其中規定了SHA-1,SHA-224,SHA-256,SHA-384,和SHA-512這幾種單向散列算法。SHA-1,SHA-224和SHA-256適用於長度不超過2^64二進制位的消息。SHA-384和SHA-512適用於長度不超過2^128二進制位的消息。
SHA-1是一種數據加密算法,該算法的思想是接收一段明文,而後以一種不可逆的方式將它轉換成一段(一般更小)密文,也能夠簡單的理解爲取一串輸入碼(稱爲預映射或信息),並把它們轉化爲長度較短、位數固定的輸出序列即散列值(也稱爲信息摘要或信息認證代碼)的過程。散列函數值能夠說是對明文的一種「指紋」或是「摘要」,因此對散列值的數字簽名就能夠視爲對此明文的數字簽名。
SHA-1是一種可以根據上限爲2^64位的消息計算出160比特的散列值的單向散列函數,它的分組及對數據的填充方式與MD5是同樣的,512位爲1組,填充數據時先填1,後面填0,一直填滿448位,最後64位表示原始數據長度。
SHA-224
暫時知道SHA-224不支持Android4.2.2版本