python-AES加密解密

来源:https://www.cnblogs.com/pythonywy/archive/2020/06/03/13038890.html
-Advertisement-
Play Games

轉載https://www.jianshu.com/p/5d27888e7c93#!/xh #!/usr/bin/env python # -*- coding=utf-8 -*- """ AES加密解密工具類 @author jzx @date 2018/10/24 此工具類加密解密結果與 htt ...


轉載https://www.jianshu.com/p/5d27888e7c93#!/xh

#!/usr/bin/env python
# -*- coding=utf-8 -*-
"""
AES加密解密工具類
@author jzx
@date   2018/10/24
此工具類加密解密結果與 http://tool.chacuo.net/cryptaes 結果一致
數據塊128位
key 為16位
iv 為16位,且與key相等
字元集utf-8
輸出為base64
AES加密模式 為cbc
填充 pkcs7padding
"""

import base64
from Crypto.Cipher import AES

import random


def pkcs7padding(text):
    """
    明文使用PKCS7填充
    最終調用AES加密方法時,傳入的是一個byte數組,要求是16的整數倍,因此需要對明文進行處理
    :param text: 待加密內容(明文)
    :return:
    """
    bs = AES.block_size  # 16
    length = len(text)
    bytes_length = len(bytes(text, encoding='utf-8'))
    # tips:utf-8編碼時,英文占1個byte,而中文占3個byte
    padding_size = length if(bytes_length == length) else bytes_length
    padding = bs - padding_size % bs
    # tips:chr(padding)看與其它語言的約定,有的會使用'\0'
    padding_text = chr(padding) * padding
    return text + padding_text


def pkcs7unpadding(text):
    """
    處理使用PKCS7填充過的數據
    :param text: 解密後的字元串
    :return:
    """
    length = len(text)
    unpadding = ord(text[length-1])
    return text[0:length-unpadding]


def encrypt(key, content):
    """
    AES加密
    key,iv使用同一個
    模式cbc
    填充pkcs7
    :param key: 密鑰
    :param content: 加密內容
    :return:
    """
    key_bytes = bytes(key, encoding='utf-8')
    iv = key_bytes
    cipher = AES.new(key_bytes, AES.MODE_CBC, iv)
    # 處理明文
    content_padding = pkcs7padding(content)
    # 加密
    encrypt_bytes = cipher.encrypt(bytes(content_padding, encoding='utf-8'))
    # 重新編碼
    result = str(base64.b64encode(encrypt_bytes), encoding='utf-8')
    return result


def decrypt(key, content):
    """
    AES解密
     key,iv使用同一個
    模式cbc
    去填充pkcs7
    :param key:
    :param content:
    :return:
    """
    key_bytes = bytes(key, encoding='utf-8')
    iv = key_bytes
    cipher = AES.new(key_bytes, AES.MODE_CBC, iv)
    # base64解碼
    encrypt_bytes = base64.b64decode(content)
    # 解密
    decrypt_bytes = cipher.decrypt(encrypt_bytes)
    # 重新編碼
    result = str(decrypt_bytes, encoding='utf-8')
    # 去除填充內容
    result = pkcs7unpadding(result)
    return result


def get_key(n):
    """
    獲取密鑰 n 密鑰長度
    :return:
    """
    c_length = int(n)
    source = 'ABCDEFGHJKMNPQRSTWXYZabcdefhijkmnprstwxyz2345678'
    length = len(source) - 1
    result = ''
    for i in range(c_length):
        result += source[random.randint(0, length)]
    return result


# Test
# 非16位元組的情況
aes_key = get_key(16)
print('aes_key:' + aes_key)
# 對英文加密
source_en = 'Hello!'
encrypt_en = encrypt(aes_key, source_en)
print(encrypt_en)
# 解密
decrypt_en = decrypt(aes_key, encrypt_en)
print(decrypt_en)
print(source_en == decrypt_en)
# 中英文混合加密
source_mixed = 'Hello, 韓- 梅 -梅'
encrypt_mixed = encrypt(aes_key, source_mixed)
print(encrypt_mixed)
decrypt_mixed = decrypt(aes_key, encrypt_mixed)
print(decrypt_mixed)
print(decrypt_mixed == source_mixed)

# 剛好16位元組的情況
en_16 = 'abcdefgj10124567'
encrypt_en = encrypt(aes_key, en_16)
print(encrypt_en)
# 解密
decrypt_en = decrypt(aes_key, encrypt_en)
print(decrypt_en)
print(en_16 == decrypt_en)
mix_16 = 'abx張三豐12sa'
encrypt_mixed = encrypt(aes_key, mix_16)
print(encrypt_mixed)
decrypt_mixed = decrypt(aes_key, encrypt_mixed)
print(decrypt_mixed)
print(decrypt_mixed == mix_16)



您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • 1、不同類型的一維數組元素的預設初始化值;2、一維數組的記憶體解析;3、二維數組的聲明與初始化;4、二維數組元素的預設初始化值;5、二維數組的記憶體解析;6、(冒泡和快速)排序演算法及優化;7、查找(或搜索);8、Arrays工具類的使用。 ...
  • 程式猿有一個梗:寫代碼代碼不寫註釋的人,JJ就跟註釋一樣長!實際上良好的代碼風格和編程習慣,即使沒有代碼註釋一樣可以讓人賞(欲)心(哭)悅(無)目(淚)! 欲練此功,必先自宮,不論是C語言還是C++或者是其他編程語言,都必須遵守自己的命名規則,這樣才能被編譯器正確識別並編譯! 在定義變數時,變數名可 ...
  • ——傳統的枚舉存在一些問題,其中之一是兩個枚舉類型定義中的枚舉量可能發生衝突。 enum egg {Small, Medium, Large, Jumbo}; enum t_shirt {Small, Medium, Large, Xlarge}; 這將無法通過編譯(egg Small和t_shir ...
  • 項目簡介 項目來源於:https://gitee.com/coder_ze/iMusic 本系統基於Maven+JSP+SSM+Mysql實現的音樂網站。主要實現的功能有音樂播放、下載、上傳等幾個模塊。 難度等級:中等 技術棧 編輯器 Eclipse Version: 2020-03 (4.15.0 ...
  • 有時,使符號常量的作用域為類很有用: class Bakery { private: const int Months = 12; // declare a constant? FALSE double costs[Months]; ... 但這是行不通的,因為——聲明類只是描述了對象的形式,並沒有 ...
  • 在寫代碼的時候,免不了要使用變數。但程式中的一個變數並不一定是在哪裡都可以被使用,根據情況不同,會有不同的“有效範圍”。 看這樣一段代碼: def func(x): print ('X in the beginning of func(x): ', x) x = 2 print ('X in the ...
  • 一.瀏覽器內核太撈了一般人都會避開他 from selenium.webdriver import Chrome from selenium.webdriver import ChromeOptions option = ChromeOptions() option.add_experimental ...
  • spring註入map,spring註入一個介面的多個實現類在map里 ...
一周排行
    -Advertisement-
    Play Games
  • 前言 在我們開發過程中基本上不可或缺的用到一些敏感機密數據,比如SQL伺服器的連接串或者是OAuth2的Secret等,這些敏感數據在代碼中是不太安全的,我們不應該在源代碼中存儲密碼和其他的敏感數據,一種推薦的方式是通過Asp.Net Core的機密管理器。 機密管理器 在 ASP.NET Core ...
  • 新改進提供的Taurus Rpc 功能,可以簡化微服務間的調用,同時可以不用再手動輸出模塊名稱,或調用路徑,包括負載均衡,這一切,由框架實現並提供了。新的Taurus Rpc 功能,將使得服務間的調用,更加輕鬆、簡約、高效。 ...
  • 順序棧的介面程式 目錄順序棧的介面程式頭文件創建順序棧入棧出棧利用棧將10進位轉16進位數驗證 頭文件 #include <stdio.h> #include <stdbool.h> #include <stdlib.h> 創建順序棧 // 指的是順序棧中的元素的數據類型,用戶可以根據需要進行修改 ...
  • 前言 整理這個官方翻譯的系列,原因是網上大部分的 tomcat 版本比較舊,此版本為 v11 最新的版本。 開源項目 從零手寫實現 tomcat minicat 別稱【嗅虎】心有猛虎,輕嗅薔薇。 系列文章 web server apache tomcat11-01-官方文檔入門介紹 web serv ...
  • C總結與剖析:關鍵字篇 -- <<C語言深度解剖>> 目錄C總結與剖析:關鍵字篇 -- <<C語言深度解剖>>程式的本質:二進位文件變數1.變數:記憶體上的某個位置開闢的空間2.變數的初始化3.為什麼要有變數4.局部變數與全局變數5.變數的大小由類型決定6.任何一個變數,記憶體賦值都是從低地址開始往高地 ...
  • 如果讓你來做一個有狀態流式應用的故障恢復,你會如何來做呢? 單機和多機會遇到什麼不同的問題? Flink Checkpoint 是做什麼用的?原理是什麼? ...
  • C++ 多級繼承 多級繼承是一種面向對象編程(OOP)特性,允許一個類從多個基類繼承屬性和方法。它使代碼更易於組織和維護,並促進代碼重用。 多級繼承的語法 在 C++ 中,使用 : 符號來指定繼承關係。多級繼承的語法如下: class DerivedClass : public BaseClass1 ...
  • 前言 什麼是SpringCloud? Spring Cloud 是一系列框架的有序集合,它利用 Spring Boot 的開發便利性簡化了分散式系統的開發,比如服務註冊、服務發現、網關、路由、鏈路追蹤等。Spring Cloud 並不是重覆造輪子,而是將市面上開發得比較好的模塊集成進去,進行封裝,從 ...
  • class_template 類模板和函數模板的定義和使用類似,我們已經進行了介紹。有時,有兩個或多個類,其功能是相同的,僅僅是數據類型不同。類模板用於實現類所需數據的類型參數化 template<class NameType, class AgeType> class Person { publi ...
  • 目錄system v IPC簡介共用記憶體需要用到的函數介面shmget函數--獲取對象IDshmat函數--獲得映射空間shmctl函數--釋放資源共用記憶體實現思路註意 system v IPC簡介 消息隊列、共用記憶體和信號量統稱為system v IPC(進程間通信機制),V是羅馬數字5,是UNI ...