自学内容网 自学内容网

python 对 xxx.pt或者xxx.pth文件加密和解密

在Python中,直接对.pt或.pth(PyTorch模型文件)进行加密和解密通常不是直接由PyTorch库本身支持的,因为这些文件主要是用于存储模型的权重和参数,而不是设计为加密存储。然而,你可以通过读取这些文件的内容,使用Python的加密库(如cryptography)来加密这些内容,然后将加密后的数据存储到新的文件中。解密过程则相反,从加密的文件中读取内容,解密后再保存到原始格式的文件中。

以下是一个简单的示例,展示了如何使用cryptography库来加密和解密.pt文件(注意,这里假设.pt文件的内容可以被当作二进制数据进行处理):

from cryptography.hazmat.primitives.ciphers import Cipher, algorithms, modes  
from cryptography.hazmat.primitives import padding  
from cryptography.hazmat.backends import default_backend  
from cryptography.hazmat.primitives.kdf.pbkdf2 import PBKDF2HMAC  
from os import urandom  
import base64  
from torch import load, save  
  
def generate_key(password: str, salt: bytes, key_length: int = 32) -> bytes:  
    kdf = PBKDF2HMAC(  
        algorithm=hashes.SHA256(),  
        length=key_length,  
        salt=salt,  
        iterations=100000,  
        backend=default_backend()  
    )  
    key = kdf.derive(password.encode())  
    return key  
  
def encrypt_file(input_file: str, output_file: str, password: str):  
    # 读取原始文件  
    with open(input_file, 'rb') as file_in:  
        data = file_in.read()  
  
    # 生成密钥和IV  
    salt = urandom(16)  
    key = generate_key(password, salt)  
    iv = urandom(16)  # 初始化向量  
  
    # 加密数据  
    cipher = Cipher(algorithms.AES(key), modes.CBC(iv))  
    encryptor = cipher.encryptor()  
    padder = padding.PKCS7(128).padder()  
    padded_data = padder.update(data) + padder.finalize()  
    encrypted_data = encryptor.update(padded_data) + encryptor.finalize()  
  
    # 将salt和IV与加密数据一起写入输出文件  
    with open(output_file, 'wb') as file_out:  
        file_out.write(salt)  
        file_out.write(iv)  
        file_out.write(encrypted_data)  
  
def decrypt_file(input_file: str, output_file: str, password: str):  
    # 读取加密文件  
    with open(input_file, 'rb') as file_in:  
        salt = file_in.read(16)  
        iv = file_in.read(16)  
        encrypted_data = file_in.read()  
  
    # 生成密钥  
    key = generate_key(password, salt)  
  
    # 解密数据  
    cipher = Cipher(algorithms.AES(key), modes.CBC(iv))  
    decryptor = cipher.decryptor()  
    padded_data = decryptor.update(encrypted_data) + decryptor.finalize()  
    unpadder = padding.PKCS7(128).unpadder()  
    data = unpadder.update(padded_data) + unpadder.finalize()  
  
    # 写入解密后的数据到文件  
    with open(output_file, 'wb') as file_out:  
        file_out.write(data)  
  
# 假设你有一个PyTorch模型文件叫做'model.pt'  
encrypt_file('model.pt', 'model_encrypted.pt', 'your_secret_password')  
# 解密后,你可以将'model_decrypted.pt'重新加载为PyTorch模型  
decrypt_file('model_encrypted.pt', 'model_decrypted.pt', 'your_secret_password')  

原文地址:https://blog.csdn.net/shanglianlm/article/details/140602376

免责声明:本站文章内容转载自网络资源,如本站内容侵犯了原著者的合法权益,可联系本站删除。更多内容请关注自学内容网(zxcms.com)!