异或加密在大多数情况下都有效

2024-09-28 05:23:15 发布

您现在位置:Python中文网/ 问答频道 /正文

我的任务是对Java应用程序进行密码保护,而不必担心真正的安全性。因此,将用户名/密码对存储在文本文件中,然后对其进行加密似乎是明智之举。对于加密来说,使用XOR密码似乎是合适的,因为它们既简单又快速(记住——它只是要阻止临时用户,而不是防弹的)。在

我编写了所有合适的Java,然后意识到我需要一种加密配置文件的方法。我编写了一个附加的方法,但是使用不止一次或两次是很笨拙的(而且似乎只对一些输入有效),所以我决定最好用Python编写一些东西,在REPL中使用。在

我最后得出的结论是:

from itertools import izip, cycle

KEY = "stackoverflow"

def encrypt(text):
    return ''.join(chr(ord(x) ^ ord(y)) for (x,y) in izip(text,cycle(KEY)))

def decrypt(text):
    return encrypt(text)

def export(users, file):
    with open(file, "w") as f:
        for user, password in users.items():
            f.write(encrypt('"%s" "%s"'%(user, password)) + "\n")

def import_data(file):
    with open(file) as f:
        return [decrypt(i) for i in f.readlines()]

表面上,它起作用:

^{pr2}$

但后来事情开始分崩离析:

>>> export({"foo" : "bar", "baz" : "quux", "spam" : "eggs"}, "users.dat")
>>> import_data("users.dat")
['"foo" "bar"e', '"baz" "quux"}', '"spam" "eggs"y']

维姆是这么读的-

Vim rendition

然后:

>>> export({"what" : "not", "this" : "that", "admin_istrator" : "quux"}, "users2.dat")
>>> import_data("users2.dat")
['"thi', "k97$ma{~'l", '"what" "not"}', '"admin_istrator" "quux', '7~']

维姆:

Vim rendition of the second set

我突然想到,我可能有一个问题,一个字符的加密形式是一个新行,但据我所见,这并不能解释第一个例子中的古怪行为,也不能解释第二个例子中的古怪行为。在

关于新行,我的计划B是加密整个文件——新行和全部——然后将其删除,解密,在“\n”上拆分,然后继续基于行的解析。在

提前谢谢。在


更新:这是我对B计划的实施(两段前描述过)。在

def import2(file):
    with open(file) as f:
        return decrypt(f.read())

然后:

>>> export({"foo" : "bar", "this" : "that", "admin_istrator" : "letmein"}, "users2.dat")
>>> import2("users2.dat")
'"this" "that"y%smg&91uux!}"admin_istrator" "letmein"y'

更新二:二进制。在

[代码与上面相同,只是所有open都是open(file, "rb")或{}。]

>>> export({"foo" : "bar", "this" : "that", "admin_istrator" : "letmein"}, "users2.dat")
>>> import2("users2.dat")
'"this" "that"y%smg&91uux!}"admin_istrator" "letmein"y'
>>> import_data("users2.dat")
['"t', "k97$ma{~'", '"foo" "bar"', '"admin_istrator" "letmein"']

最后更新:64基地,其他恶作剧。在

def import2(file):
    with open(file, "rb") as f:
        return filter(str.strip, [decrypt(i) for i in f.readlines()])

其中encryptdecryptencode在/decode基64中。在


Tags: importreturnthatfooadmindefbarexport
3条回答

您试图在文本模式文件中存储二进制文件。使用open(file, "wb")进行写入,使用open(file, "rb")进行读取,以二进制模式打开文件并修复问题。在

在文本模式下,每个"\r""\n""\r\n"序列被视为新行,因此它们被转换为本地操作系统行结束约定("\r\n"对于Windows,"\n"对于Unix,"\r"对于旧Mac)。如果您从文本文件中读取它们,您将始终得到"\n",如果您编写它们,我不记得实际的行为,但您肯定也会得到混乱而不是您的数据:)

使用XOR加密,很可能会遇到这种情况:)

如果您被迫使用二进制文件,请尝试base64编码(例如"some\0te\n\nxt with bi\x01naries".encode('base64'))。要解码,请使用.decode(谢谢,显然是船长!)。在

你在读取数据的过程中,不只是读取了数据的加密问题

  def import_data(file):
    with open(file) as f:
       return [decrypt(i.rstrip()) for i in f.readlines()]

您可以通过加密新行而不在行之间重置密钥来修复它

from itertools import izip, cycle

KEY = "stackoverflow"

def encrypt(text):
    return ''.join(chr(ord(x) ^ ord(y)) for (x,y) in izip(text,key))

def decrypt(text):
    return encrypt(text)

def export(users, file):
    with open(file, "w") as f:
        for user, password in users.items():
            f.write(encrypt('"%s" "%s"\n'%(user, password)))

def import_data(file):
    with open(file) as f:
        return [decrypt(i) for i in f]


key = cycle(KEY)
export({"foo" : "bar", "baz" : "quux", "spam" : "eggs"}, "users.dat")

key = cycle(KEY)
for row in import_data("users.dat"):
    print row

这应该转换成一个类,key将是一个实例变量,而不是像这里这样的全局变量

相关问题 更多 >

    热门问题