日韩黑丝制服一区视频播放|日韩欧美人妻丝袜视频在线观看|九九影院一级蜜桃|亚洲中文在线导航|青草草视频在线观看|婷婷五月色伊人网站|日本一区二区在线|国产AV一二三四区毛片|正在播放久草视频|亚洲色图精品一区

分享

Android開(kāi)發(fā)資料

 昵稱(chēng)Q99IG 2016-07-24
        有些場(chǎng)合下,例如在要實(shí)現(xiàn)自動(dòng)登錄時(shí)本地存儲(chǔ)用戶的賬號(hào)和密碼,不能用明碼來(lái)標(biāo)識(shí)。這時(shí)候就首先需要對(duì)這些關(guān)鍵信息進(jìn)行加密。對(duì)信息進(jìn)行加密有許多種,下面將詳細(xì)介紹BASE 64編碼的實(shí)現(xiàn),以及自定義BASE 64編碼表以提升解密難度。

        BASE 64編碼要求把3個(gè)8位字節(jié)(3*8=24)轉(zhuǎn)化為4個(gè)6位的字節(jié)(4*6=24),之后在6位的前面補(bǔ)兩個(gè)0,形成8位一個(gè)字節(jié)的形式。在標(biāo)準(zhǔn)BASE 64編碼表中,最后轉(zhuǎn)化的4個(gè)6位字節(jié)都可以用ASCII明碼顯示出來(lái)。以字符串“張3”為例:

        字符串:張3
        原byte數(shù)組:11010101 11000101 00110011  
        編碼后的byte數(shù)組:00110101 00011100 00010100 00110011
        對(duì)應(yīng)十進(jìn)制數(shù)值:53 34 20 51
        標(biāo)準(zhǔn)編碼表對(duì)應(yīng)字符:1 i U z

        可以這么考慮:把字符串的原始字節(jié)數(shù)組連成一串,然后順序依次選6個(gè)出來(lái),之后再把這6二進(jìn)制數(shù)前面再添加兩個(gè)0,就成了一個(gè)新的字節(jié)。之后再選出6個(gè)來(lái),再添加0,依此類(lèi)推,直到24個(gè)二進(jìn)制數(shù)全部被選完,就得到了編碼后的字節(jié)數(shù)組。

        標(biāo)準(zhǔn)的BASE 64為了讓轉(zhuǎn)碼后所有的字符都可見(jiàn),設(shè)計(jì)了如下標(biāo)準(zhǔn)編碼表:

QQ截圖20120803165358.png

2012-8-3 16:54:14 上傳

        依據(jù)此表中十進(jìn)制數(shù)值與字符的映射關(guān)系,最后得到標(biāo)準(zhǔn)編碼表對(duì)應(yīng)字符序列,即字符串最終編碼為“1iUz”。

        由此可見(jiàn),Base64將3個(gè)字節(jié)轉(zhuǎn)變?yōu)?個(gè)字節(jié),因此,編碼后的代碼量(以字節(jié)為單位,下同)約比編碼前的代碼量多了1/3。之所以說(shuō)是“約”,是因?yàn)槿绻a量正好是3的整數(shù)倍,那么自然是多了1/3。

        但如果不是呢?請(qǐng)注意在編碼表中的最后一個(gè)有一個(gè)(pad) =字符。這個(gè)字符的目的就是用來(lái)處理這個(gè)問(wèn)題的。

        當(dāng)代碼量不是3的整數(shù)倍時(shí),代碼量/3的余數(shù)自然就是2或者1。轉(zhuǎn)換的時(shí)候,結(jié)果不夠6位的用0來(lái)補(bǔ)上相應(yīng)的位置,之后再在6位的前面補(bǔ)兩個(gè)0。轉(zhuǎn)換完空出的結(jié)果就用就用“=”來(lái)補(bǔ)位。譬如結(jié)果若最后余下的為2個(gè)字節(jié)的“張”:

        字符串:張
        原byte數(shù)組:11010101 11000101  
        編碼后的byte數(shù)組:00110101 00011100 00010100
        對(duì)應(yīng)十進(jìn)制數(shù)值:53 34 20 pad
        標(biāo)準(zhǔn)編碼表對(duì)應(yīng)字符: 1 i U =

        這樣,最后的2個(gè)字節(jié)被整理成了“1iU=”。

        同理,若原代碼只剩下一個(gè)字節(jié),那么將會(huì)添加兩個(gè)“=”。只有這兩種情況,所以,Base64的編碼最多會(huì)在編碼結(jié)尾有兩個(gè)“=”。

        有人說(shuō)BASE 64嚴(yán)格來(lái)講只能算是編碼算法,而不是加密算法。究其原因,是因?yàn)榇蟛糠諦ASE 64的應(yīng)用使用的都是公開(kāi)的標(biāo)準(zhǔn)編碼表,使得密文可以輕易地被解密。但如果該編碼表是開(kāi)發(fā)者自定義的,即密鑰是開(kāi)發(fā)者私有不共享的,則稱(chēng)BASE 64為加密算法就名正言順了。

        在程序?qū)崿F(xiàn)上,大概可以分為如下幾步:

        1.實(shí)現(xiàn)自定義編碼表。
        2.根據(jù)編碼表計(jì)算出解碼表。代碼如下:

1static {
2        decodingTable = new byte[128];
3        for (int i = 0; i < encodingtable.length;="" i++)="">
4                decodingTable[encodingTable] = (byte) i;
5        }
6}

        3.依據(jù)編碼表對(duì)明文進(jìn)行加密,具體過(guò)程為:

        讀取明文3字節(jié)數(shù)據(jù)用&操作取前6位,放入新的變量中右移兩位,高兩位清0后與編碼表中相應(yīng)值進(jìn)行&操作;取第一個(gè)字節(jié)的后2位和第二個(gè)字節(jié)的前4位移位放入新變量中右移兩位,清0……依此類(lèi)推。

        解碼為編碼的逆過(guò)程。具體代碼實(shí)現(xiàn)請(qǐng)參考本章Demo中的示例代碼。

        Demo運(yùn)行效果如下:

QQ截圖20120803141248.png

2012-8-3 16:50:56 上傳


圖17-3  BASE64編碼與解碼

    本站是提供個(gè)人知識(shí)管理的網(wǎng)絡(luò)存儲(chǔ)空間,所有內(nèi)容均由用戶發(fā)布,不代表本站觀點(diǎn)。請(qǐng)注意甄別內(nèi)容中的聯(lián)系方式、誘導(dǎo)購(gòu)買(mǎi)等信息,謹(jǐn)防詐騙。如發(fā)現(xiàn)有害或侵權(quán)內(nèi)容,請(qǐng)點(diǎn)擊一鍵舉報(bào)。
    轉(zhuǎn)藏 分享 獻(xiàn)花(0

    0條評(píng)論

    發(fā)表

    請(qǐng)遵守用戶 評(píng)論公約

    類(lèi)似文章 更多