<kbd id="afajh"><form id="afajh"></form></kbd>
<strong id="afajh"><dl id="afajh"></dl></strong>
    <del id="afajh"><form id="afajh"></form></del>
        1. <th id="afajh"><progress id="afajh"></progress></th>
          <b id="afajh"><abbr id="afajh"></abbr></b>
          <th id="afajh"><progress id="afajh"></progress></th>

          各種加密算法剖析與總結(jié)

          共 9241字,需瀏覽 19分鐘

           ·

          2020-12-21 14:57


          目前比較常用的加密算法總結(jié)起來就是單向加密和雙向加密了,其實(shí)很簡單,理解也不難。但是小羽覺得還是很有必要對其原理進(jìn)行清晰的認(rèn)知的,這樣在我們的開發(fā)中才會(huì)得心應(yīng)手。畢竟對于我們研發(fā)來說,數(shù)據(jù)安全是第一位,加密算法對維護(hù)軟件的數(shù)據(jù)安全起著舉足輕重的作用。來跟著小羽看看這些算法都用在了哪些方面,怎么用的,代碼具體如何實(shí)現(xiàn)的。慢慢讀完,你會(huì)對這些小密碼有更深入的了解。

          前言

          今天給大家?guī)淼牡氖顷P(guān)于加密算法的來世今生。

          其實(shí)早在古希臘時(shí)期,人類發(fā)明了置換密碼。到1881年世界上的第一個(gè)電話保密專利出現(xiàn)。二戰(zhàn)期間,德國軍方啟用“恩尼格瑪”密碼機(jī),密碼學(xué)在戰(zhàn)爭中起著非常重要的作用。

          在1997年,美國國家標(biāo)準(zhǔn)局公布實(shí)施了“美國數(shù)據(jù)加密標(biāo)準(zhǔn)(DES)”,民間力量開始全面介入密碼學(xué)的研究和應(yīng)用中,采用的加密算法有 DES、RSA、SHA 等。隨著對加密強(qiáng)度需求的不斷提高,近期又出現(xiàn)了AES、ECC等。

          好了,歷史講完了,該進(jìn)入正文了,先來看看使用加密算法對我們有啥好處。

          使用密碼學(xué)可以達(dá)到以下目的:

          保密性:防止用戶的標(biāo)識或數(shù)據(jù)被讀取。

          數(shù)據(jù)完整性:防止數(shù)據(jù)被更改。

          身份驗(yàn)證:確保數(shù)據(jù)發(fā)自特定的一方。


          單向加密
          通俗來說,就是通過對數(shù)據(jù)進(jìn)行摘要計(jì)算生成密文,密文不可逆推還原。算法代表:MD5、SHA、HMAC等。

          單向加密

          MD5

          MD5 -- message-digest algorithm 5 (信息-摘要算法)縮寫,廣泛用于加密和解密技術(shù),常用于文件校驗(yàn)。不管文件多大,經(jīng)過MD5后都能生成唯一MD5 值。好比現(xiàn)在的 ISO 校驗(yàn),都是 MD5 校驗(yàn),把 ISO 經(jīng)過 MD5 后產(chǎn)生 MD5 的值。一般下載 linux-ISO 的朋友都見過下載鏈接旁邊放著 MD5 的串。就是用來驗(yàn)證文件是否一致的

          加密工具類如下


          /**?
          ?*?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,安全散列算法),數(shù)字簽名等密碼學(xué)應(yīng)用中重要的工具,被廣泛地應(yīng)用于電子商務(wù)等信息安全領(lǐng)域。雖然, SHA 與 MD5 通過碰撞法都被破解了,但是 SHA 仍然是公認(rèn)的安全加密算法,較之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 算法的認(rèn)證協(xié)議。消息鑒別碼實(shí)現(xiàn)鑒別的原理是,用公開函數(shù)和密鑰產(chǎn)生一個(gè)固定長度的值作為認(rèn)證標(biāo)識,用這個(gè)標(biāo)識鑒別消息的完整性。使用一個(gè)密鑰生成一個(gè)固定大小的小數(shù)據(jù)塊,即 MAC ,并將其加入到消息中,然后傳輸。接收方利用與發(fā)送方共享的密鑰進(jìn)行鑒別認(rèn)證等。

          加密工具類如下

          ?/**?
          ?*?初始化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);??
          ??
          }??


          雙向加密
          雙向加密又稱為可逆加密,即生成密文后,在需要的時(shí)候可以反解為明文,雙向加密分為對稱加密和非對稱加密。

          對稱加密算法

          對稱加密算法是應(yīng)用較早的加密算法,技術(shù)成熟。在對稱加密算法中,數(shù)據(jù)發(fā)信方將明文(原始數(shù)據(jù))和加密密鑰一起經(jīng)過特殊加密算法處理后,使其變成復(fù)雜的加密密文發(fā)送出去。在對稱加密算法中,使用的密鑰只有一個(gè),發(fā)收信雙方都使用這個(gè)密鑰對數(shù)據(jù)進(jìn)行加密和解密,這就要求解密方事先必須知道加密密鑰。對稱加密算法的特點(diǎn)是8算法公開、計(jì)算量小、加密速度快、加密效率高。不足之處是,交易雙方都使用同樣鑰匙,安全性得不到保證*。對稱加密算法在分布式網(wǎng)絡(luò)系統(tǒng)上使用較為困難,主要是因?yàn)槊荑€管理困難,使用成本較高。

          數(shù)據(jù)加密過程:在對稱加密算法中,數(shù)據(jù)發(fā)送方將明文(原始數(shù)據(jù))和加密密鑰一起經(jīng)過特殊加密處理,生成復(fù)雜的加密密文進(jìn)行發(fā)送。

          數(shù)據(jù)解密過程:數(shù)據(jù)接收方收到密文后,若想讀取原數(shù)據(jù),則需要使用加密使用的密鑰及相同算法的逆算法對加密的密文進(jìn)行解密,才能使其恢復(fù)成可讀明文。

          常用算法:DES、3DES、AES、TDEA、Blowfish、RC2、RC4、RC5、IDEA、Skipjack 等。下面主要介紹常用的 DES、3DES、AES 加密算法。

          DES加密算法

          DES 加密算法是一種分組密碼,以 64 位為分組對數(shù)據(jù)加密,它的密鑰長度是 56 位,加密解密用同一算法。DES 加密算法是對密鑰進(jìn)行保密,而公開算法,包括加密和解密算法。這樣,只有掌握了和發(fā)送方相同密鑰的人才能解讀由DES加密算法加密的密文數(shù)據(jù)。因此,破譯 DES 加密算法實(shí)際上就是搜索密鑰的編碼。對于 56 位長度的密鑰來說,如果用窮舉法來進(jìn)行搜索的話,其運(yùn)算次數(shù)為 256 。

          隨著計(jì)算機(jī)系統(tǒng)能力的不斷發(fā)展, DES 的安全性比它剛出現(xiàn)時(shí)會(huì)弱得多,然而從非關(guān)鍵性質(zhì)的實(shí)際出發(fā),仍可以認(rèn)為它是足夠的。不過, DES 現(xiàn)在僅用于舊系統(tǒng)的鑒定,而更多地選擇新的加密標(biāo)準(zhǔn)。

          加密工具類如下

          ?/**
          ??*?加密
          ??*
          ??*?@param?datasource?待加密數(shù)據(jù)
          ??*?@param?key
          ??*?@return?byte數(shù)組
          ??*/

          ??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());
          ????//?創(chuàng)建一個(gè)密匙工廠,然后用它把DESKeySpec轉(zhuǎn)換成
          ????SecretKeyFactory?keyFactory?=?SecretKeyFactory.getInstance("DES");
          ????SecretKey?securekey?=?keyFactory.generateSecret(desKey);
          ????//?Cipher對象實(shí)際完成加密操作
          ????Cipher?cipher?=?Cipher.getInstance("DES");
          ????//?用密匙初始化Cipher對象
          ????cipher.init(Cipher.ENCRYPT_MODE,?securekey,?random);
          ????//?現(xiàn)在,獲取數(shù)據(jù)并加密
          ????//?正式執(zhí)行加密操作
          ????return?cipher.doFinal(datasource);

          ????}

          3DES加密算法

          DES 是三重?cái)?shù)據(jù)加密算法塊密碼的通稱。它相當(dāng)于是對每個(gè)數(shù)據(jù)塊應(yīng)用三次 DES 加密算法。由于計(jì)算機(jī)運(yùn)算能力的增強(qiáng),原版DES密碼的密鑰長度變得容易被暴力破解;3DES即是設(shè)計(jì)用來提供一種相對簡單的方法,即通過增加 DES密鑰長度來避免類似的攻擊,而不是設(shè)計(jì)一種全新的塊密碼算法。

          3DES 是 DES 向 AES 過渡的加密算法,加密算法,其具體實(shí)現(xiàn)如下:設(shè) 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 加密算法是密碼學(xué)中的高級加密標(biāo)準(zhǔn),該加密算法采用對稱分組密碼體制,密鑰長度的最少支持為 128、192 、 256 ,分組長度 128 位,算法應(yīng)易于各種硬件和軟件實(shí)現(xiàn)。這種加密算法是美國聯(lián)邦政府采用的區(qū)塊加密標(biāo)準(zhǔn),這個(gè)標(biāo)準(zhǔn)用來替代原先的 DES ,已經(jīng)被多方分析且廣為全世界所使用。

          AES 加密算法被設(shè)計(jì)為支持 128/192/256位(/32=nb)數(shù)據(jù)塊大?。捶纸M長度);支持 128/192/256位(/32=nk) 密碼長度,,在 10 進(jìn)制里,對應(yīng) 34×1038、62×1057、1.1×1077 個(gè)密鑰。

          加密工具類如下

          /**
          ??*?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;
          ????????}
          ????}

          對稱加密算法比較


          非對稱加密算法

          不對稱加密算法使用兩把完全不同但又是完全匹配的一對鑰匙—公鑰和私鑰。在使用不對稱加密算法加密文件時(shí),只有使用匹配的一對公鑰和私鑰,才能完成對明文的加密和解密過程。采用不對稱加密算法,收發(fā)信雙方在通信之前,收信方必須將自己早已隨機(jī)生成的公鑰送給發(fā)信方,而自己保留私鑰。由于不對稱算法擁有兩個(gè)密鑰,因而特別適用于分布式系統(tǒng)中的數(shù)據(jù)加密。廣泛應(yīng)用的不對稱加密算法有 RSA 算法和美國國家標(biāo)準(zhǔn)局提出的 DSA 。以不對稱加密算法為基礎(chǔ)的加密技術(shù)應(yīng)用非常廣泛。

          工作流程

          1、乙方生成一對密鑰(公鑰和私鑰)并將公鑰向其它方公開。

          2、得到該公鑰的甲方使用該密鑰對機(jī)密信息進(jìn)行加密后再發(fā)送給乙方。

          3、乙方再用自己保存的另一把專用密鑰(私鑰)對加密后的信息進(jìn)行解密。乙方只能用其專用密鑰(私鑰)解密由對應(yīng)的公鑰加密后的信息。

          在傳輸過程中,即使攻擊者截獲了傳輸?shù)拿芪?,并得到了乙的公鑰,也無法破解密文,因?yàn)?strong style="font-size: inherit;line-height: inherit;color: rgb(41, 98, 255);">只有乙的私鑰才能解密密文。

          同樣,如果乙要回復(fù)加密信息給甲,那么需要甲先公布甲的公鑰給乙用于加密,甲自己保存甲的私鑰用于解密。

          RSA加密算法

          RSA 加密算法是目前最有影響力的公鑰加密算法,并且被普遍認(rèn)為是目前最優(yōu)秀的公鑰方案之一。RSA 是第一個(gè)能同時(shí)用于加密和數(shù)宇簽名的算法,它能夠抵抗到目前為止已知的所有密碼攻擊,已被 ISO 推薦為公鑰數(shù)據(jù)加密標(biāo)準(zhǔn)。RSA 加密算法基于一個(gè)十分簡單的數(shù)論事實(shí):將兩個(gè)大素?cái)?shù)相乘十分容易,但那時(shí)想要,但那時(shí)想要對其乘積進(jìn)行因式分解卻極其困難,因此可以將乘積公開作為加密密鑰。

          加密工具類如下

          /**
          ??*?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 是基于整數(shù)有限域離散對數(shù)難題的,其安全性與 RSA 相比差不多。DSA 的一個(gè)重要特點(diǎn)是兩個(gè)素?cái)?shù)公開,這樣,當(dāng)使用別人的 p 和 q 時(shí),即使不知道私鑰,你也能確認(rèn)它們是否是隨機(jī)產(chǎn)生的,還是作了手腳。RSA算法卻做不到。DSA 只是一種算法,和 RSA 不同之處在于它不能用作加密和解密,也不能進(jìn)行密鑰交換,只用于簽名,它比RSA要快很多.

          加密流程如下

          ECC加密算法

          橢圓加密算法(ECC)是一種公鑰加密體制,最初由 KoblitzMiller 兩人于 1985 年提出,其數(shù)學(xué)基礎(chǔ)是利用橢圓曲線上的有理點(diǎn)構(gòu)成 Abel 加法群上橢圓離散對數(shù)的計(jì)算困難性。公鑰密碼體制根據(jù)其所依據(jù)的難題一般分為三類:大整數(shù)分解問題類、離散對數(shù)問題類、橢圓曲線類。有時(shí)也把橢圓曲線類歸為離散對數(shù)類。橢圓曲線密碼體制是目前已知的公鑰體制中,對每比特所提供加密強(qiáng)度最高的一種體制。解橢圓曲線上的離散對數(shù)問題的最好算法是 Pollard rho 方法,其時(shí)間復(fù)雜度為,是完全指數(shù)階的。

          加密工具類如下

          /**
          ?*?加密
          ?*?@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);
          }

          非對稱加密算法比較

          總結(jié)

          對稱加密和非對稱加密比較

          實(shí)際應(yīng)用:

          采用非對稱加密算法管理對稱算法的密鑰,用對稱加密算法加密數(shù)據(jù),即提高了加密速度,又實(shí)現(xiàn)了解密的安全

          RSA 建議采用 1024 位的數(shù)字, ECC 建議采用160位, AES 采用128位即可

          其它方面的比較:

          在管理方面:公鑰密碼算法只需要較少的資源就可以實(shí)現(xiàn)目的,在密鑰的分配上,兩者之間相差一個(gè)指數(shù)級別(一個(gè)是n一個(gè)是n2)。所以公鑰密碼算法不適應(yīng)廣域網(wǎng)的使用,而且更重要的一點(diǎn)是它不支持?jǐn)?shù)字簽名。

          在安全方面:由于公鑰密碼算法基于未解決的數(shù)學(xué)難題,在破解上幾乎不可能。對于私鑰密碼算法,到了AES雖說從理論來說是不可能破解的,但從計(jì)算機(jī)的發(fā)展角度來看。公鑰更具有優(yōu)越性。

          資料自提

          1、計(jì)網(wǎng)、操作系統(tǒng)、計(jì)組相關(guān)視頻
          2、前字節(jié)大神刷題筆記
          3、計(jì)算機(jī)基礎(chǔ)知識PDF下載
          瀏覽 86
          點(diǎn)贊
          評論
          收藏
          分享

          手機(jī)掃一掃分享

          分享
          舉報(bào)
          評論
          圖片
          表情
          推薦
          點(diǎn)贊
          評論
          收藏
          分享

          手機(jī)掃一掃分享

          分享
          舉報(bào)
          <kbd id="afajh"><form id="afajh"></form></kbd>
          <strong id="afajh"><dl id="afajh"></dl></strong>
            <del id="afajh"><form id="afajh"></form></del>
                1. <th id="afajh"><progress id="afajh"></progress></th>
                  <b id="afajh"><abbr id="afajh"></abbr></b>
                  <th id="afajh"><progress id="afajh"></progress></th>
                  岛国免费AV | 欧美视频天天干 | 国产看逼 | 欧美精品乱码久久久久蜜桃 | 亚洲AV无码成人精品区在线播放 |