我正在嘗試撰寫 vigenere cypher,所以我需要有兩個長度相同的串列。我認為我的解決方案一切都會好起來的,但是盡管滿足條件,但 while 回圈卻沒有。因此,我得到了兩個字母數不同的串列。為什么會這樣,以及如何改進。我是從書本上學習的新程式員,所以我從未見過 while 回圈不能正常作業。我的代碼:
plaintext = "This is secret message"
plaintext = plaintext.upper()
key = "secret"
key = key.upper()
def encrypt_vigenere2( key, plaintext ):
a = []
b= []
i = 0
for letter in (plaintext):
if letter != " ":
a.append(letter)
while i<len(a):
for element in key:
if element != " ":
b.append(element)
i =1
return a,b
print(encrypt_vigenere2(key,plaintext))
uj5u.com熱心網友回復:
while 回圈按預期執行,現在您加入密鑰,直到達到a,
b: ['S','E','C','R','E','T','S','E','C','R','E','T','S','E','C','R','E','T','S','E','C','R','E','T']
這對下一部分很有用:加密
def encrypt_vigenere2(key, plaintext):
...
result = ""
for l, k in zip(a, b):
result = chr(((ord(l) - 65 ord(k) - 65) % 26) 65)
return result
您可以只使用replace(" ", "")洗掉空格,并重復鍵,使用itertools.cycle
from itertools import cycle
def encrypt_vigenere2(key, plaintext):
result = ""
for l, k in zip(plaintext.replace(" ", ""), cycle(key)):
result = chr(((ord(l) - 65 ord(k) - 65) % 26) 65)
return result
uj5u.com熱心網友回復:
我不確定我是否正確理解您的代碼,但對我來說似乎您沒有嘗試加密某些東西。看起來您試圖獲取密鑰流,如果我錯了,請糾正我。但這里是如何獲取密鑰流的代碼:
def encrypt_vigenere3(key, plaintext):
# variables
a = [letter for letter in plaintext.upper() if letter != " "]
b = [element for element in key.upper() if element != " "]
keystream = []
# creating the keystream
i = 0
current_num = 0
while i <= len(a):
if current_num == len(key):
current_num = 0
keystream.append(b[current_num])
current_num = 1
i = 1
return keystream
我通過“串列理解”創建了變數。你應該去查一下這個詞,它讓你的代碼更干凈。不要擔心一開始很難,但是一旦你理解了它,它真的很容易和有用:)
uj5u.com熱心網友回復:
vigenere 加密程式的想法對我來說聽起來不錯,所以我做了一些編碼,這是我的結果:
def encrypt_vigenere(plaintext, key):
letter_matrix = [[chr(65 i) for i in range(26)] for j in range(26)]
for index, column in enumerate(letter_matrix):
for i in range(index):
letter_matrix[index].append(column[0])
del letter_matrix[index][0]
plaintext = plaintext.upper()
key = key.upper()
keystream = ""
ciphertext = ""
current_letter = 0
for letter in plaintext:
if current_letter == len(key):
current_letter = 0
keystream = key[current_letter]
current_letter = 1
for letter_plaintext, letter_keystream in zip(plaintext.replace(" ", ""), keystream):
ciphertext = letter_matrix[ord(letter_plaintext)-65][ord(letter_keystream)-65]
return ciphertext
您說您是編碼新手,所以以下是您現在可能不熟悉的內容:
- 如前所述,串列理解
- chr() -> 取一個數字并將其分配給對應的 ascii 值
- ord() -> 與 chr() 相反。取字母并將其轉換為 ascii 數字
- zip() -> 同時遍歷兩個串列
我希望你學到了一些新東西:)
轉載請註明出處,本文鏈接:https://www.uj5u.com/qiye/359193.html
標籤:Python 功能 for循环 if 语句 while 循环
上一篇:如何在WPF中停止后臺作業人員?
