这就是我要做的事情:
在Python中编写一个脚本,该脚本是用于英文文本的Vigenere密码版本的实现。您的脚本应区分小写和大写字母(即,加密密钥和明文允许由小写和大写字母组成,但密文应为大写)。除了字母之外,纯文本中还有四个其他字符:逗号(26),点(27),短划线(28),下划线(29),将加密函数更改为模块30。
您的脚本应从标准输入读取并写入标准输出。它应该提示用户输入大小为k的加密密钥。密钥不允许像标准Vigenere密码那样重复。相反,我们将遵循基于分组密码的想法。基本上,明文和密文将具有大小为k的块,其与密钥大小相同。如果密钥长度短于明文,则将前一个块的块大小k的密文连接到密钥。以下是关键字为“Carbondale”且k = 10的示例:
Plaintext : SIU_CS-Department_is_the_best Key : CarbondaleUIHAQBBDPTUZ,MUOUCX Ciphertext: UIHAQBBDPTUZ,MUOUCXHTODQTPYUM
所以,我想知道如何处理额外字符的部分“,”“。” “/”“_”。这是进行加密的功能:
a = len(key)
b = len(text)
while (len(key1) <= len(text1)):
for i in range(0,a):
num1 = ord(text1[i+var])%97
num2 = ord(key1[i+var])%97
num3 = num1+num2
if (num3 > 25):
encr.append(num3%25)
else:
encr.append(num3)
i + 1
for i in range(0,a):
encr1.append(chr(encr[i+var]+97))
i + 1
for i in range(0,a):
key1.append(encr1[i+var])
i + 1
var = var + a
答案 0 :(得分:0)
您的代码目前存在以下问题(我假设var = 0
,encr = []
,encr1 = []
,key1 = list(key)
和text1 = list(text)
发生在您拥有的代码之前贴):
while
循环将永远不会启动,否则永远不会结束,因为您永远不会缩短text1
(这样做会破坏您的索引); for
循环中手动增加计数器(如果您愿意,i + 1
如果没有有效的分配,则需要i += 1
); %
)时,您无需检查是否num3 < 25
;和"/" != "-"
)不同。 而不是使用ord
和chr
,我会建立自己的字母表来循环,例如。
from string import ascii_uppercase
alphabet = list(ascii_uppercase) + [",", ".", "-", "_"]
您可能会发现“标准”Vigenère的这种实现很有帮助:
from itertools import cycle
def vigenere(plain, key, alphabet):
for p, k in zip(plain, cycle(key)):
index = alphabet.index(p) + alphabet.index(k)
yield alphabet[index % len(alphabet)]
以下是修改后的实现的一些伪代码:
convert all text (plain, key) to upper case
create a list to hold output
split plain into blocks of length len(key)
for each block in plain:
if it's the first block, use key to encode
otherwise, use the last block of encoded text in output