首頁 > 軟體

Python實現AES加密,解密的兩種方法

2020-10-03 12:00:03

第一種

import base64
from Crypto.Cipher import AES


# 金鑰(key), 密斯偏移量(iv) CBC模式加密

def AES_Encrypt(key, data):
  vi = '0102030405060708'
  pad = lambda s: s + (16 - len(s) % 16) * chr(16 - len(s) % 16)
  data = pad(data)
  # 字串補位
  cipher = AES.new(key.encode('utf8'), AES.MODE_CBC, vi.encode('utf8'))
  encryptedbytes = cipher.encrypt(data.encode('utf8'))
  # 加密後得到的是bytes型別的資料
  encodestrs = base64.b64encode(encryptedbytes)
  # 使用Base64進行編碼,返回byte字串
  enctext = encodestrs.decode('utf8')
  # 對byte字串按utf-8進行解碼
  return enctext


def AES_Decrypt(key, data):
  vi = '0102030405060708'
  data = data.encode('utf8')
  encodebytes = base64.decodebytes(data)
  # 將加密資料轉換位bytes型別資料
  cipher = AES.new(key.encode('utf8'), AES.MODE_CBC, vi.encode('utf8'))
  text_decrypted = cipher.decrypt(encodebytes)
  unpad = lambda s: s[0:-s[-1]]
  text_decrypted = unpad(text_decrypted)
  # 去補位
  text_decrypted = text_decrypted.decode('utf8')
  return text_decrypted


key = '0CoJUm6Qyw8W8jud' #自己金鑰
data = 'sdadsdsdsfd' #需要加密的內容
AES_Encrypt(key, data)
enctext = AES_Encrypt(key, data)
print(enctext)
text_decrypted = AES_Decrypt(key, enctext)
print(text_decrypted)

第二種

#!/usr/bin/env python
#encoding=‘utf-8'
from Crypto.Cipher import AES
from binascii import b2a_hex, a2b_hex
from Crypto import Random

class PrpCrypt(object):

  def __init__(self, key):
    self.key = key.encode('utf-8')
    self.mode = AES.MODE_CBC
    self.iv = Random.new().read(AES.block_size)

  # 加密函數,如果text不足16位元就用空格補足為16位元,
  # 如果大於16當時不是16的倍數,那就補足為16的倍數。
  def encrypt(self, text):
    text = text.encode('utf-8')

    cryptor = AES.new(self.key, self.mode,self.iv)
    # 這裡金鑰key 長度必須為16(AES-128),
    # 24(AES-192),或者32 (AES-256)Bytes 長度
    # 目前AES-128 足夠目前使用
    length = 16
    count = len(text)
    if count < length:
      add = (length - count)
      #  backspace
      # text = text + ('' * add)
      text = text + ('' * add).encode('utf-8')
    elif count > length:
      add = (length - (count % length))
      # text = text + ('' * add)
      text = text + ('' * add).encode('utf-8')
    self.ciphertext = cryptor.encrypt(text)
    # 因為AES加密時候得到的字串不一定是ascii字元集的,輸出到終端或者儲存時候可能存在問題
    # 所以這裡統一把加密後的字串轉化為16進位制字串
    return b2a_hex(self.ciphertext)

  # 解密後,去掉補足的空格用strip() 去掉
  def decrypt(self, text):
    cryptor = AES.new(self.key, self.mode, self.iv)
    plain_text = cryptor.decrypt(a2b_hex(text))
    # return plain_text.rstrip('')
    return bytes.decode(plain_text).rstrip('')


if __name__ == '__main__':
  pc = PrpCrypt('0CoJUm6Qyw8W8jud') # 初始化金鑰
  data = input("請輸入待加密資料:")#
  e = pc.encrypt(data) # 加密
  d = pc.decrypt(e).encode() # 解密
  print("加密:", e)
  print("解密:", d)

以上就是Python實現AES加密,解密的兩種方法的詳細內容,更多關於Python實現AES加密,解密的資料請關注it145.com其它相關文章!


IT145.com E-mail:sddin#qq.com