Android加密

一残拐、RSA算法

1.簡(jiǎn)介

RSA算法是一種非對(duì)稱加密算法涎拉,也就是加密用的鑰匙和解密用的鑰匙瑞侮,并不是同一把鑰匙。非對(duì)稱加密首先會(huì)創(chuàng)建兩把鑰匙鼓拧,而這兩把鑰匙是成對(duì)的半火,分別稱為公鑰私鑰。加密時(shí)我們使用公鑰進(jìn)行加密季俩,而在解密時(shí)必須使用私鑰才能進(jìn)行解密钮糖,這就是非對(duì)稱加密算法。

假如使用非對(duì)稱加密种玛,甲(客戶端)發(fā)送消息給乙(服務(wù)端)藐鹤,這時(shí)候乙(服務(wù)端)會(huì)預(yù)先創(chuàng)建好兩把鑰匙瓤檐,私鑰乙(服務(wù)端)自己保存好,然后把公鑰發(fā)送給甲(客戶端)娱节,甲(客戶端)使用公鑰對(duì)信息加密挠蛉,然后傳給乙(服務(wù)端),最后乙(服務(wù)端)使用自己的私鑰對(duì)數(shù)據(jù)進(jìn)行解密肄满。
這個(gè)過(guò)程中谴古,公鑰還是有可能被第三者所截獲,但是不同的是稠歉,這個(gè)第三者縱然得到了公鑰掰担,也無(wú)法解開(kāi)密文,因?yàn)榻饷苊芪乃枰乃借€從始至終一直在乙(服務(wù)端)的手里怒炸。因此這個(gè)過(guò)程是安全的带饱。

二、AES算法

1.簡(jiǎn)介

AES算法是一種對(duì)稱加密算法阅羹,原文經(jīng)過(guò)了一把鑰匙(密鑰)加密后變成了密文勺疼,然后將密文傳遞給接收方,接收方再用這把鑰匙(密鑰)解開(kāi)密文捏鱼。這個(gè)過(guò)程中执庐,加密和解密使用的是同一把鑰匙,這種加密方式稱為對(duì)稱加密导梆。

AES加密方式比DES加密更安全轨淌,但是速度比不上DES,但在不同運(yùn)行環(huán)境下能保持良好的性能看尼。

2.AES加密模式

2.1.AES一共有5種加密模式:
1.ECB(Electronic Code Book) 電碼本模式
2.CBC(Cipher Block Chaining) 密碼分組鏈接模式
3.CFB(Cipher FeedBack Mode) 密碼反饋模式(較復(fù)雜)
4.OFB(Output FeedBack) 輸出反饋模式(較復(fù)雜)
5.CTR(Counter) 計(jì)數(shù)器模式(不常見(jiàn))

其中ECB.CBC.CTR為塊加密模式递鹉;CFB.OFB為流加密模式

2.2.詳細(xì)介紹
1.ECB電碼本模式
這種模式是將整個(gè)明文分成若干段相同的小段,然后對(duì)每一小段進(jìn)行加密狡忙。

image.png

2.CBC密碼分組鏈接模式
這種模式是先將明文切分成若干小段梳虽,然后每一小段與初始?jí)K或者上一段的密文段進(jìn)行異或后,再與密鑰進(jìn)行加密灾茁。

image.png

3.CTR計(jì)算器模式:
此模式不常見(jiàn)窜觉,在CTR模式中,有一個(gè)自增的算子北专,這個(gè)算子用密鑰加密之后的輸出和明文異或的結(jié)果得到密文禀挫,相當(dāng)于一次一密。這種方式簡(jiǎn)單快速拓颓,安全可靠语婴,而且可以并行加密,但是在計(jì)算器不能維持很長(zhǎng)的情況下,密鑰只能使用一次砰左。


image.png

4.CFB密碼反饋模式:


image.png

5.OFB輸出反饋模式:


image.png

三匿醒、實(shí)例

1.背景

Android應(yīng)用中通過(guò)對(duì)一個(gè)json數(shù)據(jù)進(jìn)行加密后傳輸給后端進(jìn)行解密驗(yàn)證

2.RSA方式

1.公鑰加密

import android.util.Base64;//導(dǎo)包要用android的,如果用java的缠导,會(huì)有換行導(dǎo)致的轉(zhuǎn)義字符問(wèn)題
public class RSAUtil{
  //公鑰
    public static String publicKey="跟Java端同樣的公鑰";

    /**
     * 使用公鑰加密
     * @param data 待加密的數(shù)據(jù)
     * @return
     * @throws Exception
     */
    public static String encryptByPublicKey(String data) throws Exception {
        // 得到公鑰對(duì)象
        KeyFactory keyFactory = KeyFactory.getInstance("RSA");//SA算法
        byte[] decodeKey = Base64.decode(publicKey.getBytes(), Base64.DEFAULT);
        X509EncodedKeySpec keySpec = new X509EncodedKeySpec(decodeKey);
        PublicKey pubKey = keyFactory.generatePublic(keySpec);
        // 加密數(shù)據(jù)廉羔,加密方式:1.標(biāo)準(zhǔn)jdk的:RSA/None/PKCS1Padding;2.android的:RSA/None/NoPadding
        Cipher cp = Cipher.getInstance("RSA/None/PKCS1Padding");
        cp.init(Cipher.ENCRYPT_MODE, pubKey);
        byte[] encrypted = cp.doFinal(data.getBytes("UTF-8"));
        return Base64.encodeToString(encrypted, Base64.DEFAULT);
    }

}

public class A{
       JSONObject reqbody = new JSONObject();
       String encrypt = "";
   try {
          reqbody.put("name", "XXX");
          encrypt = RSAUtil.encrypt(reqbody.toString());
     } catch (Exception e) {
        e.printStackTrace();
     }
}

將encrypt(加密后的json串)作為接口調(diào)用的參數(shù)傳遞到服務(wù)端進(jìn)行解密

2.公鑰分段加密
當(dāng)加密的數(shù)據(jù)過(guò)長(zhǎng)時(shí),解密時(shí)會(huì)出現(xiàn)javax.crypto.IllegalBlockSizeException: Data must not be longer than 117 bytes的異常僻造。因?yàn)镽SA算法規(guī)定一次加密的數(shù)據(jù)不能超過(guò)生成密鑰對(duì)時(shí)的keyLength/8-11憋他,keyLength一般是1024個(gè)字節(jié),則加密的數(shù)據(jù)不能超過(guò)117個(gè)字節(jié)髓削;

https://cloud.tencent.com/developer/article/1730404

3.AES方式

public class AESUtil{
    private static final String TRANSFORMATION = "AES/CBC/PKCS5Padding";
    private static final String IVPARAMETER = "";//偏移量,可自行修改
    private static final String CMCS_KEY = "";//key竹挡,可自行修改

     /**
     * 加密
     * @param data 要加密的數(shù)據(jù)
     */
    public static String encrypt(String data) throws Exception {
        Cipher cipher = Cipher.getInstance(TRANSFORMATION);
        byte[] raw = CMCS_KEY.getBytes("UTF-8");
        //獲取密鑰
        SecretKeySpec skeySpec = new SecretKeySpec(raw, "AES");
        IvParameterSpec iv = new IvParameterSpec(IVPARAMETER.getBytes());// 使用CBC模式,需要一個(gè)向量iv立膛,可增加加密算法的強(qiáng)度
        cipher.init(Cipher.ENCRYPT_MODE, skeySpec, iv);
        byte[] encrypted = cipher.doFinal(data.getBytes("UTF-8"));
        return Base64.encodeToString(encrypted, Base64.DEFAULT);
    }
}

public class A{
        JSONObject reqbody = new JSONObject();
        String encrypt = "";
   try {
           reqbody.put("name", "XXX");
           encrypt = AESUtil.encrypt(reqbody.toString());
      } catch (Exception e) {
          e.printStackTrace();
    }
}

將encrypt(加密后的json串)作為接口調(diào)用的參數(shù)傳遞到服務(wù)端進(jìn)行解密

參考:
RSA加密
https://www.cnblogs.com/badaoliumangqizhi/p/14166479.html
AES加密
http://www.reibang.com/p/19b3c7acecb2

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末揪罕,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子旧巾,更是在濱河造成了極大的恐慌耸序,老刑警劉巖,帶你破解...
    沈念sama閱讀 218,525評(píng)論 6 507
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件鲁猩,死亡現(xiàn)場(chǎng)離奇詭異,居然都是意外死亡罢坝,警方通過(guò)查閱死者的電腦和手機(jī)廓握,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,203評(píng)論 3 395
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái)嘁酿,“玉大人隙券,你說(shuō)我怎么就攤上這事∧炙荆” “怎么了娱仔?”我有些...
    開(kāi)封第一講書(shū)人閱讀 164,862評(píng)論 0 354
  • 文/不壞的土叔 我叫張陵,是天一觀的道長(zhǎng)游桩。 經(jīng)常有香客問(wèn)我牲迫,道長(zhǎng),這世上最難降的妖魔是什么借卧? 我笑而不...
    開(kāi)封第一講書(shū)人閱讀 58,728評(píng)論 1 294
  • 正文 為了忘掉前任盹憎,我火速辦了婚禮,結(jié)果婚禮上铐刘,老公的妹妹穿的比我還像新娘陪每。我一直安慰自己,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,743評(píng)論 6 392
  • 文/花漫 我一把揭開(kāi)白布檩禾。 她就那樣靜靜地躺著挂签,像睡著了一般。 火紅的嫁衣襯著肌膚如雪盼产。 梳的紋絲不亂的頭發(fā)上饵婆,一...
    開(kāi)封第一講書(shū)人閱讀 51,590評(píng)論 1 305
  • 那天,我揣著相機(jī)與錄音辆飘,去河邊找鬼啦辐。 笑死,一個(gè)胖子當(dāng)著我的面吹牛蜈项,可吹牛的內(nèi)容都是我干的芹关。 我是一名探鬼主播,決...
    沈念sama閱讀 40,330評(píng)論 3 418
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼紧卒,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼侥衬!你這毒婦竟也來(lái)了?” 一聲冷哼從身側(cè)響起跑芳,我...
    開(kāi)封第一講書(shū)人閱讀 39,244評(píng)論 0 276
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤轴总,失蹤者是張志新(化名)和其女友劉穎,沒(méi)想到半個(gè)月后博个,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體怀樟,經(jīng)...
    沈念sama閱讀 45,693評(píng)論 1 314
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,885評(píng)論 3 336
  • 正文 我和宋清朗相戀三年盆佣,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了往堡。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 40,001評(píng)論 1 348
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡共耍,死狀恐怖虑灰,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情痹兜,我是刑警寧澤穆咐,帶...
    沈念sama閱讀 35,723評(píng)論 5 346
  • 正文 年R本政府宣布,位于F島的核電站字旭,受9級(jí)特大地震影響对湃,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜谐算,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,343評(píng)論 3 330
  • 文/蒙蒙 一熟尉、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧洲脂,春花似錦斤儿、人聲如沸剧包。這莊子的主人今日做“春日...
    開(kāi)封第一講書(shū)人閱讀 31,919評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)疆液。三九已至,卻和暖如春陕贮,著一層夾襖步出監(jiān)牢的瞬間堕油,已是汗流浹背。 一陣腳步聲響...
    開(kāi)封第一講書(shū)人閱讀 33,042評(píng)論 1 270
  • 我被黑心中介騙來(lái)泰國(guó)打工肮之, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留掉缺,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 48,191評(píng)論 3 370
  • 正文 我出身青樓戈擒,卻偏偏與公主長(zhǎng)得像眶明,于是被迫代替她去往敵國(guó)和親。 傳聞我的和親對(duì)象是個(gè)殘疾皇子筐高,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,955評(píng)論 2 355

推薦閱讀更多精彩內(nèi)容