gpt4 book ai didi

python - 文件中存在非 ASCII 字符 '\x97',但未声明编码

转载 作者:太空宇宙 更新时间:2023-11-04 05:56:59 26 4
gpt4 key购买 nike

我正在尝试在 Linux 中对 Python 脚本的内容进行编码。我刚开始使用一个名为 test.py 的简单脚本 -

# !/app/logs/Python/bin/python3
# -*- coding: ascii -*-
print ("hi")

获得脚本后,我会执行 vim -x test.py 并输入加密 key 两次。然后正常保存文件,然后使用 python test.py

执行脚本

我尝试了链接 here 中提供的几乎所有示例但我最终还是收到以下错误 -

SyntaxError: Non-ASCII character '\x97' in file test.py on line 1, but no encoding declared; see http://www.python.org/peps/pep-0263.html for details

我使用print sys.getdefaultencoding()检查了默认编码,它是acsii。

我在这里缺少什么。请澄清。我知道这个问题是重复的,但所有解决方案都没有帮助。

最佳答案

Python 知道如何执行明文 Python 源代码。如果对源文件进行加密,则它不再包含有效的Python源代码,并且无法直接执行。

这里有两种可能的方法。首先是仅混淆您的来源。您应该意识到混淆并不安全,用户可以通过一些工作恢复一些 Python 源代码(不一定是原始源代码,因为注释和文档字符串可能已被删除,变量名称可能已被更改)。您可以阅读How do I protect Python code?并谷歌搜索python obfuscate来找到一些混淆Python源代码的可能方法及其权衡。

源代码混淆的好消息是任何人都可以使用它而无需任何密码。

第二种方法是对源进行加密。如果您使用一个像样的工具,您可以假设在不知道 key 的情况下不可能读取或执行该文件。从这个意义上说,vim crypto 并没有最高的声誉。以最简单的方式(例如使用您的示例 vim -x),您必须解密文件才能执行它。不幸的是,好的加密模块并未在标准 Python 安装中提供,必须从 pypi 下载。众所周知的加密模块包括 pycryptocryptography .

然后,您可以加密大部分代码,然后在运行时请求 key 、解密并执行它。仍然是一项严肃的工作,但可行。

或者,您可以使用另一种语言 (C/C++) 构建一个解密器,用于解密文件的其余部分并将其输入 python 解释器,但从功能上来说,这只是上述方法的变体。

<小时/>

根据您的评论,我假设您想要加密源代码并在运行时对其进行解密(使用密码)。其原则是:

  • 构建一个 Python 脚本,该脚本将采用另一个任意 Python 脚本,使用安全加密模块对其进行编码,并在其前面添加一些解密代码。
  • 在运行时,前置代码将询问密码,解密加密代码并执行它

构建器可以是(此代码使用加密模块):

import cryptography.fernet
import cryptography.hazmat.primitives.kdf.pbkdf2
import cryptography.hazmat.primitives.hashes
import cryptography.hazmat.backends
import base64
import os
import sys

# the encryption function
def encrypt_source(infile, outfile, passwd):
with open(infile, 'rb') as fdin: # read original file
plain_data = fdin.read()
salt, key = gen_key(passwd) # derive a key from the password
f = cryptography.fernet.Fernet(key)
crypted_data = f.encrypt(plain_data) # encrypt the original code
with open(outfile, "w") as fdout: # prepend a decoding block
fdout.write("""#! /usr/bin/env python

import cryptography.fernet
import cryptography.hazmat.primitives.kdf.pbkdf2
import cryptography.hazmat.primitives.hashes
import cryptography.hazmat.backends
import base64
import os

def gen_key(passwd, salt): # key derivation
kdf = cryptography.hazmat.primitives.kdf.pbkdf2.PBKDF2HMAC(
algorithm = cryptography.hazmat.primitives.hashes.SHA256(),
length = 32,
salt = salt,
iterations = 100000,
backend = cryptography.hazmat.backends.default_backend()
)
return base64.urlsafe_b64encode(kdf.derive(passwd))

passwd = input("Password:") # ask for the password
salt = base64.decodebytes({})
key = gen_key(passwd.encode(), salt) # derive the key from the password and the original salt

crypted_source = base64.decodebytes( # decode (base64) the crypted source
b'''{}'''
)
f = cryptography.fernet.Fernet(key)
plain_source = f.decrypt(crypted_source) # decrypt it
exec(plain_source) # and exec it
""".format(base64.encodebytes(salt),
base64.encodebytes(crypted_data).decode()))

# derive a key from a password and a random salt
def gen_key(passwd, salt=None):
if salt is None: salt = os.urandom(16)
kdf = cryptography.hazmat.primitives.kdf.pbkdf2.PBKDF2HMAC(
algorithm = cryptography.hazmat.primitives.hashes.SHA256(),
length = 32,
salt = salt,
iterations = 100000,
backend = cryptography.hazmat.backends.default_backend()
)
return salt, base64.urlsafe_b64encode(kdf.derive(passwd))

if __name__ == '__main__':
if len(sys.argv) != 3:
print("Usage {} infile outfile".format(sys.argv[0]))
sys.exit(1)
passwd = input("Password:").encode() # ask for a password
encrypt_source(sys.argv[1], sys.argv[2], passwd) # and generates an encrypted Python script

关于python - 文件中存在非 ASCII 字符 '\x97',但未声明编码,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51301448/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com