【轉發+埋坑】python3.6 + PyCrypto實現AES加密、解密(改版)>>> 再改版

今天在弄環境配置中,密碼加密的問題。遇到一片好文章 https://blog.csdn.net/s740556472/article/details/79026128算法

按照這個文章的代碼所有copy,就能夠執行了~~可是遇到一個深坑,糾結了變天。oracle

 

原來是base64轉碼會出現\n 致使的。編碼

因此須要在原來的代碼上更改成:加密

#AES-demo

import base64
from Crypto.Cipher import AES

'''
採用AES對稱加密算法
'''
# str不是16的倍數那就補足爲16的倍數
def add_to_16(value):
    while len(value) % 16 != 0:
        value += '\0'
    return str.encode(value)  # 返回bytes
#加密方法
def encrypt_oracle():
    # 祕鑰
    key = '123456'
    # 待加密文本
    text = 'abc123def456'
    # 初始化加密器
    aes = AES.new(add_to_16(key), AES.MODE_ECB)
    #先進行aes加密
    encrypt_aes = aes.encrypt(add_to_16(text))
    #用base64轉成字符串形式
    encrypted_text = str(base64.encodebytes(encrypt_aes), encoding='utf-8')  # 執行加密並轉碼返回bytes
    print(encrypted_text)
    
    # base64會存在\n的狀況,轉碼會出現深坑。建議改成以下:
    return encrypted_text.replace("\n","")    


#解密方法
def decrypt_oralce():
    # 祕鑰
    key = '123456'
    # 密文
    text = 'qR/TQk4INsWeXdMSbCDDdA=='
    # 初始化加密器
    aes = AES.new(add_to_16(key), AES.MODE_ECB)
    #優先逆向解密base64成bytes
    base64_decrypted = base64.decodebytes(text.encode(encoding='utf-8'))
    #執行解密密並轉碼返回str
    decrypted_text = str(aes.decrypt(base64_decrypted),encoding='utf-8').replace('\0','') 
    print(decrypted_text)

if __name__ == '__main__':
   # encrypt_oracle()
    decrypt_oralce()


#--------------------- 
#做者:sy_y 
#來源:CSDN 
#原文:https://blog.csdn.net/s740556472/article/details/79026128 
#版權聲明:本文爲博主原創文章,轉載請附上博文連接!

 

長見識點:spa

用Base64編碼的時候若是出現\n 之類的字符。.net

當字符串過長(通常超過76)時會自動在中間加一個換行符,字符串最後也會加一個換行符。致使和其餘模塊對接時結果不一致。3d

因此之後遇到Base64編碼的問題,必定要當心\n.code

 

心裏深處。。。搞了一下午覺得是pyCrypto的問題,最終發覺解碼看起來一樣的一段字符串,直接decrypto("aaa\nbbb")不報錯,可是blog

str_text = "aaa\nbbb"; decrypto(str_text) 就會報錯。。。最終經過比較長度以及打印,發覺是base64的\n搞的事情。。。心塞。。ip

相關文章
相關標籤/搜索