Untitled

 avatar
unknown
python
3 months ago
2.6 kB
8
Indexable
class EncryptTran:
    def __init__(self, plaintext, keyword):
        # self.plaintext = plaintext.replace(" ", "#")
        self.plaintext = plaintext
        self.keyword = keyword
        self.columns = len(keyword)

    def _get_column_order(self):
        """ Returns the order in which to read columns based on sorted keyword positions. """
        return sorted(range(len(self.keyword)), key=lambda k: self.keyword[k])

    def encrypt(self):
        """ Encrypts the plaintext using columnar transposition. """

        # We create the grid
        # for using the 
        # transposition method
        grid = [self.plaintext[i : i + self.columns] for i in range(0, len(self.plaintext), self.columns)]
        
        last_row_length = len(grid[-1])

        # We add placeholder cipher
        # if last row isn't completed
        if last_row_length < self.columns:
            grid[-1] += "_" * (self.columns - last_row_length)
        
        
        # Get the column order based
        # on the keyword
        col_order = self._get_column_order()

        # Then we construct the ciphertext
        # by reading the columns in the specific
        # order.
        ciphertext = "".join("".join(row[i] for row in grid) for i in col_order)

        self.plaintext = ciphertext

    def decrypt(self):
        """ Decrypts the message using columnar transposition. """

        # Calc number of rows.
        num_rows = -(-len(self.plaintext) // self.columns)
        # Calc number of whole rows.
        num_full_cols = len(self.plaintext) % self.columns
        
        # Construct an empty grid for the decryption
        grid = [list("_" * self.columns) for _ in range(num_rows)]
        
        # Again we fetch the column order
        col_order = self._get_column_order()
        index = 0
        
        # Then we insert all the
        # elements based on the 
        # columnar order
        for i in col_order:
            for row in range(num_rows):

                # We need to manually construct the last row
                if row == num_rows - 1 and i >= num_full_cols and num_full_cols != 0:
                    continue
                grid[row][i] = self.plaintext[index]
                index += 1
        
        # We join the newly plaintext, replace the padding.
        # Then set self.plaintext
        self.plaintext = "".join("".join(row) for row in grid).rstrip("_")

    def show_message(self):

        # Simply return plaintext for writing to file
        # and read file method in app.run()
        return self.plaintext
Editor is loading...
Leave a Comment