python + pycryptodome 實現AES加密

測試代碼示例:

from Crypto.Cipher import AES
from binascii import b2a_hex 
from binascii import a2b_hex
import pandas as pd
import numpy as np



def aes_encrypt(x, key='abcdefghABCDEFGH'):
    
    key_encode = key.encode('utf-8')
    aes = AES.new(key_encode, AES.MODE_ECB)
    
    x_enc = aes.encrypt(x.encode('utf-8'))
    x_hex = b2a_hex(x_enc).decode('utf-8')
    
    return x_hex

def aes_decrypt(x, key='abcdefghABCDEFGH'):
    
    key_encode = key.encode('utf-8')
    aes = AES.new(key_encode, AES.MODE_ECB)
    
    x = a2b_hex(x)
    x_dec = aes.decrypt(x).decode('utf-8')
    
    return x_dec

## 虛擬數據
df = pd.DataFrame(columns=['group', 'number1', 'number2', 'number3'])
df['group'] = ['00', '01', '02', '03', '04', '99']
df['number1'] = [1111,2222,3333,4444,5555,6666]
df['number2'] = [1234,5678,9012,3456,7890,1234]
df['number3'] = [1122,3344,5566,7788,9900,1199]

df['newtoken'] = df.apply(lambda x: x['group'] + str(x['number1']) + '_' + str(x['number2'])+ '_' + str(x['number3']), axis=1)


# 數據加密
df['encrypted_newtoken'] = df.newtoken.apply(aes_encrypt)

# 數據解密
df['decrypted_encrypted_newtoken'] = df.encrypted_newtoken.apply(aes_decrypt)

df

 

方式1:

#祕鑰,此處需要將字符串轉爲字節
key = 'abcdefgh'
key_encode = key.encode('utf8')
key_encode
print('密鑰key: {}'.format(key))

#加密內容需要長達16位字符,所以進行空格拼接
def pad(text):
  while len(text) % 16 != 0:
    text += b'_'
  return text


#加密祕鑰需要長達16位字符,所以進行空格拼接
def pad_key(key):
  while len(key) % 16 != 0:
    key += b'_'
  return key


#進行加密算法,模式ECB模式,把疊加完16位的祕鑰傳進來
aes = AES.new(pad_key(key_encode), AES.MODE_ECB)

#加密內容,此處需要將字符串轉爲字節
text = '09_1234_5678'
text_encode = text.encode('utf-8')
print('待加密的文字: {}'.format(text))
#進行內容拼接16位字符後傳入加密類中,結果爲字節類型
encrypted_text = aes.encrypt(pad(text_encode))
print('加密結果(字節型): {}'.format(encrypted_text))
print('加密結果(字符串): {}'.format(b2a_hex(encrypted_text)))


#用aes對象進行解密,將字節類型轉爲str類型,錯誤編碼忽略不計
de = str(aes.decrypt(encrypted_text), encoding='utf-8',errors="ignore")
#獲取str從0開始到文本內容的字符串長度。
print('解密後的文字: {}'.format(de[:len(text)]))
密鑰key: abcdefgh
待加密的文字: 09_1234_5678
加密結果(字節型): b'!\xfat\xa3\xef\xecgn\xf5\x1c=\x9ax]B\x1d'
加密結果(字符串): b'21fa74a3efec676ef51c3d9a785d421d'
解密後的文字: 09_1234_5678

方式2:

from Crypto.Cipher import AES
from binascii import b2a_hex 
from Crypto import Random


# 要加密的明文
data = '09_1234_5678'
print('待加密的文字: {}'.format(data))

# 密鑰key 長度必須爲16(AES-128)、24(AES-192)、或32(AES-256)Bytes 長度.
# 目前AES-128足夠用
key = b'aaaaaaaaaaaaaaaa'
# 生成長度等於AES塊大小的不可重複的密鑰向量
iv = Random.new().read(AES.block_size)

# 使用key和iv初始化AES對象, 使用MODE_CFB模式
mycipher = AES.new(key, AES.MODE_CFB, iv)
# 加密的明文長度必須爲16的倍數,如果長度不爲16的倍數,則需要補足爲16的倍數
# 將iv(密鑰向量)加到加密的密文開頭,一起傳輸
ciphertext = iv + mycipher.encrypt(data.encode())


# 解密的話要用key和iv生成新的AES對象
mydecrypt = AES.new(key, AES.MODE_CFB, ciphertext[:16])
# 使用新生成的AES對象,將加密的密文解密
decrypttext = mydecrypt.decrypt(ciphertext[16:])

print('密鑰key: {}'.format(key))
print('iv爲:', b2a_hex(ciphertext)[:16])
print('加密後數據爲:', b2a_hex(ciphertext)[16:])
print('解密後數據爲:', decrypttext.decode())
待加密的文字: 09_1234_5678
密鑰key: b'aaaaaaaaaaaaaaaa'
iv爲: b'a993d7fcb6523eb8'
加密後數據爲: b'2f25048409404fbbe85eaa7d36d7ed17e73ab386'
解密後數據爲: 09_1234_5678
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章