最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

Python中Cryptography庫實現(xiàn)加密解密

 更新時間:2024年02月03日 11:04:05   作者:軟件技術(shù)愛好者  
Python中Cryptography庫給你的文件加把安全鎖,本文主要介紹了Python中Cryptography庫實現(xiàn)加密解密,具有一定的參考價值,感興趣的可以了解一下

先介紹與加密解密有關(guān)的幾個基本概念。

  • 加密(Encryption):加密是將明文轉(zhuǎn)換為密文的過程,使得未經(jīng)授權(quán)的人無法讀懂。
  • 解密(Decryption):解密是將密文轉(zhuǎn)換為明文的過程,使得原始信息可以被正確的人閱讀。
  • 密鑰(Key):密鑰是加密和解密過程中的關(guān)鍵。它可以是單個數(shù)字、字符串或者是更復(fù)雜的密鑰對象。
  • 算法:算法是加密和解密過程中的具體步驟。

cryptography是一個強大的Python庫,提供了一套豐富的加密相關(guān)的操作,用于安全地處理數(shù)據(jù)。它旨在提供簡單易用的加密方法,同時也支持更高級的加密需求,使這項技術(shù)變得易于使用。cryptography庫包含兩個主要的高級組件:Fernet(對稱加密)和hazmat(危險材料層)。

主要特點

  • 易用性:cryptography庫的設(shè)計初衷是易于使用,盡量減少安全漏洞的出現(xiàn)。
  • 安全性:它提供了最新的加密算法,并且經(jīng)過安全專家的審查。
  • 靈活性:對于需要直接訪問加密算法的高級用戶,cryptography提供了hazmat模塊。

主要組件

Fernet:提供了對稱加密的實現(xiàn),非常適合用于加密和解密可以安全共享密鑰的場景。使用Fernet非常簡單,只需要一個密鑰就可以進行安全的數(shù)據(jù)加密和解密。

hazmat(Hazardous Materials):這個模塊提供了底層加密原語(如塊密碼、消息摘要算法等)。它是為那些需要執(zhí)行特定加密操作的高級用戶設(shè)計的,但使用時需要格外小心,因為不當?shù)氖褂每赡軐?dǎo)致安全問題。

官方文檔https://cryptography.io/en/latest/

在Windows平臺上安裝cryptography,可在cmd命令行中,輸入如下命令:

pip install cryptography

回車,默認情況使用國外線路較慢,我們可以使用國內(nèi)的鏡像網(wǎng)站:

豆瓣:https://pypi.doubanio.com/simple/

清華:https://pypi.tuna.tsinghua.edu.cn/simple

電腦上安裝了多個Python版本,你可以為特定版本的Python安裝模塊(庫、包)。例如我的電腦中安裝了多個Python版本,要在Python 3.10版本中安裝,并使用清華的鏡像,cmd命令行中,輸入如下命令

py -3.10 -m pip install cryptography -i https://pypi.tuna.tsinghua.edu.cn/simple

示例

1、生成私鑰和獲取公鑰

# -*- coding: utf-8 -*-

from cryptography.hazmat.backends import default_backend
from cryptography.hazmat.primitives import serialization
from cryptography.hazmat.primitives.asymmetric import rsa

# 生成私鑰
private_key = rsa.generate_private_key(
    public_exponent=65537,
    key_size=2048,
    backend=default_backend()
)

# 獲取公鑰
public_key = private_key.public_key()

2、私鑰和公鑰序列化

# 私鑰序列化
private_key_pem = private_key.private_bytes(
    encoding=serialization.Encoding.PEM,
    format=serialization.PrivateFormat.PKCS8,
    encryption_algorithm=serialization.NoEncryption()
)

# 保存私鑰到文件
with open('private.key', 'wb') as f:
    f.write(private_key_pem)


# 公鑰序列化
public_key_pem = public_key.public_bytes(
    encoding=serialization.Encoding.PEM,
    format=serialization.PublicFormat.SubjectPublicKeyInfo
)

# 保存公鑰到文件
with open('public.pem', 'wb') as f:
    f.write(public_key_pem)

3、私鑰和公鑰的反序列化

from cryptography.hazmat.backends import default_backend
from cryptography.hazmat.primitives import serialization

# 從文件加載私鑰
with open("private.key", "rb") as private_key_file:
    private_key = serialization.load_pem_private_key(
        private_key_file.read(),
        password=None,
        backend=default_backend()
    )

# 從文件加載公鑰
with open("public.pem", "rb") as public_pem_file:
    public_key = serialization.load_pem_public_key(
        public_pem_file.read(),
        backend=default_backend()
    )

4、公鑰加密私鑰解密

from cryptography.hazmat.backends import default_backend
from cryptography.hazmat.primitives import serialization
from cryptography.hazmat.primitives import hashes
from cryptography.hazmat.primitives.asymmetric import padding

# 公鑰解密
message = 'Hello'

encrypted = public_key.encrypt(
    plaintext=message.encode('utf-8'),
    padding=padding.OAEP(
        mgf=padding.MGF1(algorithm=hashes.SHA256()),
        algorithm=hashes.SHA256(),
        label=None
    )
)

print(encrypted)
# b'm\xf2\x8d\xa84\xbe\x13\xe1...'

# 私鑰解密
original_message = private_key.decrypt(
    ciphertext=encrypted,
    padding=padding.OAEP(
        mgf=padding.MGF1(algorithm=hashes.SHA256()),
        algorithm=hashes.SHA256(),
        label=None
    )
)

print(original_message.decode('utf-8'))
# Hello

5、私鑰簽名公鑰驗簽

# -*- coding: utf-8 -*-

from cryptography.hazmat.backends import default_backend
from cryptography.hazmat.primitives import serialization
from cryptography.hazmat.primitives import hashes
from cryptography.hazmat.primitives.asymmetric import padding

# 私鑰簽名
message = 'Hello'

signature = private_key.sign(
    data=message.encode('utf-8'),
    padding=padding.PSS(
        mgf=padding.MGF1(hashes.SHA256()),
        salt_length=padding.PSS.MAX_LENGTH
    ),
    algorithm=hashes.SHA256()
)
print(signature)
# b'm\xf2\x8d\xa84\xbe\x13\xe1...'

# 公鑰驗簽 如果驗證失敗拋出異常cryptography.exceptions.InvalidSignature
public_key.verify(
    signature=signature,
    data='Hello'.encode('utf-8'),
    padding=padding.PSS(
        mgf=padding.MGF1(hashes.SHA256()),
        salt_length=padding.PSS.MAX_LENGTH
    ),
    algorithm=hashes.SHA256()
)

簡單示例:使用Fernet進行數(shù)據(jù)加密和解密源碼:

from cryptography.fernet import Fernet

# 生成密鑰
key = Fernet.generate_key()
cipher_suite = Fernet(key)

# 加密數(shù)據(jù)
data = b"Hello, cryptography!"
encrypted_data = cipher_suite.encrypt(data)
print(f"Encrypted: {encrypted_data}")

# 解密數(shù)據(jù)
decrypted_data = cipher_suite.decrypt(encrypted_data)
print(f"Decrypted: {decrypted_data}")

運行效果:

圖形用戶界面的文件加密解密程序

使用tkinter添加界面的加密解密程序,當用戶點擊“加密文件”或“解密文件”按鈕時,程序會從這個文本框中獲取密鑰,并使用它進行相應(yīng)的加密或解密操作。加密和解密的文件將會被保存在與原文件相同的目錄下,加密文件的文件名在原圖片文件名前添加enc_,解密文件的文件名在原加密圖片文件名前添加dec_

先給出運行效果:

源碼如下:

import tkinter as tk
from tkinter import filedialog
from cryptography.fernet import Fernet
import os

def encrypt(filename, key, status_label):
    try:
        f = Fernet(key.encode())  # 將密鑰從字符串轉(zhuǎn)換為字節(jié)
        with open(filename, "rb") as file:
            file_data = file.read()
        encrypted_data = f.encrypt(file_data)
        dir_name, base_filename = os.path.split(filename)
        # 分離目錄和文件名
        encrypted_filename = f"enc_{base_filename}"
        # 將加密文件保存在原始目錄中
        encrypted_file_path = os.path.join(dir_name, encrypted_filename)
        with open(encrypted_file_path, "wb") as file:
            file.write(encrypted_data)
        status_label.config(text=f"提示:文件已加密:{encrypted_filename}")
    except Exception as e:
        status_label.config(text=f"提示:加密失敗: {str(e)}")

def decrypt(filename, key, status_label):
    try:
        f = Fernet(key.encode())  # 將密鑰從字符串轉(zhuǎn)換為字節(jié)
        with open(filename, "rb") as file:
            encrypted_data = file.read()
        decrypted_data = f.decrypt(encrypted_data)
        # 分離目錄和文件名
        dir_name, base_filename = os.path.split(filename)
        decrypted_filename = f"dec_{base_filename}"
        # 將解密文件保存在原始目錄中
        decrypted_file_path = os.path.join(dir_name, decrypted_filename)
        with open(decrypted_file_path, "wb") as file:
            file.write(decrypted_data)
        status_label.config(text=f"提示:文件已解密:{decrypted_filename}")
    except Exception as e:
        status_label.config(text=f"提示:解密失敗: {str(e)}")

# 創(chuàng)建GUI界面
def select_file(operation, key_entry, status_label):
    key = key_entry.get()  # 從文本框獲取密鑰
    if not key:
        status_label.config(text="提示:操作失敗:未輸入密鑰")
        return
    
    file_path = filedialog.askopenfilename()
    if file_path:  # 如果file_path不是空字符串
        if operation == 'encrypt':
            encrypt(file_path, key, status_label)
        elif operation == 'decrypt':
            decrypt(file_path, key, status_label)
    else:
        status_label.config(text="提示:沒有選擇文件")

def main():
    root = tk.Tk()
    root.title("加密解密程序")
    
    tk.Label(root, text="密鑰:").pack()
    key_entry = tk.Entry(root, show='*', width=50)  # 密鑰輸入框
    key_entry.insert(0, 'X3Q8PvDs2EzKHK-8TjgUE8HkZ8QeuOe0S7-3VVqjTDI=') # 設(shè)置默認值  
    key_entry.pack()
    
    status_label = tk.Label(root, text="提示:請選擇操作", height=2)
    status_label.pack()
    
    tk.Button(root, text="加密文件", command=lambda: select_file('encrypt', key_entry, status_label)).pack()
    tk.Button(root, text="解密文件", command=lambda: select_file('decrypt', key_entry, status_label)).pack()
    
    root.mainloop()

if __name__ == "__main__":
    main()

cryptography庫提供了許多高級功能,提供了多種密碼學(xué)算法,包括對稱加密、非對稱加密、哈希函數(shù)、簽名、密鑰管理等等。支持多種加密標準,包括AES、DES、RSA、SSL/TLS等等,同時也提供了許多密碼學(xué)工具,如密碼學(xué)隨機數(shù)生成器、PBKDF2函數(shù)、密碼學(xué)算法器等等。關(guān)于這些詳情請閱讀相關(guān)文檔,在此僅舉以下是一個簡單的例子,展示了如何生成RSA密鑰對、使用公鑰進行加密以及使用私鑰進行解密,源碼如下:

from cryptography.hazmat.backends import default_backend
from cryptography.hazmat.primitives.asymmetric import rsa
from cryptography.hazmat.primitives import serialization
from cryptography.hazmat.primitives.asymmetric import padding
from cryptography.hazmat.primitives import hashes

# 生成RSA密鑰對
private_key = rsa.generate_private_key(
    public_exponent=65537,
    key_size=2048,
    backend=default_backend()
)
public_key = private_key.public_key()

# 將私鑰序列化并保存到文件
with open("private_key.pem", "wb") as f:
    f.write(private_key.private_bytes(
        encoding=serialization.Encoding.PEM,
        format=serialization.PrivateFormat.PKCS8,
        encryption_algorithm=serialization.NoEncryption()
    ))

# 將公鑰序列化并保存到文件
with open("public_key.pem", "wb") as f:
    f.write(public_key.public_bytes(
        encoding=serialization.Encoding.PEM,
        format=serialization.PublicFormat.SubjectPublicKeyInfo
    ))

# 讀取公鑰進行加密
with open("public_key.pem", "rb") as f:
    public_key = serialization.load_pem_public_key(
        f.read(),
        backend=default_backend()
    )

message = "Hello, RSA Cryptography!".encode()
encrypted = public_key.encrypt(
    message,
    padding.OAEP(
        mgf=padding.MGF1(algorithm=hashes.SHA256()),
        algorithm=hashes.SHA256(),
        label=None
    )
)

# 讀取私鑰進行解密
with open("private_key.pem", "rb") as f:
    private_key = serialization.load_pem_private_key(
        f.read(),
        password=None,
        backend=default_backend()
    )

original_message = private_key.decrypt(
    encrypted,
    padding.OAEP(
        mgf=padding.MGF1(algorithm=hashes.SHA256()),
        algorithm=hashes.SHA256(),
        label=None
    )
)

# 顯示解密后的消息
print(original_message.decode())

這個例子首先生成了一個2048位的RSA密鑰對,將私鑰保存到private_key.pem文件中,將公鑰保存到public_key.pem文件中。接下來,代碼從public_key.pem文件中讀取公鑰用于加密消息,從private_key.pem文件中讀取私鑰用于解密消息。最后,使用公鑰對一段消息進行加密,然后使用私鑰將消息解密。padding.OAEP是一種常用的填充方式,與SHA-256哈希算法一起使用,以確保加密過程的安全性。

到此這篇關(guān)于Python中Cryptography庫實現(xiàn)加密解密的文章就介紹到這了,更多相關(guān)Python Cryptography加密解密內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • Python 的 with 語句詳解

    Python 的 with 語句詳解

    這篇文章主要介紹了Python 的 with 語句,本文詳細講解了with語句、with語句的歷史、with語句的使用例子等,需要的朋友可以參考下
    2014-06-06
  • Python內(nèi)置函數(shù)int()的具體使用

    Python內(nèi)置函數(shù)int()的具體使用

    這篇文章主要為大家介紹了Python內(nèi)置函數(shù)int()的具體使用,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步,早日升職加薪
    2023-03-03
  • python虛擬環(huán)境創(chuàng)建的兩種方法

    python虛擬環(huán)境創(chuàng)建的兩種方法

    本文主要介紹了python虛擬環(huán)境創(chuàng)建的兩種方法,文中通過示例代碼介紹的非常詳細,對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2023-05-05
  • Python實現(xiàn)自動化刪除Word文檔超鏈接的實用技巧

    Python實現(xiàn)自動化刪除Word文檔超鏈接的實用技巧

    在日常工作中,我們經(jīng)常需要處理各種Word文檔,本文將深入探討如何利用Python,特別是借助一個功能強大的庫,高效移除Word文檔中的超鏈接,需要的可以了解下
    2025-09-09
  • python 3利用Dlib 19.7實現(xiàn)攝像頭人臉檢測特征點標定

    python 3利用Dlib 19.7實現(xiàn)攝像頭人臉檢測特征點標定

    這篇文章主要為大家詳細介紹了python 3利用Dlib 19.7實現(xiàn)攝像頭人臉檢測特征點標定,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2018-02-02
  • 7個關(guān)于Python的經(jīng)典基礎(chǔ)案例

    7個關(guān)于Python的經(jīng)典基礎(chǔ)案例

    這篇文章主要給大家分享 7個關(guān)于Python的經(jīng)典基礎(chǔ)案例,列表排序、調(diào)換字典鍵值、刪除列表中的重復(fù)元素、輸出質(zhì)數(shù)、判斷是一年中第幾天、猜數(shù)字、進制轉(zhuǎn)換;,需要的朋友可以參考一下
    2021-11-11
  • Python疫情確診折線圖實現(xiàn)數(shù)據(jù)可視化實例詳解

    Python疫情確診折線圖實現(xiàn)數(shù)據(jù)可視化實例詳解

    數(shù)據(jù)可視化是指用圖形或表格的方式來呈現(xiàn)數(shù)據(jù)。圖表能夠清楚地呈現(xiàn)數(shù)據(jù)性質(zhì),?以及數(shù)據(jù)間或?qū)傩蚤g的關(guān)系,可以輕易地讓人看圖釋義。用戶通過探索圖(Exploratory?Graph)可以了解數(shù)據(jù)的特性、尋找數(shù)據(jù)的趨勢、降低數(shù)據(jù)的理解門檻
    2022-09-09
  • python使用phonemizer實現(xiàn)獲取英文文本句子單詞音素

    python使用phonemizer實現(xiàn)獲取英文文本句子單詞音素

    這篇文章主要為大家詳細介紹了python如何使用phonemizer實現(xiàn)獲取英文文本句子單詞音素,文中的示例代碼講解詳細,感興趣的小伙伴可以跟隨小編一起了解下
    2024-11-11
  • 解決python中安裝serial及No module named ‘serial.tools‘等問題

    解決python中安裝serial及No module named ‘serial.too

    這篇文章主要介紹了解決python中安裝serial及No module named ‘serial.tools‘等問題,具有很好的參考價值,希望對大家有所幫助,如有錯誤或未考慮完全的地方,望不吝賜教
    2023-09-09
  • Python中的rfind()方法使用詳解

    Python中的rfind()方法使用詳解

    這篇文章主要介紹了Python中的rfind()方法使用詳解,是Python入門中的基礎(chǔ)知識,需要的朋友可以參考下
    2015-05-05

最新評論

海丰县| 吴桥县| 上栗县| 民县| 华池县| 石景山区| 兖州市| 张家港市| 长治市| 吉木乃县| 丹巴县| 静乐县| 凤山县| 农安县| 四川省| 平南县| 紫金县| 蕉岭县| 四会市| 汉阴县| 玉田县| 巴林左旗| 桐城市| 延津县| 土默特右旗| 绩溪县| 永兴县| 广元市| 神农架林区| 五常市| 视频| 介休市| 岳阳市| 隆化县| 茂名市| 柳河县| 布拖县| 固镇县| 米易县| 乌鲁木齐县| 勐海县|