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

Python 使用py2exe/pygame2exe在exe中隐藏高分文本文件,python,text,pygame,exe,py2exe,Python,Text,Pygame,Exe,Py2exe,我在游戏中有一个高分系统,是我在Pygame中制作的,它将名字和分数保存在文本文件name.txt和score.txt中,但问题是任何人都可以编辑这些文本文件。所以我可以将它们隐藏在exe文件中。 python版本2.7 安装脚本:pygame2exe 如果可能的话,我可以不用额外的模块来做。 更新:我显然需要以某种方式加密文本。你能推荐一些简单的加密算法吗? 请注意,我使用数字和换行符 我仍然希望将文件放在exe中。对该算法使用强加密没有多大意义,因为您的程序需要访问解密密钥,因此,如果确定的

我在游戏中有一个高分系统,是我在
Pygame
中制作的,它将名字和分数保存在文本文件
name.txt
score.txt
中,但问题是任何人都可以编辑这些文本文件。所以我可以将它们隐藏在exe文件中。
python版本2.7
安装脚本:pygame2exe

如果可能的话,我可以不用额外的模块来做。 更新:我显然需要以某种方式加密文本。你能推荐一些简单的加密算法吗? 请注意,我使用数字和换行符


我仍然希望将文件放在exe中。

对该算法使用强加密没有多大意义,因为您的程序需要访问解密密钥,因此,如果确定的用户查看您的程序代码,他们可以找出您的程序存储密钥的位置以及密钥的用途。诚然,读取和理解.pyc中的代码比读取.py要困难一些,但仍然比破坏良好的加密容易得多

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

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

从这个意义上说,异或运算是对称的:如果a=b^c,那么b=a^c(也就是c=a^b)。所以要撤销XORing,我们只需再次应用它

所以要解密,我们只需反转加密过程。首先,我们用我们用来编码的同一系列随机整数对编码版本进行异或运算,然后解压它

如果要隐藏的数据量非常小或非常随机,则可以跳过压缩/解压缩步骤,因为使用一个好的伪随机数生成器(如Python默认使用的Mersenne Twister)中的一系列随机字节进行XORing实际上是一种非常好的加密形式,假设攻击者不知道生成随机数的算法和随机序列的种子。(请注意,Python的random.seed()接受任何可哈希对象作为种子:例如int、string甚至tuple)

下面的代码使用一年中的日历作为测试数据,以便于查看流程是否正常工作

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)

py2exe exe文件实际上是压缩文件。因此,即使您将文件保存在exe中,任何人都可以正确打开它“隐藏”文件需要加密,这是一个巨大的主题。那么我应该使用什么模块进行加密。我不相信有人会为了获得更多分数而如此努力。如果您相信没有人会真的如此努力地获得分数,尝试
rot13
算法,这是一种非常简单的加密方案。通常,您不能假设当前用户可以写入您正在运行的当前可执行文件。只是碰巧Windows在Vista之前没有基本的安全性,所以很多人养成了坏习惯。相反,您必须始终写入每个用户位置的文件(Windows上的APPDATA,其他地方的XDG_DATA_HOME)谢谢,当我更好地学习python和密码学时,我可能会尝试类似的方法,但我想我会选择一些ascii值加密。我搜索了简单的加密,找到了Base64。我可以在加密时保留换行符吗?当然,Base64可以编码任何ascii字符。但这只是一种简单的编码,我不会称之为加密方法。当您想要将任意二进制数据编码为安全的可打印字符时,它非常有用。我想它可能适合您的需要,但使用我的
xorcrypt()
并不难。只需
将random
导入脚本并粘贴到my
xorcrypt()
randoms()
函数中,就可以了。:)当然我可以这么做,但我喜欢当我明白我在做什么的时候,有人知道我怎么能把它隐藏在exe aniway中吗???我刚刚想起我的游戏是开源的(facepalm),它在Windows中运行吗?正如o11c上面所说,操作系统可能不允许.exe修改其磁盘上的文件。