在下面的教程中,我们将了解如何混淆Python程序。我们将使用名为pyarmor的Python包进行混淆。

有时候,我们可能会遇到需要将代码直接交付给客户的情况,但通过这种方式我们会失去对代码的控制。在这种情况下,我们可以对脚本进行加密以保护它,保留控制,并包含一些用于控制依赖性的备用条件,就像如果我们交付的代码仅供一定时间使用一样。

在下面的教程中,我们将使用一个具有上述功能的函数来解决上述问题。我们将使用pyarmor Python库对任何Python代码进行混淆。

那么,让我们开始吧。

创建一个基本函数

我们将从创建一个新的Python程序文件开始,以便对Python代码进行混淆。在文件中,我们将定义一个推理函数,并稍后对其进行加密。

让我们考虑以下代码段,用于推理函数。

文件:func.py

# importing the required modules  
import os  
import json  
import sys  
from datetime import datetime  
  
# defining an inference function  
def infer(person_name = "", tag = True):  
    '''  
    if the present year is 2021, then inference function will execute properly, else it fails.  
    Here the attribute variable contains the string version of the date in MM-DD-YYYY format  
    '''  
  
    print("Hello " + person_name + ", the inference function has been initiated successfully")  
  
    atr = str(datetime.now().strftime('%m-%d-%Y'))  
    resp = "Your license has been expired, please contact us."  
    expiration_year = int(2023)  
  
    try:  
        assert int(atr.split('-')[-1]) == expiration_year, resp  
    except AssertionError as e:  
        print(resp)  
        sys.exit()  
  
    # if the above assertion is True, it will reach until this point,  
    # otherwise it will stop in the previous line.  
  
    if tag:  
        print("Inference function has been done properly!")  
        return True  
    else:  
        return False  
  
if __name__ == "__main__":  
    _ = infer(person_name = "Peter Parker")  
  
    '''  
    Function outputs,  
    Case 1: if expiration_year = int(2021)  
    Hello Peter Parker, the inference function has been intiated successfully  
    Inference function has been done properly!  
    [Finished in 0.2s]  
  
    Case 2: if expiration_year = int(2022)  
    Hello Peter Parker, the inference function has been intiated successfully  
    Inference function has been done properly!  
    [Finished in 0.2s]  
  
    Case 3: if expiration_year = int(2023)  
    Hello Peter Parker, the inference function has been intiated successfully  
    You license has been expired, please contact us.  
    [Finished in 0.2s]  
    '''  

输出:

Hello Peter Parker, the inference function has been initiated successfully
Your license has been expired, please contact us.

解释:

在上述代码片段中,我们导入了一些必需的模块。然后,我们定义了一个名为infer()的推理函数,接受两个参数 - person_nametag=True。我们随后为用户启动推理函数打印了一条语句。然后,我们定义了一个名为atr的变量,用于存储当前日期和一个名为resp的字符串变量。我们还将另一个变量分配给expiration_year,为2023。我们使用try-except方法来处理任何异常。最后,我们使用if-else条件语句根据情况打印一条语句。最后,我们将name分配给"main"以执行推理函数。

现在,让我们将这个Python文件保存在一个文件夹中。

322-1.png

使用pyarmor加密文件

使用pyarmor加密文件的过程分为两个步骤:

第一步:安装pyarmor包

我们可以使用pip安装程序来安装pyarmor包,如下所示:

语法:

$ pip install pyarmor  

322-2.png

第二步:加密Python文件

我们可以在命令提示符中键入以下命令来加密文件。

语法:

$ pyarmor obfuscate --restrict=0 <filename>

现在,让我们在func.py文件上实施上述命令。

语法:

$ pyarmor obfuscate --restrict=0 func.py  

322-3.png

现在,如果我们打开包含原始func.py文件的文件夹,我们将看到一个名为dist的新子文件夹。

dist文件夹中,我们将找到另一个名为pytransform的文件夹和一个加密的func.py文件。

现在,让我们看看这个文件内部的内容。

文件:func.py(已加密)

from pytransform import pyarmor_runtime  
pyarmor_runtime()  
__pyarmor__(__name__, __file__, b'\x50\x59\x41\x52\x4d\x4f\x52\x00\...', 2)  

322-4.png

导入推理函数

一旦我们完成了到这个部分的工作,现在让我们尝试在一个新的Python文件中导入这个已加密的func.py,这个新文件被称为new.py,我们在dist文件夹中创建了它。

允许我们在运行时解密func.py的必需密钥已经由pyarmor处理。它存在于pytransform文件夹中,因此使代码对其他人的眼睛不可读。

但是,如果我们想对实际的func.py脚本进行一些修改,我们必须从第1步开始,继续按照相同的步骤操作。

322-5.png

让我们考虑以下代码片段,我们必须在新的Python文件内输入。

文件:new.py

# importing the inference function definition inside the func.py file  
from func import infer  
  
_ = infer(person_name = "Tony Stark")  

输出:

Hello Tony Stark, the inference function has been initiated successfully
Your license has been expired, please contact us.

解释:

在上面的代码片段中,我们导入了func.py的推理函数到我们创建的新Python文件new.py中。然后,我们使用与func.py相同的配置执行了该函数。

标签: Tkinter教程, Tkinter安装, Tkinter库, Tkinter入门, Tkinter学习, Tkinter入门教程, Tkinter, Tkinter进阶, Tkinter指南, Tkinter学习指南, Tkinter进阶教程, Tkinter编程