以下代码是要写入的内容: 使用维吉尼亚密码对文档进行编码 解码文档并将其打印到控制台 允许编辑文档 重新编码文档。 它使用临时的第二个文件来存储解码的数据。数据使用 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()
有没有更好的方法来做到这一点?如果是的话,怎么办?
给定一个字母表和一个密钥,维吉尼亚密码类可以按如下方式实现。关于保存到文件等的其他问题与编码和解码过程无关,应该在单独的问题中提出。
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)