Android 安全加密:非對稱加密詳解
Android安全加密專題文章索引
以上學(xué)習(xí)所有內(nèi)容,對稱加密、非對稱加密、消息摘要、數(shù)字簽名等知識都是為了理解數(shù)字證書工作原理而作為一個(gè)預(yù)備知識。數(shù)字證書是密碼學(xué)里的終極武器,是人類幾千年歷史總結(jié)的智慧的結(jié)晶,只有在明白了數(shù)字證書工作原理后,才能理解Https 協(xié)議的安全通訊機(jī)制。最終才能在SSL 開發(fā)過程中得心應(yīng)手。
另外,對稱加密和消息摘要這兩個(gè)知識點(diǎn)是可以單獨(dú)拿來使用的。
知識點(diǎn)串聯(lián):
數(shù)字證書使用到了以上學(xué)習(xí)的所有知識
- 對稱加密與非對稱加密結(jié)合使用實(shí)現(xiàn)了秘鑰交換,之后通信雙方使用該秘鑰進(jìn)行對稱加密通信。
- 消息摘要與非對稱加密實(shí)現(xiàn)了數(shù)字簽名,根證書機(jī)構(gòu)對目標(biāo)證書進(jìn)行簽名,在校驗(yàn)的時(shí)候,根證書用公鑰對其進(jìn)行校驗(yàn)。若校驗(yàn)成功,則說明該證書是受信任的。
- Keytool 工具可以創(chuàng)建證書,之后交給根證書機(jī)構(gòu)認(rèn)證后直接使用自簽名證書,還可以輸出證書的RFC格式信息等。
- 數(shù)字簽名技術(shù)實(shí)現(xiàn)了身份認(rèn)證與數(shù)據(jù)完整性保證。
- 加密技術(shù)保證了數(shù)據(jù)的保密性,消息摘要算法保證了數(shù)據(jù)的完整性,對稱加密的高效保證了數(shù)據(jù)處理的可靠性,數(shù)字簽名技術(shù)保證了操作的不可否認(rèn)性。
通過以上內(nèi)容的學(xué)習(xí),我們要能掌握以下知識點(diǎn):
- 基礎(chǔ)知識:bit 位、字節(jié)、字符、字符編碼、進(jìn)制轉(zhuǎn)換、io
- 知道怎樣在實(shí)際開發(fā)里怎樣使用對稱加密解決問題
- 知道對稱加密、非對稱加密、消息摘要、數(shù)字簽名、數(shù)字證書是為了解決什么問題而出現(xiàn)的
- 了解SSL 通訊流程
- 實(shí)際開發(fā)里怎樣請求Https 的接口
1. 介紹
與對稱加密算法不同,非對稱加密算法需要兩個(gè)密鑰:公鑰(publickey)和私鑰(privatekey)。公鑰與私鑰是一對,如果用公鑰對數(shù)據(jù)進(jìn)行加密,只有用對應(yīng)的私鑰才能解密;如果用私鑰對數(shù)據(jù)進(jìn)行加密,那么只有用對應(yīng)的公鑰才能解密。因?yàn)榧用芎徒饷苁褂玫氖莾蓚€(gè)不同的密鑰,所以這種算法叫作非對稱加密算法。
簡單理解為:加密和解密是不同的鑰匙
2. 常見算法
RSA、Elgamal、背包算法、Rabin、D-H、ECC(橢圓曲線加密算法)等,其中支付寶使用的就是RSA算法
3. RSA 算法原理
質(zhì)因數(shù)、歐拉函數(shù)、模反元素
原理很復(fù)雜,只需要知道內(nèi)部是基于分解質(zhì)因數(shù)和取模操作即可
4. 使用步驟
//1,獲取cipher 對象 Cipher cipher = Cipher.getInstance("RSA"); //2,通過秘鑰對生成器KeyPairGenerator 生成公鑰和私鑰 KeyPair keyPair = KeyPairGenerator.getInstance("RSA").generateKeyPair(); //使用公鑰進(jìn)行加密,私鑰進(jìn)行解密(也可以反過來使用) PublicKey publicKey = keyPair.getPublic(); PrivateKey privateKey = keyPair.getPrivate(); //3,使用公鑰初始化密碼器 cipher.init(Cipher.ENCRYPT_MODE, publicKey); //4,執(zhí)行加密操作 byte[] result = cipher.doFinal(content.getBytes()); //使用私鑰初始化密碼器 cipher.init(Cipher.DECRYPT_MODE, privateKey); //執(zhí)行解密操作 byte[] deResult = cipher.doFinal(result);
5. 注意點(diǎn)
//一次性加密數(shù)據(jù)的長度不能大于117 字節(jié) private static final int ENCRYPT_BLOCK_MAX = 117; //一次性解密的數(shù)據(jù)長度不能大于128 字節(jié) private static final int DECRYPT_BLOCK_MAX = 128;
6. 分批操作
/** * 分批操作 * * @param content 需要處理的數(shù)據(jù) * @param cipher 密碼器(根據(jù)cipher 的不同,操作可能是加密或解密) * @param blockSize 每次操作的塊大小,單位為字節(jié) * @return 返回處理完成后的結(jié)果 * @throws Exception */ public static byte[] doFinalWithBatch(byte[] content, Cipher cipher, int blockSize) throwseption { int offset = 0;//操作的起始偏移位置 int len = content.length;//數(shù)據(jù)總長度 byte[] tmp;//臨時(shí)保存操作結(jié)果 ByteArrayOutputStream baos = new ByteArrayOutputStream(); //如果剩下數(shù)據(jù) while (len - offset > 0) { if (len - offset >= blockSize) { //剩下數(shù)據(jù)還大于等于一個(gè)blockSize tmp = cipher.doFinal(content, offset, blockSize); }else { //剩下數(shù)據(jù)不足一個(gè)blockSize tmp = cipher.doFinal(content, offset, len - offset); } //將臨時(shí)結(jié)果保存到內(nèi)存緩沖區(qū)里 baos.write(tmp); offset = offset + blockSize; } baos.close(); return baos.toByteArray(); }
7. 非對稱加密用途
身份認(rèn)證
一條加密信息若能用A 的公鑰能解開,則該信息一定是用A 的私鑰加密的,該能確定該用戶是A。
陌生人通信
A 和B 兩個(gè)人互不認(rèn)識,A 把自己的公鑰發(fā)給B,B 也把自己的公鑰發(fā)給A,則雙方可以通過對方的公鑰加密信息通信。C 雖然也能得到A、B 的公鑰,但是他解不開密文。
秘鑰交換
A 先得到B 的公鑰,然后A 生成一個(gè)隨機(jī)秘鑰,例如13245768,之后A 用B 的公鑰加密該秘鑰,得到加密后的秘鑰,例如dxs#fd@dk,之后將該密文發(fā)給B,B 用自己的私鑰解密得到123456,之后雙方使用13245768 作為對稱加密的秘鑰通信。C 就算截獲加密后的秘鑰dxs#fd@dk,自己也解不開,這樣A、B 二人能通過對稱加密進(jìn)行通信。
8. 總結(jié)
非對稱加密一般不會單獨(dú)拿來使用,他并不是為了取代對稱加密而出現(xiàn)的,非對稱加密速度比對稱加密慢很多,極端情況下會慢1000 倍,所以一般不會用來加密大量數(shù)據(jù),通常我們經(jīng)常會將對稱加密和非對稱加密兩種技術(shù)聯(lián)合起來使用,例如用非對稱加密來給稱加密里的秘鑰進(jìn)行加密(即秘鑰交換)。
相關(guān)文章
Android實(shí)現(xiàn)評論欄隨Recyclerview滑動左右移動
這篇文章主要介紹了Android實(shí)現(xiàn)評論欄隨Recyclerview滑動左右移動效果,仿約會吧應(yīng)用詳情頁實(shí)現(xiàn),感興趣的小伙伴們可以參考一下2016-05-05Android之軟鍵盤自動彈出和關(guān)閉【代碼分享】
本文主要介紹了Android中軟鍵盤自動彈出和關(guān)閉的相關(guān)知識。具有很好的參考價(jià)值。下面跟著小編一起來看下吧2017-04-04Android自定義ViewGroup實(shí)現(xiàn)流式布局
這篇文章主要為大家詳細(xì)介紹了Android自定義ViewGroup實(shí)現(xiàn)流式布局,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2020-09-09Android獲取熱點(diǎn)主機(jī)ip和連接熱點(diǎn)手機(jī)ip的代碼
這篇文章主要介紹了Android獲取熱點(diǎn)主機(jī)ip和連接熱點(diǎn)手機(jī)ip的相關(guān)資料,需要的朋友可以參考下2018-01-01Android自定義View實(shí)現(xiàn)廣告信息上下滾動效果
這篇文章主要為大家詳細(xì)介紹了Android自定義View實(shí)現(xiàn)廣告信息上下滾動的具體代碼,感興趣的小伙伴們可以參考一下2016-05-05Android 文件數(shù)據(jù)存儲實(shí)例詳解
這篇文章主要介紹了Android 文件數(shù)據(jù)存儲實(shí)例詳解的相關(guān)資料,這里附有實(shí)例代碼,幫助大家學(xué)習(xí)理解,需要的朋友可以參考下2016-12-12Android ViewPager畫廊效果詳解及實(shí)例
這篇文章主要介紹了Android ViewPager畫廊效果詳解及實(shí)例的相關(guān)資料,這里提供實(shí)例代碼及實(shí)現(xiàn)效果圖,具有參考價(jià)值,需要的朋友可以參考下2016-12-12Android自定義scrollview實(shí)現(xiàn)回彈效果
這篇文章主要為大家詳細(xì)介紹了Android自定義scrollview實(shí)現(xiàn)回彈效果,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2022-04-04