Pytorch模型加密的方法

18 篇文章 5 订阅

一、难点和原理

  1. 对一个文件进行加密或者解密其实有很多种方法,难点主要在于,得到加密文件之后,如何在程序运行时进行解密,而不是先解密再运行程序,这相当于没加密。(脱裤子放屁的感觉。。。)
  2. 对于pytorch框架,我们进入torch.load里面查看代码,如下图所示:
    在这里插入图片描述
    pytorch是可以读取 io.BytesIO 类型的数据的,因此,可以有如下的加密和解密过程:
  • 加密过程
  1. 我们可以将读取的模型先保存成 io.BytesIO的格式;
  2. 再把io.BytesIO格式的数据保存成 bytes格式的数据;
  3. 再对bytes数据进行加密;
  4. 然后保存成加密文件。
  • 解密过程
  1. 读取加密文件(用open去读取),得到加密的bytes格式数据;
  2. 解密,得到解密后的bytes格式数据;
  3. 将解密后的bytes格式数据,转换成io.Bytes格式数据;
  4. 使用torch.load直接读取io.Bytes格式数据,得到pytorch模型。

二、代码

  1. 对于加密算法,我们这里引入 cryptography库,利用其中的Fernet算法进行加密(Fernet具体是啥就不做介绍了),首先安装cryptography库
pip install cryptography
  1. 首先生成一串密钥,可以借助cryptography.fernet.Fernet库生成,也可以根据硬件信息的mac地址、硬件序列号啥的生成,这里以用cryptography.fernet.Fernet生成密钥为例,代码如下:
from cryptography.fernet import Fernet

key = Fernet.generate_key()
print(key)  # b'RtqikMWYdz45HAuXx-dguw6lmNXgOyT0XIMV8r0TtvU='

会随机生成一串bytes类型的字符串,我们将这串密钥保存到一个文件license当中,

with open('license', 'wb') as fw:
    fw.write(key)

加密过程,假设现在有pytorch的模型文件xxx.pth,则加密过程如下:

import io
import torch
# step1: 读取pytorch模型,并转成io.Bytes
model = torch.load(pth_file)
b = io.BytesIO()
torch.save(model, b)
b.seek(0)  # 这一句不能漏掉

# step2:io.Bytes格式数据转成bytes格式数据
pth_bytes = b.read()

# step3:读取加密license获取密钥,进行加密
 with open('license', 'rb') as fr:
     key = fr.read()
encrypted_data = Fernet(key).encrypt(pth_bytes)

# step4:保存加密文件
with open('encrypt.pth', 'wb') as fw:
    fw.write(encrypted_data)

  1. 解密过程
# step1:读取加密文件,得到加密的bytes格式数据
with open('encrypt.pth', 'rb') as fr:
    encrypted_data = fr.read()

# step2:解密,得到解密后的bytes格式数据
with open('license', 'rb') as fr:
    key = fr.read()
decrypted_data = Fernet(key).decrypt(encrypted_data)

# step3:解密后的bytes数据转成io.Bytes格式数据
b = io.BytesIO(decrypted_data)
b.seek(0)

# step4:torch.load读取解密后的io.Bytes格式数据
model = torch.load(b)

三、整体代码

将上述代码进行封装,整体代码如下所示:

import io
import torch
from cryptography.fernet import Fernet

key = b'vlu3T4bs2WWK5lc2QB-yKvGc_20P4gh6TqD7nhuh7pU='


def write_license(license_file, key):
    with open(license_file, 'wb') as fw:
        fw.write(key)


def read_license(license_file):
    with open(license_file, 'rb') as fr:
        key = fr.read()
    return key


def model_encryption(pth_file, encryp_file, license):
    model = torch.load(pth_file)
    b = io.BytesIO()
    torch.save(model, b)
    b.seek(0)
    pth_bytes = b.read()
    key = read_license(license)
    encrypted_data = Fernet(key).encrypt(pth_bytes)
    with open(encryp_file, 'wb') as fw:
        fw.write(encrypted_data)


def model_decryption(encryt_file, license):
    with open(encryt_file, 'rb') as fr:
        encrypted_data = fr.read()
    key = read_license(license)
    decrypted_data = Fernet(key).decrypt(encrypted_data)
    b = io.BytesIO(decrypted_data)
    b.seek(0)
    model = torch.load(b)
    return model

四、硬件绑定

  1. 一般可以利用硬件信息生成密钥,如获取机器的mac地址、ip、hostname,把这些信息编码成密钥。每次运行程序时,获取这串密钥,与license中的密钥比较,若不一致,则令程序无法正常进行。

  2. python中可以利用socket、uuid库获取mac地址、ip地址、hostname的代码如下所示:

import uuid
import socket
mac = uuid.UUID(int=uuid.getnode()).hex[-12:]
mac = ':'.join([mac[e:e + 2] for e in range(0, 11, 2)])

hostname = socket.gethostname()

address = socket.gethostbyname(hostname)

ps:有的同学可能想到获取硬件的序列号,如CPU的序列号、硬盘的序列号等,在windows系统比较好获取,但是例如在ubuntu想获取序列号需要root权限,在代码中不好实现,所以其实通过mac地址就足够了,因为mac地址也是唯一的。

结束。

  • 19
    点赞
  • 67
    收藏
    觉得还不错? 一键收藏
  • 27
    评论
### 回答1: PyTorch 是一个开源的深度学习框架,它提供了丰富的工具和接口,帮助开发者设计、训练和部署深度学习模型PyTorch 采用动态图的方式,使得用户可以更加方便地进行模型构建和调试。与其他框架相比,PyTorch 的代码简洁易懂,上手难度较低,因此受到了广泛的关注和使用。 PyTorch 提供了大量的函数和类,用于实现神经网络的各个组件,例如各种类型的层、损失函数、优化器等。它还支持自定义组件的开发,开发者可以根据自己的需求自由地添加新的层或修饰现有组件。此外,PyTorch 还提供了丰富的工具和函数,用于数据预处理、数据加载、可视化等,大大简化了深度学习的开发过程。 PDF 是一种常用的电子文档格式,它可以准确地保留原始文件的格式和布局,不受操作系统、软件版本等因素的影响。PDF 格式具有普遍的可读性和兼容性,因此广泛应用于文档共享、电子书制作、报告撰写等领域。 利用 PyTorch 和 PDF 结合,我们可以实现一些有趣的应用。例如,可以使用 PyTorch 加载已有的训练好的深度学习模型,然后将预测结果生成为 PDF 文档,以便于查看和分享。同时,也可以使用 PyTorch 将 PDF 中的文本、图片等内容进行识别和分类,实现自动化的文档处理。 总之,PyTorch 是一个强大的深度学习框架,而 PDF 是一种常用的电子文档格式。它们的结合可以实现更多有趣的应用,提升工作效率和用户体验。 ### 回答2: PyTorch是一种开源的深度学习框架,由Facebook人工智能研究院开发。它为研究人员和开发者提供了一个灵活且高效的工具,用于构建和训练神经网络。PyTorch具有动态计算图的特点,这意味着我们可以在运行时定义、修改和调试计算图,使得模型开发更加灵活和直观。 相较于其他深度学习框架,PyTorch具有以下几个优点。首先,它是一个非常Pythonic的框架,容易学习和使用。其次,PyTorch具有良好的文档和强大的社区支持,我们可以方便地找到并解决问题。此外,PyTorch还提供了许多预训练的模型和图像处理工具,方便我们进行各种任务的实验和开发。 PDF是一种可移植文档格式(Portable Document Format)的缩写。它是一种由Adobe Systems开发的文件格式,用于显示文档的打印版本。使用PDF格式,我们可以确保在不同操作系统、不同设备和不同软件中精确呈现文档的内容和格式。 与其他文件格式相比,PDF具有以下几个特点和优势。首先,PDF文件可以在不同平台和设备上保持一致的显示效果,无论是在Windows、Mac还是移动设备上都可以轻松打开和阅读。其次,PDF文件可以嵌入图片、文本和链接等多媒体元素,使得文档更加丰富和交互。此外,PDF还支持文档的加密和许可设置,保护文件的安全性和私密性。 总的来说,PyTorch是一种功能强大且易用的深度学习框架,而PDF是一种便捷和可靠的文档格式。它们分别用于神经网络的构建和训练,以及文档的可视化和共享。 ### 回答3: PyTorch是一个基于Python的开源机器学习库,用于构建深度神经网络。它提供了丰富的工具和函数,用于创建、训练和测试各种类型的神经网络模型PyTorch的最大特点是动态图机制,它允许用户在模型训练过程中进行灵活的操作和修改,提高了开发和调试的效率。此外,PyTorch还具备灵活的张量计算功能,在处理大规模数据和复杂计算时表现出色。 PDF(Portable Document Format)是一种用于表示电子文档的标准格式。与其他格式相比,PDF具有良好的可移植性,可以在不同操作系统和设备之间保持内容、格式和布局的一致性。PDF文件可以包含文本、图片、图形和多媒体元素等内容,并且可以通过密码保护、数字签名等功能进行安全性保护。超链接和书签功能使得PDF文件易于导航和查找特定内容。此外,PDF还支持一些高级特性,如表单域、多媒体注释和交互式元素,提供更多交互和用户体验的可能性。 综上所述,PyTorch是一个用于构建深度神经网络的机器学习库,具有动态图机制和强大的张量计算功能。而PDF是一种用于表示电子文档的标准格式,具有可移植性和安全性,可以保持内容和布局的一致性,并支持高级特性和交互功能。在机器学习领域,PyTorch可以用来进行模型的训练和优化,而PDF可以用来展示和分享相关的研究成果和报告。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 27
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值