非對稱加密

與對稱加密算法不同,非對稱加密算法需要兩個密鑰:公鑰(publickey)私鑰(privatekey)。公鑰與私鑰是一對,如果用公鑰對數(shù)據(jù)進(jìn)行加密,只有用對應(yīng)的私鑰才能解密;如果用私鑰對數(shù)據(jù)進(jìn)行加密,那么只有用對應(yīng)的公鑰才能解密。因?yàn)榧用芎徒饷苁褂玫氖莾蓚€不同的密鑰,所以這種算法叫作非對稱加密算法。
簡單理解為:加密和解密是不同的鑰匙

Paste_Image.png

常見算法

RSA、Elgamal、背包算法、Rabin、D-H、ECC(橢圓曲線加密算法)等

RSA 算法原理

質(zhì)因數(shù)、歐拉函數(shù)、模反元素
原理很復(fù)雜,只需要知道內(nèi)部是基于分解質(zhì)因數(shù)和取模操作即可

使用步驟

1. //1,獲取cipher 對象
2. Cipher cipher = Cipher.getInstance("RSA");
3. //2,通過秘鑰對生成器KeyPairGenerator 生成公鑰和私鑰
4. KeyPair keyPair = KeyPairGenerator.getInstance("RSA").generateKeyPair();
5. //使用公鑰進(jìn)行加密,私鑰進(jìn)行解密(也可以反過來使用)
6. PublicKey publicKey = keyPair.getPublic();
7. PrivateKey privateKey = keyPair.getPrivate();
8. //3,使用公鑰初始化密碼器
9. cipher.init(Cipher.ENCRYPT_MODE, publicKey);
10. //4,執(zhí)行加密操作
11. byte[] result = cipher.doFinal(content.getBytes());
12. //使用私鑰初始化密碼器
13. cipher.init(Cipher.DECRYPT_MODE, privateKey);
14. //執(zhí)行解密操作
15. byte[] deResult = cipher.doFinal(result);

注意點(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;

分批操作

5. /**
6. * 分批操作
7. *
8. * @param content 需要處理的數(shù)據(jù)
9. * @param cipher 密碼器(根據(jù)cipher 的不同,操作可能是加密或解密)
10. * @param blockSize 每次操作的塊大小,單位為字節(jié)
11. * @return 返回處理完成后的結(jié)果
12. * @throws Exception
13. */
14. public static byte[] doFinalWithBatch(byte[] content, Cipher cipher, int blockSize) throws
Exception {
15. int offset = 0;//操作的起始偏移位置
16. int len = content.length;//數(shù)據(jù)總長度
17. byte[] tmp;//臨時保存操作結(jié)果
18. ByteArrayOutputStream baos = new ByteArrayOutputStream();
19. //如果剩下數(shù)據(jù)
20. while (len - offset > 0) {
21. if (len - offset >= blockSize) {
22. //剩下數(shù)據(jù)還大于等于一個blockSize
23. tmp = cipher.doFinal(content, offset, blockSize);
24. }else {
25. //剩下數(shù)據(jù)不足一個blockSize
26. tmp = cipher.doFinal(content, offset, len - offset);
27. }
28. //將臨時結(jié)果保存到內(nèi)存緩沖區(qū)里
29. baos.write(tmp);
30. offset = offset + blockSize;
31. }
32. baos.close();
33. return baos.toByteArray();
34. }

非對稱加密用途

1,身份認(rèn)證
一條加密信息若能用A 的公鑰能解開,則該信息一定是用A 的私鑰加密的,該能確定該用戶是A。

Paste_Image.png

2,陌生人通信
A 和B 兩個人互不認(rèn)識,A 把自己的公鑰發(fā)給B,B 也把自己的公鑰發(fā)給A,則雙方可以通過對方的公鑰加密信息通信。C 雖然也能得到A、B 的公鑰,但是他解不開密文。

Paste_Image.png

3,秘鑰交換
A 先得到B 的公鑰,然后A 生成一個隨機(jī)秘鑰,例如13245768,之后A 用B 的公鑰加密該秘鑰,得到加密后的秘鑰,例如d#@$12sd,之后將該密文發(fā)給B,B 用自己的私鑰解密得到123456,之后雙方使用13245768 作為對稱加密的秘鑰通信。C 就算截獲加密后的秘鑰d#@$12*asd,自己也解不開,這樣A、B 二人能通過對稱加密進(jìn)行通信。

Paste_Image.png

總結(jié)

非對稱加密一般不會單獨(dú)拿來使用,他并不是為了取代對稱加密而出現(xiàn)的,非對稱加密速度比對稱加密慢很多,極端情況下會慢1000 倍,所以一般不會用來加密大量數(shù)據(jù),通常我們經(jīng)常會將對稱加密和非對稱加密兩種技術(shù)聯(lián)合起來使用,例如用非對稱加密來給對稱加密里的秘鑰進(jìn)行加密(即秘鑰交換).

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容