簡體   English   中英

如何從文件中解碼編碼為 base64 的行?

[英]How to decode lines encoded as base64 from file?

我需要解碼文件中的行。

到目前為止,這是我的代碼:

    def decode(self) -> list:
        """
        Decode file with key.

        For correct answer you have to convert file lines from base64 to utf-8.

        To decode one line you have to take a UNICODE value of a letter, subtract cipher step and take mod of 255.
        After that you have to convert that number back to a character.
        Example: key = 'test', decoded_data = "+%'"
        '+' -> (43 - 448) % 255 -> 'i' -> ... -> 'ice'

        :return: List of decoded lines
        """
        decoded_lines1 = []
        decoded_lines = []
        lines = self.read_code_from_file()
        for line in lines:
            decoded_lines.append(base64.b64decode(line).decode())
        for decoded_line in decoded_lines:
            for letter in decoded_line:
                decoded_lines1.append(chr((ord(letter) - sum([ord(i) for i in self.key])) % 255))
        return decoded_lines1

解碼行:

[')-.7)-\x06\x06AOO', '-57)-0\x06\x06JASJAOOASJ', ')07)2\x06\x06AJSAJAJOAJJAAO',...]

我的 output 由於某種原因所有的字母都是單獨的,下面 output 的一小部分在解碼我的 output 后等於 decoded_lines 的第一個列表元素:

['-', '1', '2', ';', '-', '1', '\n', '\n', 'E', 'S', 'S', ...]

預計 output:

['-12;-1\n\nESS', ...]

有什么辦法可以用逗號分隔行而不是用逗號分隔每個字母? 非硬編碼密鑰等於 1016。

問題是你 append 每個字符,一個一個地解碼到decoded_lines1當你做

.append(chr((ord(letter) - sum([ord(i) for i in self.key])) % 255))

相反,您想對decoded_line中的每個字符執行此操作,從所有解碼字符中創建一個字符串然后將該字符串append 到decoded_lines1

for decoded_line in decoded_lines:
    new_line = []
    for letter in decoded_line:
       new_line.append(chr((ord(letter) - sum([ord(i) for i in self.key])) % 255))
    decoded_lines1.append("".join(new_line))

但是您可以通過組合for line in linesfor decoded_line in decoded_lines循環來進一步簡化代碼:

def decode(self):
    decoded_lines = []
    lines = self.read_code_from_file()
    for line in lines:
        decoded_line = base64.b64decode(line).decode()
        new_line = []
        for letter in decoded_line:
            new_line.append(chr((ord(letter) - sum([ord(i) for i in self.key])) % 255))
        decoded_lines.append("".join(new_line))
    return decoded_lines

問題出在下面的代碼中:

for decoded_line in decoded_lines:
    for letter in decoded_line:
        decoded_lines1.append(chr((ord(letter) - sum([ord(i) for i in self.key])) % 255))

在這里,您在將 append 解碼行添加到列表中時逐個字母地附加到列表中。

所以,我將解碼后的字母存儲到一個字符串中,然后將 append 存儲到列表中。

for decoded_line in decoded_lines:
            temp=""
            for letter in decoded_line:
                temp=temp+chr((ord(letter) - sum([ord(i) for i in self.key])) % 255)
            decoded_lines1.append(temp)

最終代碼將如下所示:

def decode(self) -> list:
        """
        Decode file with key.

        For correct answer you have to convert file lines from base64 to utf-8.

        To decode one line you have to take a UNICODE value of a letter, subtract cipher step and take mod of 255.
        After that you have to convert that number back to a character.
        Example: key = 'test', decoded_data = "+%'"
        '+' -> (43 - 448) % 255 -> 'i' -> ... -> 'ice'

        :return: List of decoded lines
        """
        decoded_lines1 = []
        decoded_lines = []            
        lines = self.read_code_from_file()
        for line in lines:
            decoded_lines.append(base64.b64decode(line).decode())
        for decoded_line in decoded_lines:
            temp=""
            for letter in decoded_line:
                temp=temp+chr((ord(letter) - sum([ord(i) for i in self.key])) % 255)
            decoded_lines1.append(temp)                
        return decoded_lines1

你一行中只有一個詞嗎? 它是一個句子嗎? 它由多個單詞組成,那么你的第二個循環應該在單詞上,然后第三個循環應該在字母上。 代碼應該是這樣的

def decode(self) -> list:
        """
        Decode file with key.

        For correct answer you have to convert file lines from base64 to utf-8.

        To decode one line you have to take a UNICODE value of a letter, subtract cipher step and take mod of 255.
        After that you have to convert that number back to a character.
        Example: key = 'test', decoded_data = "+%'"
        '+' -> (43 - 448) % 255 -> 'i' -> ... -> 'ice'

        :return: List of decoded lines
        """
        decoded_lines1 = []
        decoded_lines = []
        lines = self.read_code_from_file()
        for line in lines:
            decoded_lines.append(base64.b64decode(line).decode())
        for decoded_line in decoded_lines:
            for word in decoded_line.split():
                docoded_word=''
                for letter in word:
                    docoded_word+=(chr((ord(letter) - sum([ord(i) for i in self.key])) % 255))
                decoded_lines1.append(docoded_word)
        return (decoded_lines1)

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM