【问题标题】:Encrypt/UnEncrypt Python Scripts in C在 C 中加密/取消加密 Python 脚本
【发布时间】:2014-02-18 20:33:02
【问题描述】:

重复(我还没有找到答案): https://stackoverflow.com/questions/4066361/how-to-obfuscate-python-code How do I protect Python code?

所以我查看了上面的两个链接 ^^ 并且我发现对于实际加密 python 脚本和/或混淆 python 代码没有任何用处。所以我是 C 新手,但在 python 方面经验丰富,如果我想开发商业 python 项目,我最好的想法是:

创建一个 c 脚本和一个加密和编译的 python 脚本 C 脚本需要简单地提供一个字符串加密密钥并对其进行解密。仅供参考,我从未真正尝试过加密,我知道这并不完美。但我不需要完美。我只是想让反编译我的 python 源代码变得更加困难,意识到这仍然很容易,但 AS 并不容易。

我目前查看了 Cython,我可以轻松生成 *.c 文件,现在如何将其编译为二进制文件? (与视觉工作室)

那么我如何加密我的 python 代码并从 C 脚本中解密(我可以将其编译为二进制文件,使其更难编辑)?

【问题讨论】:

  • 这种欲望只会导致痛苦。摆脱它。
  • 如果您打算使用 C 脚本解密它,用户最终不会通过您的 C 脚本获得未加密的副本吗?
  • 既然你只想给好奇的读者带来不便,我建议使用最简单的加密方法:将所有零翻转为一,将一翻转为零。应该通过 0xFF 对每个字节进行异或运算。另一个好处是,加密方案与解密方案相同,与其他方案相比可节省 50% 的工作量。
  • 在您的 Python 代码上放置一个 Web 界面,并将您的软件作为服务出售。
  • 将加密的 Python 代码作为字符串存储在 C 程序中,在运行时解密并在嵌入式解释器中运行。但有什么意义呢?任何能够理解 Python 源代码的人都应该足够了解使用调试器运行 C 程序、正确断点并提取解密缓冲区。或者,首先用 C/C++ 编写程序,不要使用 Python :)

标签: python c python-2.7 encryption


【解决方案1】:

我会这样做:

1) 创建一个生成密钥并将其存储到文本文件的 C 脚本

2) 运行Python时拿起钥匙立即删除文本文件

3) 使用密钥解密 Python 代码中真正重要的部分(确保没有这些位会破坏您的脚本)然后全部导入

4) 立即重新加密重要的 Python 位,并删除 .pyc 文件

这将是可以击败的,但你可以接受。

要加密和重新加密您的 python 位,请尝试以下代码:

from hashlib import md5
from Crypto.Cipher import AES
from Crypto import Random

def encrypt(in_file, out_file, password, key_length=32):
    bs = AES.block_size
    salt = Random.new().read(bs - len('Salted__'))
    key, iv = derive_key_and_iv(password, salt, key_length, bs)
    cipher = AES.new(key, AES.MODE_CBC, iv)
    out_file.write('Salted__' + salt)
    finished = False
    while not finished:
        chunk = in_file.read(1024 * bs)
        if len(chunk) == 0 or len(chunk) % bs != 0:
            padding_length = (bs - len(chunk) % bs) or bs
            chunk += padding_length * chr(padding_length)
            finished = True
        out_file.write(cipher.encrypt(chunk))

def decrypt(in_file, out_file, password, key_length=32):
    bs = AES.block_size
    salt = in_file.read(bs)[len('Salted__'):]
    key, iv = derive_key_and_iv(password, salt, key_length, bs)
    cipher = AES.new(key, AES.MODE_CBC, iv)
    next_chunk = ''
    finished = False
    while not finished:
        chunk, next_chunk = next_chunk, cipher.decrypt(in_file.read(1024 * bs))
        if len(next_chunk) == 0:
            padding_length = ord(chunk[-1])
            chunk = chunk[:-padding_length]
            finished = True
        out_file.write(chunk)

总而言之,这里有一些伪代码:

def main():
    os.system("C_Executable.exe")

    with open("key.txt",'r') as f:
        key = f.read()

    os.remove("key.txt")


    #Calls to decrpyt files which look like this:
    with open("Encrypted file name"), 'rb') as in_file, open("unecrypted file name"), 'wb') as out_file:
        decrypt(in_file, out_file, key)

        os.remove("encrypted file name")

    import fileA, fileB, fileC, etc

    global fileA, fileB, fileC, etc

    #Calls to re-encrypt files and remove unencrypted versions along with .pyc files using a similar scheme to decryption calls

    #Whatever else you want

但只是强调和重要的一点,

Python 不是为此而生的!它应该是开放和免费的!

如果您发现自己在这个时刻别无选择,您可能应该只使用不同的语言

【讨论】:

  • "Python 不是为此而生的!它应该是开放和免费的!"我意识到这一点,但我真的不能改变语言。就像我说的,它不一定是完美的
  • 对,所以我也给了你正确的答案!
  • 当然这适用于执行的 python 代码,但我仍然需要一个 C 脚本,就像我说的我是 c 新手
  • @pianist1119 我从来没有用过C,所以我能提供的唯一帮助就是给你a link,但这应该是你要找的。​​span>
【解决方案2】:

了解 Nuitka 项目。它是一个 python 编译器,可以将你的 python 脚本编译为使用 libpython 运行的本机可执行代码。

http://nuitka.net/

【讨论】:

  • 我还没有尝试过,因为我需要在我的 Windows 开发平台上安装 Visual Studio,但这看起来正是我所需要的
  • 好的,我刚刚从 here 安装了 Visual Studio Express 2013,但我的 Nuitka 没有检测到它:scons:警告:找不到 Visual Studio 编译器的版本...
【解决方案3】:

你没有解释为什么你觉得需要加密/解密。答案可能会大大改变所提供的任何建议。

例如,假设您想保护知识产权,但又喜欢使用 python 编码的便利性。如果这是您的动力,请考虑使用 cython -- http://cython.org

但是假设您更关心安全性(即:防止有人在未经用户许可的情况下更改您的代码)。在这种情况下,您可以考虑使用某种嵌入式加载程序,在调用嵌入式 python 解释器之前检查您的 python 源代码。

我敢肯定,您可能还有 1/2 打其他原因想要加密。

【讨论】:

  • 实际上 - 建议 cython 是我的答案。需要注意的是,如果不是保护知识产权,它可能无法实现他的目标。
  • 好的,但是如何使用 cython 构建二进制文件?它给了我一个包含(一堆)库的 c 文件
  • 您需要创建一个 setup.py -- 请参阅此链接 docs.cython.org/src/userguide/wrapping_CPlusPlus.html
猜你喜欢
  • 2022-01-14
  • 2018-07-20
  • 1970-01-01
  • 2019-04-13
  • 2011-03-12
  • 1970-01-01
  • 2016-06-08
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多