如何在Python中有效地读取给定算法和密钥的编码文件?

问题描述 投票:0回答:1

以下代码是要写入的内容: 使用维吉尼亚密码对文档进行编码 解码文档并将其打印到控制台 允许编辑文档 重新编码文档。 它使用临时的第二个文件来存储解码的数据。数据使用 vigenere 密码进行编码,其密钥以 vg: key 的格式记录在keys.txt中

keys = open("keys.txt")
for i in keys:
    if "vg:" in i:
        vgKey = i.lstrip("vg: ")
        vgKey = vgKey.strip()
keys.close()

def encrypt(phrase,key=vgKey):
    alphabet = list("abcdefghijklmnopqrstuvwxyz")
    cypher = []
    phrase = phrase.lower()
    keyCount = 0
    for i in phrase:
        if i in alphabet:
            alphPos = alphabet.index(i)
            if keyCount > len(key)-1:
                keyCount -= len(key)
            alphPos += alphabet.index(key[keyCount])
            if alphPos > 25:
                alphPos -= 26
            cypher.append(alphabet[alphPos])
            keyCount += 1
        else:
            cypher.append(i)
    return "".join(cypher)

def decrypt(cypher,key=vgKey):
    alphabet = list("abcdefghijklmnopqrstuvwxyz")
    phrase = []
    cypher = cypher.lower()
    keyCount = 0
    for i in cypher:
        if i in alphabet:
            alphPos = alphabet.index(i)
            if keyCount > len(key)-1:
                keyCount -= len(key)
            alphPos -= alphabet.index(key[keyCount])
            if alphPos < 0:
                alphPos += 26
            phrase.append(alphabet[alphPos])
            keyCount += 1
        else:
            phrase.append(i)
    return "".join(phrase)

db = open("DBI.csv","w")
dbEncrypted = open("DBIEncrypted.csv")
for i in dbEncrypted:
    db.write(decrypt(i))
db.close()
dbEncrypted.close()
db = open("DBI.csv")
dbCont = db.readlines()
print("".join(dbCont))
row = input("Which row would you like to edit? Type n for a new row.\n")
if row != "":
    text = input("What would you like the new value to be?\n")
    if row != "n":
        dbCont[int(row)] = text+"\n"
    elif row == "n":
        dbCont[len(dbCont)-1] += "\n"
        dbCont.append(text)
db.close()
dbEncrypted = open("DBIEncrypted.csv","w")
for i in dbCont:
    dbEncrypted.write(encrypt(i))
dbEncrypted.close()

有没有更好的方法来做到这一点?如果是的话,怎么办?

python vigenere
1个回答
0
投票

给定一个字母表和一个密钥,维吉尼亚密码类可以按如下方式实现。关于保存到文件等的其他问题与编码和解码过程无关,应该在单独的问题中提出。

import operator
from dataclasses import dataclass, field
from typing import Callable
import itertools
  
@dataclass
class VigenereCipher:
    key: str
    alphabet: str
    n: int = field(init=False, repr=False, compare=False)

    def __post_init__(self) -> None:
        self.n = len(self.alphabet)

    def encode(self, text: str) -> str:
        return self._xcode(text, operator.add)

    def decode(self, text: str) -> str:
        return self._xcode(text, operator.sub)

    def _xcode(self, text: str, op: Callable[[int, int], int]) -> str:
        s: list[str] = []
        for a, b in zip(text, itertools.cycle(self.key)):
            if a not in self.alphabet:
                s.append(a)
            else:
                i = self.alphabet.index(a)
                j = self.alphabet.index(b)
                c = self.alphabet[op(i, j) % self.n]
                s.append(c)
        return "".join(s)
© www.soinside.com 2019 - 2024. All rights reserved.