IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> 人工智能 -> Pytorch模型加密的方法 -> 正文阅读

[人工智能]Pytorch模型加密的方法

一、难点和原理

  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地址也是唯一的。

结束。

  人工智能 最新文章
2022吴恩达机器学习课程——第二课(神经网
第十五章 规则学习
FixMatch: Simplifying Semi-Supervised Le
数据挖掘Java——Kmeans算法的实现
大脑皮层的分割方法
【翻译】GPT-3是如何工作的
论文笔记:TEACHTEXT: CrossModal Generaliz
python从零学(六)
详解Python 3.x 导入(import)
【答读者问27】backtrader不支持最新版本的
上一篇文章      下一篇文章      查看所有文章
加:2022-04-26 11:41:49  更:2022-04-26 11:45:26 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年11日历 -2024/11/26 10:25:34-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码