Python 非ASCII字符'\x97';在文件中,但未声明编码

Python 非ASCII字符'\x97';在文件中,但未声明编码,python,linux,unicode,Python,Linux,Unicode,我试图在Linux中对Python脚本的内容进行编码。我刚从一个简单的脚本test.py开始 # !/app/logs/Python/bin/python3 # -*- coding: ascii -*- print ("hi") 一旦有了脚本,我就执行vim-x test.py并输入加密密钥两次。然后将文件另存为普通文件,然后使用python test.py 我尝试了链接中提供的几乎所有示例,但最终还是出现了以下错误- SyntaxError: Non-ASCII character '\x

我试图在
Linux
中对
Python
脚本的内容进行编码。我刚从一个简单的脚本test.py开始

# !/app/logs/Python/bin/python3
# -*- coding: ascii -*-
print ("hi")
一旦有了脚本,我就执行
vim-x test.py
并输入加密密钥两次。然后将文件另存为普通文件,然后使用
python test.py

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

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源代码(不一定是原始源代码,因为注释和文档字符串可能已被剥离,变量名称可能已更改)。您可以阅读和google for python obfuscate,以找到一些可能的模糊python源代码的方法以及它们之间的权衡

使用模糊源代码的好消息是,任何人都可以使用它,而无需任何密码

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

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

或者,您可以用另一种语言(C/C++)构建一个解密程序,对文件的其余部分进行解密并将其提供给python解释程序,但从功能上讲,这只是上述方法的一个变体


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

  • 构建一个Python脚本,该脚本将接受另一个任意Python脚本,使用安全加密模块对其进行编码,并在其前面添加一些解密代码
  • 在运行时,前置代码将请求密码,解密加密代码并执行它
生成器可能是(此代码使用加密模块):


除非我遗漏了一些东西,否则您已经对文件进行了加密,因此python将无法运行它。抱怨是因为您试图(有效地)向python解释器提供垃圾。当您
cat test.py
对该文件进行解密时,当然应该会发现该文件不再具有python可用的内容。您可以通过解密该脚本使其可执行。如果你想对“人”隐藏来源,你需要定义边界;然后我们可能会提出一些建议的方法。e、 你希望他们也能运行脚本吗?然而,这并不是真正在这个网站的领域。像这样的网站可能是解决此类问题的好地方。@sdevgd您误解了评论。如果您想要隐藏信息的高级方法,请在sec.se上发布。关于如何处理代码中的错误,这里是正确的地方。@sdevgd您获取了一个文本文件,对其进行了加密,然后试图让解释器运行它。那是行不通的。如果您的目标是对运行脚本语言的人隐藏脚本语言的内容,那么这就是您的问题(以及您的研究来源)。谢谢。看起来关于在运行时解密文件的解决方案应该对我有所帮助。我可以在加密时设置一个密钥,但当我尝试运行它时,它没有要求密钥。您能帮助我在运行时如何启用此功能吗?
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