<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>

          常見加密算法的Python實現(xiàn)

          共 7304字,需瀏覽 15分鐘

           ·

          2021-11-16 06:06

          點擊上方“Python爬蟲與數(shù)據(jù)挖掘”,進行關(guān)注

          回復(fù)“書籍”即可獲贈Python從入門到進階共10本電子書

          移舟泊煙渚,日暮客愁新。
          生活在信息化高度發(fā)展的時代,人們對信息安全和保密的意識也不斷提高,在網(wǎng)絡(luò)數(shù)據(jù)傳輸過程中往往需要對敏感數(shù)據(jù)進行加密處理,以保證數(shù)據(jù)的安全性。
          本文主要介紹Base64、MD5,SHA-1,HMAC,DES/AES,RSA這幾種加密算法和python實現(xiàn)代碼示例。常用的加密方法基本都有對應(yīng)的Python庫,只需調(diào)用具體方法使用即可。


          Base64位加密


          最簡單的加密方式,無密鑰,只要拿到密文,就可以直接解密,一般情況下不單獨使用,可以和其他加密方式混合使用,作為一層外部包裝。

          import?base64

          #?要加密的字符串
          str_encrypt?=?'hello!'
          #?加密方法
          #?轉(zhuǎn)化為byte類型
          base64_encrypt?=?base64.b64encode(str_encrypt.encode())
          #?將字節(jié)串轉(zhuǎn)為字符串
          base64_encrypt_str?=?base64_encrypt.decode()

          print("BASE64加密串:",?base64_encrypt_str,?type(base64_encrypt_str))

          #解密方法
          #?字符串轉(zhuǎn)為字節(jié)串
          base64_decrypt?=?base64_encrypt_str.encode()
          #?得到加密的字符串
          str_decrypt?=?base64.b64decode(base64_decrypt).decode()
          print("BASE64解密串:",?str_decrypt,?type(str_decrypt))

          BASE64加密串: aGVsbG/vvIE= ?

          BASE64解密串: hello!


          MD5加密


          MD5 信息-摘要算法(MD5 Message-Digest Algorithm),具有很高的安全性,可以產(chǎn)生出一個128位(16字節(jié))的散列值(hash value),它對應(yīng)任何字符串都可以加密成一段唯一的固定長度的代碼,用于確保信息傳輸完整一致。目前MD5加密算法是不可逆的,當(dāng)然這種方式加密的密文也不需要解密,需要的時候直接發(fā)送原始密文就好。

          Python代碼:
          import?hashlib

          str_encrypt?=?"hello!"
          #?對要加密的字符串進行加密
          hash?=?hashlib.md5(str_encrypt.encode())
          hash.update(str_encrypt.encode("utf8"))
          value?=?hash.digest()
          #?二進制
          print("二進制的字符串",?repr(value))

          #?十六進制
          print("十六進制的字符串",?hash.hexdigest())
          二進制的字符串:b'%\xe2\n\x04\x86\xa7\xf4\xc5Y@\xfa\xc7\xd6\xdc\t_'
          十六進制的字符串:25e20a0486a7f4c55940fac7d6dc095f


          SHA1加密


          安全哈希算法(Secure Hash Algorithm)主要適用于數(shù)字簽名標(biāo)準(zhǔn)(Digital Signature Standard DSS)里面定義的數(shù)字簽名算法(Digital Signature Algorithm DSA),SHA1基于MD5,SHA1比MD5的安全性更強。對于長度小于2^ 64位的消息,SHA1會產(chǎn)生一個160位的報文摘要。

          通過散列算法可實現(xiàn)數(shù)字簽名實現(xiàn),數(shù)字簽名的原理是將要傳送的明文通過一種函數(shù)運算(Hash)轉(zhuǎn)換成報文摘要,報文摘要加密后與明文一起傳送給接受方,接受方將接受的明文產(chǎn)生新的報文摘要與發(fā)送方的發(fā)來報文摘要解密比較,如果不一致表示明文已被篡改。

          Python代碼:
          import?hashlib

          str_encrypt?=?"hello!"

          #?對要加密的字符串進行加密
          hash?=?hashlib.sha1(str_encrypt.encode())
          hash.update(str_encrypt.encode("utf8"))
          value?=?hash.hexdigest()

          #?十六進制
          print("十六進制的字符串",value)

          十六進制的字符串 b8b92f40e0c5df69dcf5cdc1e327e1f87188aeb9



          HMAC加密


          散列信息鑒別碼(Hash Message Authentication Code), HMAC加密算法是一種安全的基于加密hash函數(shù)和共享密鑰的消息認(rèn)證協(xié)議。

          實現(xiàn)原理是用公開函數(shù)和密鑰產(chǎn)生一個固定長度的值作為認(rèn)證標(biāo)識,用這個標(biāo)識鑒別消息的完整性。

          Python代碼:
          import?hmac
          import?hashlib

          str_encrypt?=?"hello!"
          key="abc"
          #?第一個參數(shù)是密鑰key,第二個參數(shù)是待加密的字符串,第三個參數(shù)是hash函數(shù)

          mac?=?hmac.new(key.encode(encoding="utf-8"),str_encrypt.encode("utf8"),hashlib.md5)

          value=mac.hexdigest()??#?加密后字符串的十六進制格式

          #?十六進制
          print("十六進制的字符串",value)

          十六進制的字符串 221479c27474cdf1ee245ffef26cfeee



          DES加密


          數(shù)據(jù)加密標(biāo)準(zhǔn)(Data Encryption Standard),屬于對稱加密算法。是一種使用密鑰加密的塊算法。接口參數(shù)有三個:Key、Data、Mode,Key為工作密Data為8個字節(jié)64位,是要被加密或被解密的數(shù)據(jù);Mode工作方式:加密或解密。

          Python代碼:
          import?binascii
          from?pyDes?import?des,?CBC,?PAD_PKCS5
          #?需要安裝?pip?install?pyDes

          #加密過程
          def?des_encrypt(secret_key,s):
          ????iv?=?secret_key
          ????k?=?des(secret_key,?CBC,?iv,?pad=None,?padmode=PAD_PKCS5)
          ????en?=?k.encrypt(s,?padmode=PAD_PKCS5)
          ????return?binascii.b2a_hex(en)

          #解密過程
          def?des_decrypt(secret_key,?s):
          ????iv?=?secret_key
          ????k?=?des(secret_key,?CBC,?iv,?pad=None,?padmode=PAD_PKCS5)
          ????de?=?k.decrypt(binascii.a2b_hex(s),?padmode=PAD_PKCS5)
          ????return?de

          secret_str?=?des_encrypt('12345678',?'hello!')
          print(secret_str)

          clear_str?=?des_decrypt('12345678',?secret_str)
          print(clear_str)

          b'7c48af7e37ecd280'?

          b'hello!'


          AES加密


          高級加密標(biāo)準(zhǔn)(Advanced Encryption Standard),又稱Rijndael加密法,是美國聯(lián)邦政府采用的一種區(qū)塊加密標(biāo)準(zhǔn)。對加密快和密鑰的字節(jié)數(shù)都有一定的要求,AES密鑰長度的最少支持為128、192、256,加密塊分組長度128位。需要知道密鑰才能解密
          使用命令pip3 install pycryptodome,安裝pycryptodome

          分組密碼加密中的四種模式有ECB、CBC、CFB、OFB。其中最常見的有ECB和CBC。


          1、ECB模式

          對明文分組,每組明文通過加密算法和密鑰位運算得到密文,之后按照順序?qū)⒂嬎闼玫拿芪倪B在一起即可,各段數(shù)據(jù)之間互不影響。


          2、CBC模式(使用最多的模式)

          CBC模式需要一個初始化向量iv(和密鑰長度相等的字符串),一般通過密鑰生成器獲取。


          加密步驟如下:

          1)首先將數(shù)據(jù)分組得到D1D2…Dn

          2)第一組數(shù)據(jù)D1與初始化向量iv位運算的結(jié)果進行加密得到第一組密文C1

          3)第二組數(shù)據(jù)D2與第一組的加密結(jié)果C1位運算以后的結(jié)果進行加密,得到第二組密文C2

          4)之后的數(shù)據(jù)以此類推,得到Cn

          5)按順序連為C1C2C3…Cn即為加密結(jié)果。

          特點:

          1.不容易主動攻擊,安全性好于ECB,適合傳輸長度長的報文,是SSL、IPSec的標(biāo)準(zhǔn)。每個密文塊依賴于所有的信息塊,明文消息中一個改變會影響所有密文塊

          2.發(fā)送方和接收方都需要知道初始化向量

          3.加密過程是串行的,無法被并行化(在解密時,從兩個鄰接的密文塊中即可得到一個平文塊。因此,解密過程可以被并行化

          4.解密時初始化向量必須相同


          Python代碼:

          ECB加密模式
          import?base64
          from?Crypto.Cipher?import?AES

          #ECB加密模式

          import?base64
          from?Crypto.Cipher?import?AES


          #使用補0方法

          #?#?需要補位,補足為16的倍數(shù)
          def?add_to_16(s):
          ????while?len(s)?%?16?!=?0:
          ????????s?+=?'\0'
          ????return?str.encode(s)??#?返回bytes

          #?密鑰長度必須為16、24或32位,分別對應(yīng)AES-128、AES-192和AES-256
          key?=?'abc4567890abc458'
          #?待加密文本
          text?=?'hello'
          #?初始化加密器
          aes?=?AES.new(add_to_16(key),?AES.MODE_ECB)
          #?加密
          encrypted_text?=?str(base64.encodebytes(aes.encrypt(add_to_16(text))),?encoding='utf8').replace('\n',?'')
          #?解密
          decrypted_text?=?str(
          ????aes.decrypt(base64.decodebytes(bytes(encrypted_text,?encoding='utf8'))).rstrip(b'\0').decode("utf8"))

          print('加密值:',?encrypted_text)
          print('解密值:',?decrypted_text)
          加密值:p3i7p25Ypel2X2yrFG4rCQ==

          解密值:hello


          CBC加密模式(一)

          #CBC加密模式
          import?base64
          from?Crypto.Cipher?import?AES
          from?urllib?import?parse

          AES_SECRET_KEY?=?'helloBrook2abcde'??#?此處16|24|32個字符
          IV?=?'helloBrook2abcde'?


          #?padding算法

          BS?=?len(AES_SECRET_KEY)

          #?填充方案
          pad?=?lambda?s:?s?+?(BS?-?len(s)?%?BS)?*?chr(BS?-?len(s)?%?BS)

          #?解密時刪除填充的值

          unpad?=?lambda?s:?s[0:-ord(s[-1:])]

          def?cryptoEn(string,?key,?iv):

          #?param?string:?原始數(shù)據(jù)
          #?param?key:?密鑰
          #?param?iv:?向

          ????mode?=?AES.MODE_CBC

          ????cipher?=?AES.new(key.encode("utf8"),mode,iv.encode("utf8"))

          ????encrypted?=?cipher.encrypt(bytes(pad(string),?encoding="utf8"))

          ????return?base64.b64encode(encrypted).decode("utf-8")


          #CBC模式的解密代碼

          def?cryptoDe(destring,?key,?iv):

          #?param?destring:?需要解密的數(shù)據(jù)
          #?param?key:?密鑰
          #?param?iv:?向量

          ????mode?=?AES.MODE_CBC
          ????
          ????decode?=?base64.b64decode(destring)

          ????cipher?=?AES.new(key.encode("utf8"),mode,iv.encode("utf8"))

          ????decrypted?=?cipher.decrypt(decode)

          ????return?unpad(decrypted).decode("utf-8")


          secret_str?=?cryptoEn('hello',?AES_SECRET_KEY,IV)
          print(secret_str)

          clear_str?=?cryptoDe(secret_str.encode("utf8"),?AES_SECRET_KEY,IV)
          print(clear_str)
          sqlpZ0AdaRAOQRabchzltQ==

          hello


          CBC加密模式(二)

          import?base64
          from?Crypto.Cipher?import?AES
          from?urllib?import?parse

          AES_SECRET_KEY?=?'helloBrook2abcde'??#?此處16|24|32個字符
          IV?=?'helloBrook2abcde'?

          #?padding算法
          BS?=?len(AES_SECRET_KEY)
          pad?=?lambda?s:?s?+?(BS?-?len(s)?%?BS)?*?chr(BS?-?len(s)?%?BS)
          unpad?=?lambda?s:?s[0:-ord(s[-1:])]


          class?AES_ENCRYPT(object):
          ????def?__init__(self):
          ????????self.key?=?AES_SECRET_KEY
          ????????self.mode?=?AES.MODE_CBC

          ????#?加密函數(shù)
          ????def?encrypt(self,?text):
          ????????cryptor?=?AES.new(self.key.encode("utf8"),?self.mode,?IV.encode("utf8"))
          ????????self.ciphertext?=?cryptor.encrypt(bytes(pad(text),?encoding="utf8"))
          ????????#?AES加密時候得到的字符串不一定是ascii字符集的,輸出到終端或者保存時候可能存在問題,使用base64編碼
          ????????return?base64.b64encode(self.ciphertext).decode("utf-8")

          ????#?解密函數(shù)
          ????def?decrypt(self,?text):
          ????????decode?=?base64.b64decode(text)
          ????????cryptor?=?AES.new(self.key.encode("utf8"),?self.mode,?IV.encode("utf8"))
          ????????plain_text?=?cryptor.decrypt(decode)
          ????????return?unpad(plain_text).decode("utf-8")


          if?__name__?==?'__main__':
          ????aes_encrypt?=?AES_ENCRYPT()
          ????text?=?"Python"
          ????e?=?aes_encrypt.encrypt(text)
          ????d?=?aes_encrypt.decrypt(e)
          ????print(text)
          ????print(e)
          ????print(d)

          待加密字符串:Python
          加密值:X09JC6IqnsDFp9b9C57cUA==
          解密值:Python

          如果字符串包含中文,先對文本轉(zhuǎn)ascii,將支持中文加密

          text?=?base64.b64encode(text.encode('utf-8')).decode('ascii')



          RSA加密


          Rivest-Shamir-Adleman,RSA加密算法是一種非對稱加密算法。公鑰加密,私鑰解密,在公開密鑰加密和電子商業(yè)中RSA被廣泛使用。目前最重要的加密算法!
          可參考:
          https://www.jianshu.com/p/7a4645691c68

          小伙伴們,快快用實踐一下吧!如果在學(xué)習(xí)過程中,有遇到任何問題,歡迎加我好友,我拉你進Python學(xué)習(xí)交流群共同探討學(xué)習(xí)。

          -------------------?End?-------------------

          往期精彩文章推薦:

          歡迎大家點贊,留言,轉(zhuǎn)發(fā),轉(zhuǎn)載,感謝大家的相伴與支持

          想加入Python學(xué)習(xí)群請在后臺回復(fù)【入群

          萬水千山總是情,點個【在看】行不行

          /今日留言主題/

          隨便說一兩句吧~~

          瀏覽 56
          點贊
          評論
          收藏
          分享

          手機掃一掃分享

          分享
          舉報
          評論
          圖片
          表情
          推薦
          點贊
          評論
          收藏
          分享

          手機掃一掃分享

          分享
          舉報
          <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>
                  亚洲日韩黄色电影 | 91精品国产综合久久久不卡电影 | 欧美一级AAAAABBBBB | 四虎国产精品成人永久免费 | 天天干天天射高清 |