Android中加解密算法大全

Base64編碼

Base64是網絡上最多見的用於傳輸8Bit字節代碼的編碼方式之一,本質上是一種將二進制數據轉成文本數據的方案,對於非二進制數據,是先將其轉換成二進制形式,而後每連續6比特(2的6次方=64)計算其十進制值,根據該值在A--Z,a--z,0--9,+,/ 這64個字符中找到對應的字符,最終獲得一個文本字符串。html

嚴格來說,Base64只能算是一個編碼算法,並非安全領域的加密算法。

標準Base64編碼解碼無需額外信息即徹底可逆,即便你本身自定義字符集設計一種類Base64的編碼方式用於數據加密,在多數場景下也較容易破解。

Base64編碼基本規則以下幾點

  • 標準Base64只有64個字符:英文大小寫(A-Z、a-z)、數字(0-9)、加號(+)、斜槓(/)和用做後綴的等號(=);
    java

  • Base64是把3個字節變成4個可打印字符,因此Base64編碼後的字符串必定能被4整除(不算用做後綴的等號)

  • 等號必定用做後綴,且數目必定是0個、1個或2個。這是由於若是原文長度不能被3整除,Base64要在後面添加\0湊齊3n位。爲了正確還原,添加了幾個0就加上幾個等號。顯然添加等號的數目只能是0、1或2;
  • 拓展:位、字節、英文字符、漢字、標點符號之間的關係

    1 bit = 1  二進制數據
    1 byte  = 8  bit
    1 字母 = 1  byte = 8 bit
    1 漢字 = 2  byte = 16 bit

    標點符號:android

    A>.  漢字輸入狀態下,默認爲全角輸入方式,標點符號佔2字節;
    B>.  英文輸入狀態下,默認爲半角輸入方式,標點符號佔1字節;

    Base64編碼原理

  • 轉換原理
  • 轉換前     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

  • 填充0原理
  • 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位組都是填充碼,用=來表示。數組

    Base64參數說明

    DEFAULT:使用默認的方法來加密
    NO_PADDING:略去加密字符串最後的「=」
    NO_WRAP:略去全部的換行符(設置後CRLF就沒用了)
    CRLF:使用CR LF這一對做爲一行的結尾而不是Unix風格的LF
    URL_SAFE:加密時不使用對URL和文件名有特殊意義的字符來做爲加密字符,具體以-和_取代+和/

    Base64解碼

    Base64編碼表

    索引 對應字符 索引 對應字符 索引 對應字符 索引 對應字符
    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

    Message-Digest Algorithm 5:(簡稱MD5)——信息-摘要算法

    傳送至加密算法代碼位置

    MD二、MD四、MD5區別

    MD2

    MD2算法中,首先對信息進行數據補位,使信息的字節長度是16的倍數。而後,以一個16位的檢驗和追加到信息末尾。而且根據這個新產生的信息計算出散列值。若是忽略了檢驗和將產生MD2衝突。MD2算法的加密後結果是惟一的,即沒有重複。安全

    MD4

    MD4算法一樣須要填補信息以確保信息的字節長度加上64後能被512整除(信息字節長度mod 512 = 448)。而後,一個以64位二進制表示的信息的最初長度被添加進來。信息被處理成512位Damg?rd/Merkle迭代結構的區塊,並且每一個區塊要經過三個不一樣步驟的處理。服務器

    MD5

    MD5爲計算機安全領域普遍使用的一種散列函數,用以提供消息的完整性保護。

    MD5原理

    MD5以512位分組來處理輸入的信息,且每一分組又被劃分爲16個32位子分組,通過了一系列的處理後,算法的輸出由四個32位分組組成,將這四個32位分組級聯後將生成一個128位散列值。

    MD5的特性

    一、壓縮性:任意長度的數據,算出的MD5值長度都是固定的。
    二、容易計算:從原數據計算出MD5值很容易。
    三、抗修改性:對原數據進行任何改動,哪怕只修改1個字節,所獲得的MD5值都有很大區別。
    四、強抗碰撞:已知原數據和其MD5值,想找到一個具備相同MD5值的數據(即僞造數據)是很是困難的。

    MD5應用場景

    md5算法主要運用在數字簽名、文件完整性驗證以及口令加密(安全訪問認證)等方面。

    RSA加密


    RSA基本含義

    RSA加密算法是一種非對稱加密算法。是第一個能同時用於加密和數字簽名的算法,也易於理解和操做。

    先生成一對RSA密鑰,保密密鑰用戶保存,公開密鑰可對外公開,甚至可在網絡服務器中註冊。爲提升保密強度,RSA密鑰至少爲500位長,通常推薦使用1024位。這就使加密的計算量很大。爲減小計算量,在傳送信息時,常採用傳統加密方法與公開密鑰加密方法相結合的方式,即信息採用改進的DES或IDEA對話密鑰加密,而後使用RSA密鑰加密對話密鑰和信息摘要。對方收到信息後,用不一樣的密鑰解密並可覈對信息摘要。

    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算法基於一個十分簡單的數論事實:將兩個大質數相乘十分容易,可是想要對其乘積進行因式分解卻極其困難,所以能夠將乘積公開做爲加密密鑰。

    其餘說明

    • 典型密鑰長度:1997年後開發的系統,用戶應使用1024位密鑰,證書認證機構應用2048位或以上;

    • 參考資料

    Secure Hash Algorithm(簡稱SHA)——安全散列算法


    加密代碼傳送

    • SHA-1 Hash/Hmac加密

      SHA基本含義


      SHA主要適用於數字簽名標準(Digital Signature Standard DSS)裏面定義的數字簽名算法(Digital Signature Algorithm DSA)。對於長度小於2^64位的消息,SHA1會產生一個160位的消息摘要。
    SHA家族的演算法,由美國國家安全局(NSA)所設計,並由美國國家標準與技術研究院(NIST)發佈的國家標準FIPS PUB 180,最新的標準已經於2008年更新到FIPS PUB 180-3,其分別是:
    • SHA-0:1993年發佈,當時稱作安全散列標準(Secure Hash Standard),發佈以後很快就被NSA撤回,是SHA-1的前身。
    • SHA-1:1995年發佈,SHA-1在許多安全協定中廣爲使用,包括TLS和SSL、PGP、SSH、S/MIME和IPsec,曾被視爲是MD5(更早以前被廣爲使用的雜湊函數)的後繼者。但SHA-1的安全性在2000年之後已經不被大多數的加密場景所接受。2017年荷蘭密碼學研究小組CWI和Google正式宣佈攻破了SHA-1。
    • SHA-2:2001年發佈,包括SHA-22四、SHA-25六、SHA-38四、SHA-5十二、SHA-512/22四、SHA-512/256。雖然至今還沒有出現對SHA-2有效的攻擊,它的演算法跟SHA-1基本上仍然類似;所以有些人開始發展其餘替代的雜湊演算法。
    • 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是一種數據加密算法,該算法的思想是接收一段明文,而後以一種不可逆的方式將它轉換成一段(一般更小)密文,也能夠簡單的理解爲取一串輸入碼(稱爲預映射或信息),並把它們轉化爲長度較短、位數固定的輸出序列即散列值(也稱爲信息摘要或信息認證代碼)的過程。散列函數值能夠說是對明文的一種「指紋」或是「摘要」,因此對散列值的數字簽名就能夠視爲對此明文的數字簽名。

    SHA-1原理

    SHA-1是一種可以根據上限爲2^64位的消息計算出160比特的散列值的單向散列函數,它的分組及對數據的填充方式與MD5是同樣的,512位爲1組,填充數據時先填1,後面填0,一直填滿448位,最後64位表示原始數據長度。

    SHA-224

    暫時知道SHA-224不支持Android4.2.2版本

    持續更新中, 瞭解更多——GitHub傳送門

    相關文章
    相關標籤/搜索