詳解Java利用實(shí)現(xiàn)對(duì)稱加密(DES、3DES、AES)
有兩句話是這么說(shuō)的:
1)算法和數(shù)據(jù)結(jié)構(gòu)就是編程的一個(gè)重要部分,你若失掉了算法和數(shù)據(jù)結(jié)構(gòu),你就把一切都失掉了。
2)編程就是算法和數(shù)據(jù)結(jié)構(gòu),算法和數(shù)據(jù)結(jié)構(gòu)是編程的靈魂。
注意,這可不是我說(shuō)的,是無(wú)數(shù)程序員總結(jié)的,話說(shuō)的很實(shí)在也很精辟,若想長(zhǎng)久可持續(xù)發(fā)展,多研究算法還是很有必要的,今天我給大家說(shuō)說(shuō)加密算法中的對(duì)稱加密算法,并且這里將教會(huì)大家對(duì)稱加密算法的編程使用。包含DES、3DES和AES三種對(duì)稱加密算法的編程使用,干貨滿滿。
1.對(duì)稱密碼算法
對(duì)稱密碼算法是當(dāng)今應(yīng)用范圍最廣,使用頻率最高的加密算法。它不僅應(yīng)用于軟件行業(yè),在硬件行業(yè)同樣流行。各種基礎(chǔ)設(shè)施凡是涉及到安全需求,都會(huì)優(yōu)先考慮對(duì)稱加密算法。
對(duì)稱密碼算法的加密密鑰和解密密鑰相同,對(duì)于大多數(shù)對(duì)稱密碼算法,加解密過(guò)程互逆。
(1)加解密通信模型
(2)特點(diǎn):算法公開(kāi)、計(jì)算量小、加密速度快、加密效率高
(3)弱點(diǎn):雙方都使用同樣密鑰,安全性得不到保證
對(duì)稱密碼有流密碼和分組密碼兩種,但是現(xiàn)在普遍使用的是分組密碼:
(4)分組密碼工作模式
1)ECB:電子密碼本(最常用的,每次加密均產(chǎn)生獨(dú)立的密文分組,并且對(duì)其他的密文分組不會(huì)產(chǎn)生影響,也就是相同的明文加密后產(chǎn)生相同的密文)
2)CBC:密文鏈接(常用的,明文加密前需要先和前面的密文進(jìn)行異或運(yùn)算,也就是相同的明文加密后產(chǎn)生不同的密文)
除了這兩種常用的工作模式,還有:
3)CFB:密文反饋
4)OFB:輸出反饋
5)CTR:計(jì)數(shù)器
這五種工作模式主要是密碼學(xué)中算法在進(jìn)行推導(dǎo)演算的時(shí)候所應(yīng)用到的。
6.分組密碼填充方式
1)NoPadding:無(wú)填充
2)PKCS5Padding:
3)ISO10126Padding:
7.常用對(duì)稱密碼:
1)DES(Data Encryption Standard,數(shù)據(jù)加密標(biāo)準(zhǔn))
2)3DES(Triple DES、DESede,進(jìn)行了三重DES加密的算法)
3)AES(Advanced Encryption Standard,高級(jí)數(shù)據(jù)加密標(biāo)準(zhǔn),AES算法可以有效抵制針對(duì)DES的攻擊算法)
先來(lái)看一下這三種算法的簡(jiǎn)單對(duì)比:
算法 | 密鑰長(zhǎng)度 | 默認(rèn)密鑰長(zhǎng)度 | 工作模式 | 填充方式 |
---|---|---|---|---|
DES | 56 | 56 | ECB、CBC、PCBC、CTR、CTS、CFB、CFB8-CFB128、OFB、OFB8-OFB128 | NoPadding、PKCS5Padding、ISO10126Padding |
3DES | 112、168 | 168 | ECB、CBC、PCBC、CTR、CTS、CFB、CFB8-CFB128、OFB、OFB8-OFB128 | NoPadding、PKCS5Padding、ISO10126Padding |
AES | 128、192、256 | 128 | ECB、CBC、PCBC、CTR、CTS、CFB、CFB8-CFB128、OFB、OFB8-OFB128 | NoPadding、PKCS5Padding、ISO10126Padding |
下面我們看如何使用 DES / 3DES / AES 三種算法實(shí)現(xiàn) 對(duì)稱加密:
2.DES算法
1.DES:數(shù)據(jù)加密標(biāo)準(zhǔn),是對(duì)稱加密算法領(lǐng)域中的典型算法
2.特點(diǎn):密鑰偏短(56位)、生命周期短(避免被破解)
3.Java實(shí)現(xiàn)
1)生成密鑰
KeyGenerator keyGen = KeyGenerator.getInstance("DES");//密鑰生成器 keyGen.init(56);//初始化密鑰生成器 SecretKey secretKey = keyGen.generateKey();//生成密鑰 byte[] key = secretKey.getEncoded();//密鑰字節(jié)數(shù)組
2)加密
SecretKey secretKey = new SecretKeySpec(key, "DES");//恢復(fù)密鑰 Cipher cipher = Cipher.getInstance("DES");//Cipher完成加密或解密工作類 cipher.init(Cipher.ENCRYPT_MODE, secretKey);//對(duì)Cipher初始化,加密模式 byte[] cipherByte = cipher.doFinal(data);//加密data
3)解密
SecretKey secretKey = new SecretKeySpec(key, "DES");//恢復(fù)密鑰 Cipher cipher = Cipher.getInstance("DES");//Cipher完成加密或解密工作類 cipher.init(Cipher.DECRYPT_MODE, secretKey);//對(duì)Cipher初始化,解密模式 byte[] cipherByte = cipher.doFinal(data);//解密data
我們可以發(fā)現(xiàn),加密解密我們只是設(shè)置了不同的模式而已。
3.3DES算法
1.3DES:將密鑰長(zhǎng)度增至112位或168位,通過(guò)增加迭代次數(shù)提高安全性
2.缺點(diǎn):處理速度較慢、密鑰計(jì)算時(shí)間較長(zhǎng)、加密效率不高
3.Java實(shí)現(xiàn)
1)生成密鑰
KeyGenerator keyGen = KeyGenerator.getInstance("DESede");//密鑰生成器 keyGen.init(168); //可指定密鑰長(zhǎng)度為112或168,默認(rèn)為168 SecretKey secretKey = keyGen.generateKey();//生成密鑰 byte[] key = secretKey.getEncoded();//密鑰字節(jié)數(shù)組
2)3DES加密
SecretKey secretKey = new SecretKeySpec(key, "DESede");//恢復(fù)密鑰 Cipher cipher = Cipher.getInstance("DESede");//Cipher完成加密或解密工作類 cipher.init(Cipher.ENCRYPT_MODE, secretKey);//對(duì)Cipher初始化,解密模式 byte[] cipherByte = cipher.doFinal(data);//加密data
3)3DES解密
SecretKey secretKey = new SecretKeySpec(key, "DESede");//恢復(fù)密鑰 Cipher cipher = Cipher.getInstance("DESede");//Cipher完成加密或解密工作類 cipher.init(Cipher.DECRYPT_MODE, secretKey);//對(duì)Cipher初始化,解密模式 byte[] cipherByte = cipher.doFinal(data);//解密data
4.AES算法(推薦使用)
1.AES:高級(jí)數(shù)據(jù)加密標(biāo)準(zhǔn),能夠有效抵御已知的針對(duì)DES算法的所有攻擊
2.特點(diǎn):密鑰建立時(shí)間短、靈敏性好、內(nèi)存需求低、安全性高
3.Java實(shí)現(xiàn)
1)生成密鑰
KeyGenerator keyGen = KeyGenerator.getInstance("AES");//密鑰生成器 keygen.init(128); //默認(rèn)128,獲得無(wú)政策權(quán)限后可為192或256 SecretKey secretKey = keyGen.generateKey();//生成密鑰 byte[] key = secretKey.getEncoded();//密鑰字節(jié)數(shù)組
2)AES加密
SecretKey secretKey = new SecretKeySpec(key, "AES");//恢復(fù)密鑰 Cipher cipher = Cipher.getInstance("AES");//Cipher完成加密或解密工作類 cipher.init(Cipher.ENCRYPT_MODE, secretKey);//對(duì)Cipher初始化,解密模式 byte[] cipherByte = cipher.doFinal(data);//加密data
3)AES解密
SecretKey secretKey = new SecretKeySpec(key, "AES");//恢復(fù)密鑰 Cipher cipher = Cipher.getInstance("AES");//Cipher完成加密或解密工作類 cipher.init(Cipher.DECRYPT_MODE, secretKey);//對(duì)Cipher初始化,解密模式 byte[] cipherByte = cipher.doFinal(data);//解密data
為了方便使用,我對(duì)DES / 3DES / AES 三種算法進(jìn)行了工具類編寫(xiě),地址:下載地址 (新增DES/3DES/AES工具類)。
到此,DES / 3DES / AES 三種算法實(shí)現(xiàn) 對(duì)稱加密 就說(shuō)完了。希望對(duì)大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。
相關(guān)文章
Java線程并發(fā)工具類CountDownLatch原理及用法
這篇文章主要介紹了Java線程并發(fā)工具類CountDownLatch原理及用法,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下2019-10-10SpringBoot實(shí)現(xiàn)圖片防盜鏈功能
出于安全考慮,我們需要后端返回的圖片只允許在某個(gè)網(wǎng)站內(nèi)展示,不想被爬蟲(chóng)拿到圖片地址后被下載,或者,不想瀏覽器直接訪問(wèn)圖片鏈接,所以本文將給大家介紹SpringBoot實(shí)現(xiàn)圖片防盜鏈功能,需要的朋友可以參考下2024-04-04Springboot yml如何獲取系統(tǒng)環(huán)境變量的值
這篇文章主要介紹了Springboot yml如何獲取系統(tǒng)環(huán)境變量的值,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2022-02-02Java Thread之Sleep()使用方法總結(jié)
這篇文章主要介紹了Java Thread之Sleep()使用方法總結(jié),文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2020-05-05Java默認(rèn)傳入時(shí)間段時(shí)間的實(shí)例
下面小編就為大家?guī)?lái)一篇Java默認(rèn)傳入時(shí)間段時(shí)間的實(shí)例。小編覺(jué)得挺不錯(cuò)的,現(xiàn)在就分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧2017-10-10springboot使用redisRepository和redistemplate操作redis的過(guò)程解析
本文給大家介紹springboot整合redis/分別用redisRepository和redistemplate操作redis,本文結(jié)合實(shí)例代碼給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友參考下吧2022-05-05MyBatis實(shí)現(xiàn)樂(lè)觀鎖和悲觀鎖的示例代碼
在數(shù)據(jù)庫(kù)操作中,樂(lè)觀鎖和悲觀鎖是兩種常見(jiàn)的并發(fā)控制策略,本文主要介紹了MyBatis實(shí)現(xiàn)樂(lè)觀鎖和悲觀鎖的示例代碼,具有一定的參考價(jià)值,感興趣的可以了解一下2024-07-07