使用py2exe / pygame2exe在exe中隐藏高分文本文件

时间:2014-09-27 19:02:20

标签: python text pygame exe py2exe

我在游戏中使用Pygame创建了一个高分系统,它在文本文件name.txtscore.txt中保存了名称和分数,但问题是任何人都可以编辑该文本files.So我可以将它们隐藏在exe文件中 python版本2.7
安装脚本: pygame2exe

如果有可能,我可以在没有额外模块的情况下完成。 更新:我显然需要以某种方式加密文本。你能建议一些简单加密alghoritham吗? 请注意,我使用数字和换行符

我仍然希望将文件放入exe。

1 个答案:

答案 0 :(得分:1)

对于此算法使用强加密没什么意义,因为您的程序需要访问解密密钥,因此如果确定的用户查看您的程序代码,他们可以找出您的程序存储的位置关键以及它用它做什么。真的,阅读&理解.pyc中的代码比读取.py更困难,但它比打破良好的加密要容易得多。

无论如何,这里有一些代码可以对任意字符串进行简单的加密/解密。如果字符串不是非常随机的,它最有效,并且它对长字符串比短字符串更好。

要加密,它首先使用gzip压缩数据,这不仅可以使数据更小,还可以减少数据中的模式数量,从而提高加密质量。然后,它使用范围(256)中的一系列随机整数对每个字节的整数值(在压缩数据中)进行异或运算,以生成编码版本。

在这种意义上,XOR运算是对称的:如果a = b ^ c,则b = a ^ c(以及c = a ^ b)。因此,要撤消XORing,我们只需再次应用它。

因此,要解密,我们只需反转加密过程。首先,我们将编码版本与我们用于编码的相同系列的随机整数进行异或,然后将其解压缩。

如果您要隐藏的数据量相当小或高度随机,您可以跳过压缩/解压缩步骤,因为从一个好的伪随机数生成器(如Mersenne Twister那样的Python)进行异常处理默认情况下使用)实际上是一种非常好的加密形式,假设攻击者不知道生成随机数的算法和随机序列的种子。 (请注意,Python的random.seed()接受任何可散列对象作为种子:例如int,字符串,甚至是元组。)

下面的代码使用年度日历作为测试数据,以便于查看流程是否有效。

<强> gzipcrypt.py

#! /usr/bin/env python

''' Simple encryption
    Encode by gziping then XORing bytes with a pseudorandom stream
    Decode by XORing and then unziping with the same pseudorandom stream

    Written by PM 2Ring 2014.09.28
'''

import random

import sys
from calendar import calendar  


def randoms(seed):
    random.seed(seed)
    while True:
        yield random.randint(0, 255)


def xorcrypt(data, key):
    return str(bytearray(d ^ k for d, k in 
        zip(bytearray(data), randoms(key))))


def zipcrypt(data, key):
    return xorcrypt(data.encode('zlib_codec'), key)


def decryptzip(data, key):
    return xorcrypt(data, key).decode('zlib_codec')


def main():
    #Test encryption & decryption
    key = sys.argv[1] if len(sys.argv) > 1 else 42
    data = calendar(2014)

    print data
    print 'Length:', len(data), '\n'

    #code = xorcrypt(data, key)
    code = zipcrypt(data, key)
    print `code` 
    print 'Length:', len(code), '\n'

    #newd = xorcrypt(code, key)
    newd = decryptzip(code, key)
    print newd
    print newd == data


if __name__ == '__main__':
    main()

修改

这是一个更简单的xorcrypt()版本,它不使用生成器函数bytearray(),或者希望更易于理解的列表推导。

def xorcrypt1(data, key):
    random.seed(key)
    code = []
    for ch in data:
        n = ord(ch)
        n = n ^ random.randint(0, 255)
        code.append(chr(n))
    return ''.join(code)