周末给女友讲了遍加密算法,没想到...
前言
今天給大家帶來的的是關于加密算法的來世今生。
其實早在古希臘時期,人類發明了置換密碼。到1881年世界上的第一個電話保密專利出現。二戰期間,德國軍方啟用“恩尼格瑪”密碼機,密碼學在戰爭中起著非常重要的作用。
在1997年,美國國家標準局公布實施了“美國數據加密標準(DES)”,民間力量開始全面介入密碼學的研究和應用中,采用的加密算法有 DES、RSA、SHA 等。隨著對加密強度需求的不斷提高,近期又出現了AES、ECC等。
好了,歷史講完了,該進入正文了,先來看看使用加密算法對我們有啥好處。
使用密碼學可以達到以下目的:
保密性:防止用戶的標識或數據被讀取。
數據完整性:防止數據被更改。
身份驗證:確保數據發自特定的一方。
單向加密
通俗來說,就是通過對數據進行摘要計算生成密文,密文不可逆推還原。算法代表:MD5、SHA、HMAC等。
?
單向加密
MD5
MD5 -- message-digest algorithm 5 (信息-摘要算法)縮寫,廣泛用于加密和解密技術,常用于文件校驗。不管文件多大,經過MD5后都能生成唯一的 MD5 值。好比現在的 ISO 校驗,都是 MD5 校驗,把 ISO 經過 MD5 后產生 MD5 的值。一般下載 linux-ISO 的朋友都見過下載鏈接旁邊放著 MD5 的串。就是用來驗證文件是否一致的。
加密工具類如下:
/**?*?MD5加密?*??*?@param?data?*?@return?*?@throws?Exception?*/?? public?static?byte[]?encryptMD5(byte[]?data)?throws?Exception?{??MessageDigest?md5?=?MessageDigest.getInstance(KEY_MD5);??md5.update(data);??return?md5.digest();??}??SHA
SHA(Secure Hash Algorithm,安全散列算法),數字簽名等密碼學應用中重要的工具,被廣泛地應用于電子商務等信息安全領域。雖然, SHA 與 MD5 通過碰撞法都被破解了,但是 SHA 仍然是公認的安全加密算法,較之MD5更為安全。
加密工具類如下:
/**? *?SHA加密? *?? *?@param?data? *?@return? *?@throws?Exception? */?? public?static?byte[]?encryptSHA(byte[]?data)?throws?Exception?{??MessageDigest?sha?=?MessageDigest.getInstance(KEY_SHA);??sha.update(data);??return?sha.digest();??}?? }??HMAC
HMAC(Hash Message Authentication Code ,散列消息鑒別碼,基于密鑰的 Hash 算法的認證協議。消息鑒別碼實現鑒別的原理是,用公開函數和密鑰產生一個固定長度的值作為認證標識,用這個標識鑒別消息的完整性。使用一個密鑰生成一個固定大小的小數據塊,即 MAC ,并將其加入到消息中,然后傳輸。接收方利用與發送方共享的密鑰進行鑒別認證等。
加密工具類如下:
?/**?*?初始化HMAC密鑰?*??*?@return?*?@throws?Exception?*/?? public?static?String?initMacKey()?throws?Exception?{??KeyGenerator?keyGenerator?=?KeyGenerator.getInstance(KEY_MAC);??SecretKey?secretKey?=?keyGenerator.generateKey();??return?encryptBASE64(secretKey.getEncoded());?? }??/**?*?HMAC加密?*??*?@param?data?*?@param?key?*?@return?*?@throws?Exception?*/?? public?static?byte[]?encryptHMAC(byte[]?data,?String?key)?throws?Exception?{??SecretKey?secretKey?=?new?SecretKeySpec(decryptBASE64(key),?KEY_MAC);??Mac?mac?=?Mac.getInstance(secretKey.getAlgorithm());??mac.init(secretKey);??return?mac.doFinal(data);??}??雙向加密
雙向加密又稱為可逆加密,即生成密文后,在需要的時候可以反解為明文,雙向加密分為對稱加密和非對稱加密。
?
對稱加密算法
對稱加密算法是應用較早的加密算法,技術成熟。在對稱加密算法中,數據發信方將明文(原始數據)和加密密鑰一起經過特殊加密算法處理后,使其變成復雜的加密密文發送出去。在對稱加密算法中,使用的密鑰只有一個,發收信雙方都使用這個密鑰對數據進行加密和解密,這就要求解密方事先必須知道加密密鑰。對稱加密算法的特點是8算法公開、計算量小、加密速度快、加密效率高。不足之處是,交易雙方都使用同樣鑰匙,安全性得不到保證*。對稱加密算法在分布式網絡系統上使用較為困難,主要是因為密鑰管理困難,使用成本較高。
數據加密過程:在對稱加密算法中,數據發送方將明文(原始數據)和加密密鑰一起經過特殊加密處理,生成復雜的加密密文進行發送。
數據解密過程:數據接收方收到密文后,若想讀取原數據,則需要使用加密使用的密鑰及相同算法的逆算法對加密的密文進行解密,才能使其恢復成可讀明文。
常用算法:DES、3DES、AES、TDEA、Blowfish、RC2、RC4、RC5、IDEA、Skipjack 等。下面主要介紹常用的 DES、3DES、AES 加密算法。
DES加密算法
DES 加密算法是一種分組密碼,以 64 位為分組對數據加密,它的密鑰長度是 56 位,加密解密用同一算法。DES 加密算法是對密鑰進行保密,而公開算法,包括加密和解密算法。這樣,只有掌握了和發送方相同密鑰的人才能解讀由DES加密算法加密的密文數據。因此,破譯 DES 加密算法實際上就是搜索密鑰的編碼。對于 56 位長度的密鑰來說,如果用窮舉法來進行搜索的話,其運算次數為 256 。
隨著計算機系統能力的不斷發展, DES 的安全性比它剛出現時會弱得多,然而從非關鍵性質的實際出發,仍可以認為它是足夠的。不過, DES 現在僅用于舊系統的鑒定,而更多地選擇新的加密標準。
加密工具類如下:
?/***?加密**?@param?datasource?待加密數據*?@param?key*?@return?byte數組*/public?static?byte[]?enCrypto(byte[]?datasource,?String?key)?throws?InvalidKeyException,?NoSuchAlgorithmException,?InvalidKeySpecException,?NoSuchPaddingException,?BadPaddingException,?IllegalBlockSizeException?{SecureRandom?random?=?new?SecureRandom();DESKeySpec?desKey?=?new?DESKeySpec(key.getBytes());//?創建一個密匙工廠,然后用它把DESKeySpec轉換成SecretKeyFactory?keyFactory?=?SecretKeyFactory.getInstance("DES");SecretKey?securekey?=?keyFactory.generateSecret(desKey);//?Cipher對象實際完成加密操作Cipher?cipher?=?Cipher.getInstance("DES");//?用密匙初始化Cipher對象cipher.init(Cipher.ENCRYPT_MODE,?securekey,?random);//?現在,獲取數據并加密//?正式執行加密操作return?cipher.doFinal(datasource);}3DES加密算法
DES 是三重數據加密算法塊密碼的通稱。它相當于是對每個數據塊應用三次 DES 加密算法。由于計算機運算能力的增強,原版DES密碼的密鑰長度變得容易被暴力破解;3DES即是設計用來提供一種相對簡單的方法,即通過增加 DES 的密鑰長度來避免類似的攻擊,而不是設計一種全新的塊密碼算法。
3DES 是 DES 向 AES 過渡的加密算法,加密算法,其具體實現如下:設 Ek() 和 Dk() 代表 DES 算法的加密和解密過程, K 代表 DES 算法使用的密鑰, M 代表明文, C 代表密文。加密過程為:C=Ek3(Dk2(Ek1(M)))
加密工具類如下:
/***?方法描述:3DES加密**?@param?plainText??明文*?@param?secretKey??密鑰*?@param?iv?????????加密向量*?@return?String????密文*?@throws?Exception*/public?static?String?encode(String?plainText,?String?secretKey,?String?iv)throws?Exception?{Key?deskey?=?null;DESedeKeySpec?spec?=?new?DESedeKeySpec(secretKey.getBytes());SecretKeyFactory?keyfactory?=?SecretKeyFactory.getInstance("desede");deskey?=?keyfactory.generateSecret(spec);Cipher?cipher?=?Cipher.getInstance("desede/CBC/PKCS5Padding");IvParameterSpec?ips?=?new?IvParameterSpec(iv.getBytes());cipher.init(Cipher.ENCRYPT_MODE,?deskey,?ips);byte[]?encryptData?=?cipher.doFinal(plainText.getBytes(encoding));return?Base64.encode(encryptData);}AES加密算法
AES 加密算法是密碼學中的高級加密標準,該加密算法采用對稱分組密碼體制,密鑰長度的最少支持為 128、192 、 256 ,分組長度 128 位,算法應易于各種硬件和軟件實現。這種加密算法是美國聯邦政府采用的區塊加密標準,這個標準用來替代原先的 DES ,已經被多方分析且廣為全世界所使用。
AES 加密算法被設計為支持 128/192/256位(/32=nb)數據塊大小(即分組長度);支持 128/192/256位(/32=nk) 密碼長度,,在 10 進制里,對應 34×1038、62×1057、1.1×1077 個密鑰。
加密工具類如下:
/***?AES加密*?@param?data?要加密的字符串*?@param?key??加密key*?@param?iv???密碼加密算法中的IV*?@return?加密后的字符串*/public?static?String?encrypt(String?data,?String?key,?String?iv)?{try?{Cipher?cipher?=?Cipher.getInstance("AES/CBC/NoPadding");int?blockSize?=?cipher.getBlockSize();byte[]?dataBytes?=?data.getBytes();int?plaintextLength?=?dataBytes.length;if?(plaintextLength?%?blockSize?!=?0)?{plaintextLength?=?plaintextLength?+?(blockSize?-?(plaintextLength?%?blockSize));}byte[]?plaintext?=?new?byte[plaintextLength];System.arraycopy(dataBytes,?0,?plaintext,?0,?dataBytes.length);SecretKeySpec?keyspec?=?new?SecretKeySpec(key.getBytes(),?Constant.STRING_AES);IvParameterSpec?ivspec?=?new?IvParameterSpec(iv.getBytes(Constant.STRING_UTF_8));cipher.init(Cipher.ENCRYPT_MODE,?keyspec,?ivspec);byte[]?encrypted?=?cipher.doFinal(plaintext);String?encrypt?=?Base64.getEncoder().encodeToString(encrypted);?//BASE64加密encrypt?=?encrypt.replaceAll(new?String(Constant.STRING_CARRIAGE_RETURN),?Constant.STRING_BLANK);encrypt?=?encrypt.replaceAll(new?String(Constant.STRING_LINE_FEED),?Constant.STRING_BLANK);return?encrypt;}?catch?(Exception?e)?{e.printStackTrace();return?null;}}對稱加密算法比較
非對稱加密算法
不對稱加密算法使用兩把完全不同但又是完全匹配的一對鑰匙—公鑰和私鑰。在使用不對稱加密算法加密文件時,只有使用匹配的一對公鑰和私鑰,才能完成對明文的加密和解密過程。采用不對稱加密算法,收發信雙方在通信之前,收信方必須將自己早已隨機生成的公鑰送給發信方,而自己保留私鑰。由于不對稱算法擁有兩個密鑰,因而特別適用于分布式系統中的數據加密。廣泛應用的不對稱加密算法有 RSA 算法和美國國家標準局提出的 DSA 。以不對稱加密算法為基礎的加密技術應用非常廣泛。
工作流程:
1、乙方生成一對密鑰(公鑰和私鑰)并將公鑰向其它方公開。
2、得到該公鑰的甲方使用該密鑰對機密信息進行加密后再發送給乙方。
3、乙方再用自己保存的另一把專用密鑰(私鑰)對加密后的信息進行解密。乙方只能用其專用密鑰(私鑰)解密由對應的公鑰加密后的信息。
在傳輸過程中,即使攻擊者截獲了傳輸的密文,并得到了乙的公鑰,也無法破解密文,因為只有乙的私鑰才能解密密文。
同樣,如果乙要回復加密信息給甲,那么需要甲先公布甲的公鑰給乙用于加密,甲自己保存甲的私鑰用于解密。
RSA加密算法
RSA 加密算法是目前最有影響力的公鑰加密算法,并且被普遍認為是目前最優秀的公鑰方案之一。RSA 是第一個能同時用于加密和數宇簽名的算法,它能夠抵抗到目前為止已知的所有密碼攻擊,已被 ISO 推薦為公鑰數據加密標準。RSA 加密算法基于一個十分簡單的數論事實:將兩個大素數相乘十分容易,但那時想要,但那時想要對其乘積進行因式分解卻極其困難,因此可以將乘積公開作為加密密鑰。
加密工具類如下:
/***?RSA公鑰加密**?@param?str?加密字符串*?@param?publicKey?公鑰*?@return?密文*?@throws?Exception?加密過程中的異常信息*/public?static?String?encrypt(?String?str,?String?publicKey?)?throws?Exception{//base64編碼的公鑰byte[]?decoded?=?Base64.decodeBase64(publicKey);RSAPublicKey?pubKey?=?(RSAPublicKey)?KeyFactory.getInstance("RSA").generatePublic(new?X509EncodedKeySpec(decoded));//RSA加密Cipher?cipher?=?Cipher.getInstance("RSA");cipher.init(Cipher.ENCRYPT_MODE,?pubKey);String?outStr?=?Base64.encodeBase64String(cipher.doFinal(str.getBytes("UTF-8")));return?outStr;}DSA加密算法
DSA 是基于整數有限域離散對數難題的,其安全性與 RSA 相比差不多。DSA 的一個重要特點是兩個素數公開,這樣,當使用別人的 p 和 q 時,即使不知道私鑰,你也能確認它們是否是隨機產生的,還是作了手腳。RSA算法卻做不到。DSA 只是一種算法,和 RSA 不同之處在于它不能用作加密和解密,也不能進行密鑰交換,只用于簽名,它比RSA要快很多.
加密流程如下:
ECC加密算法
橢圓加密算法(ECC)是一種公鑰加密體制,最初由 Koblitz 和 Miller 兩人于 1985 年提出,其數學基礎是利用橢圓曲線上的有理點構成 Abel 加法群上橢圓離散對數的計算困難性。公鑰密碼體制根據其所依據的難題一般分為三類:大整數分解問題類、離散對數問題類、橢圓曲線類。有時也把橢圓曲線類歸為離散對數類。橢圓曲線密碼體制是目前已知的公鑰體制中,對每比特所提供加密強度最高的一種體制。解橢圓曲線上的離散對數問題的最好算法是 Pollard rho 方法,其時間復雜度為,是完全指數階的。
加密工具類如下:
/***?加密*?@param?data*?@param?publicKey*?@return*?@throws?Exception*/ public?static?byte[]?encrypt(byte[]?data,?String?publicKey)throws?Exception?{byte[]?keyBytes?=?BASE64Decoder.decodeBuffer(publicKey);X509EncodedKeySpec?x509KeySpec?=?new?X509EncodedKeySpec(keyBytes);KeyFactory?keyFactory?=?KeyFactory.getInstance(ECCEnum.ALGORITHM.value());ECPublicKey?pubKey?=?(ECPublicKey)?keyFactory.generatePublic(x509KeySpec);Cipher?cipher?=?new?NullCipher();cipher.init(Cipher.ENCRYPT_MODE,?pubKey);return?cipher.doFinal(data); }非對稱加密算法比較
?
總結
對稱加密和非對稱加密比較
實際應用:
采用非對稱加密算法管理對稱算法的密鑰,用對稱加密算法加密數據,即提高了加密速度,又實現了解密的安全
RSA 建議采用 1024 位的數字, ECC 建議采用160位, AES 采用128位即可
其它方面的比較:
在管理方面:公鑰密碼算法只需要較少的資源就可以實現目的,在密鑰的分配上,兩者之間相差一個指數級別(一個是n一個是n2)。所以公鑰密碼算法不適應廣域網的使用,而且更重要的一點是它不支持數字簽名。
在安全方面:由于公鑰密碼算法基于未解決的數學難題,在破解上幾乎不可能。對于私鑰密碼算法,到了AES雖說從理論來說是不可能破解的,但從計算機的發展角度來看。公鑰更具有優越性。
有道無術,術可成;有術無道,止于術
歡迎大家關注Java之道公眾號
好文章,我在看??
總結
以上是生活随笔為你收集整理的周末给女友讲了遍加密算法,没想到...的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 再见!米聊!!!
- 下一篇: [C++ map dp]codefor