首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Python文件加密

Python文件加密
EN

Stack Overflow用户
提问于 2022-10-18 22:16:35
回答 1查看 66关注 0票数 0

我正在试图编写一个程序,该程序将使用文件内容上的.read()函数加密文件,该函数返回98\xf1\xc6}xb1\*.我试图通过循环遍历每个字符来加密文件,将其十进制数增加1(数字范围从0 -> 255)。然后将每个递增的数字添加到新的列表中。

新的列表如下所示:

['«', 'û', '$', '\x00', 'Ú']...

如何将此新列表转换为可以以二进制模式编写的格式?

代码语言:javascript
复制
class Encrypting():

    def __init__(self):
        self.file = "files/test_img.jpg" 


    def open_file(self):
        f = open(self.file, "rb")
        self.content = f.read()
        print(self.content)
        f.close()


    def convert_file_data(self):
        self.new_values = []
        for i in self.content:
            new_val = i + 1
            if i == 255:
                new_val = 0
            new_val = chr(new_val)
            self.new_values.append(new_val)


    def rewrite(self):          
        f = open("files/conv1.jpg", "wb")
        f.write(self.new_values)
        f.close()


def main():
    encrypt = Encrypting()
    encrypt.open_file()
    encrypt.convert_file_data()
    encrypt.rewrite()

if __name__ == "__main__":
     main()
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2022-10-18 23:25:17

你可以改变:

代码语言:javascript
复制
f.write(self.new_values) 

至:

代码语言:javascript
复制
f.write(''.join(self.new_values).encode('latin-1'))

list of str组合成一个str,然后将其编码为latin-1 (这是头256个Unicode序数到相同值的字节的1-1映射)。

但真正的解决办法是改变:

代码语言:javascript
复制
def convert_file_data(self):
    self.new_values = []
    for i in self.content:
        new_val = i + 1
        if i == 255:
            new_val = 0
        new_val = chr(new_val)
        self.new_values.append(new_val)

至:

代码语言:javascript
复制
def convert_file_data(self):
    self.new_values = bytearray()  # A mutable sequence of bytes, ints in range(256), so no type conversions needed
    for i in self.content:
        new_val = i + 1
        if i == 255:
            new_val = 0
        # chr conversion is unnecessary and counter-productive, so we just append the new byte
        self.new_values.append(new_val)

本部分:

代码语言:javascript
复制
        new_val = i + 1
        if i == 255:
            new_val = 0

可简化为:

代码语言:javascript
复制
        new_val = (i + 1) % 256

还可以将整个功能简化为:

代码语言:javascript
复制
def convert_file_data(self):
    self.new_values = bytearray()  # A mutable sequence of bytes, ints in range(256), so no type conversions needed
    for i in self.content:
        self.new_values.append((i + 1) % 256)

或者更短,一个简单的genexpr输入到bytes/bytearray构造函数:

代码语言:javascript
复制
def convert_file_data(self):
    self.new_values = bytes((i + 1) % 256 for i in self.content)

任何基于bytesbytearray的解决方案都优于存储list of str的以下内容:

  1. 它们需要的内存要少得多(可能缓存一个strs的长度,但是存储在list中的指向它们的指针需要4-8个字节,而对于CPU密集型的原始str,则只需要一个字节)(附加单个字节更便宜,并且在结束时不需要额外的代价来恢复joinencode数据,这在本地已经是正确的了)
票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/74118013

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档