使用另一个函数已经生成的密钥和 vigenere 密码加密字符串
Encrypting a string using a key and vigenere cipher already generated by another function
我一直无法弄清楚如何在我的程序中编写和实现一些功能。调用 get_col_index 和 get_row_index 方法的加密方法,以及 get_col_index 和 get_row_index 方法。 encrypt方法由main方法调用,传递message、key、vignere_square。 Vignere Matrix 密码已经在一个单独的函数中生成。 encrypt 方法然后调用 get_col_index 和 get_row_index 方法来加密消息,跳过所有非字母的内容。
我的问题的很大一部分是弄清楚如何使用 get_row_index 和 get_col_index 方法对消息进行编码。对于 get_col_index,我们通过消息和 vigenere 方块,它 returns 是消息中每个字母的列索引。对于 get_row_index,我们通过键和 vigenere 方块,它 returns 键的每个字母的行索引。我一直在尝试对这些函数使用 for 循环,我通常会取回消息(未加密)、随机字母列表或错误。这是我最近的尝试,我尝试在加密方法中使用追加,但它只是将消息和密钥添加到列表中。
def main():
vig_square = create_vig_square()
message = input("Enter a multi-word message with punctuation: ")
input_key = input("Enter a single word key with no punctuation: ")
msg = message.lower()
key = input_key.lower()
print("The encoded message is: ",encrypt(msg, key, vig_square))
print("The decoded message is: ")
def encrypt(msg, key, vig_square):
msg_char = msg
key_char = key
coded_msg = list()
coded_msg.append(get_col_index(msg_char, vig_square))
coded_msg.append(get_row_index(key_char, vig_square))
return coded_msg
def get_col_index(msg_char, vig_square):
column_index = ""
for i in range(len(vig_square)):
column_index = msg_char
i += 1
return column_index
def get_row_index(key_char, vig_square):
row_index = ""
for i in range(len(vig_square)):
row_index = key_char
i += 1
return row_index
def create_vig_square():
vig_square = list()
for row in range(26):
next_row = list()
chr_code = ord('a') + row
for col in range(26):
letter = chr(chr_code)
next_row.append(letter)
chr_code = chr_code + 1
if chr_code > 122:
chr_code = ord('a')
vig_square.append(next_row)
return vig_square
main()
我希望输出是这样的:
The eagle has landed.
Enter a single word key with no punctuation:
LINKED
The encoded message is:
epr oejwm ukw olvqoh.
The decoded message is:
the eagle has landed.
vignere 密码有一些很好的特性,因为 vignere 平方在水平和垂直方向上都是循环的,这意味着查找可以这样完成:
# assume col and row are lowercase letters
def vignere_lookup(col, row):
base = ord('a')
index = ((ord(col) - base) + (ord(row) - base)) % 26
return chr(base + index)
这会将字母 a-z 分配给数字 0-25,添加列和行字母,并使用模运算以防值高于 'z'(25)
这意味着可以通过以下方式进行加密:
def encrypt(message, key):
ciphertext = ''
key_index = 0
# convert to lower case
for letter in message.lower():
# only encrypt the letters a-z, for space, punctuation, numbers, just add the raw letter
if ord(letter) in range(ord('a'), ord('z') + 1):
# make sure to lowercase the key as well
ciphertext += vignere_lookup(letter, key[key_index % len(key)].lower())
key_index += 1
else:
ciphertext += letter
return ciphertext
类似地,解密查找可以使用减法来完成,利用 python 中的事实,如我们希望的那样在负数循环上使用模。这给出解密为:
def vignere_reverse(col, target):
base = ord('a')
# notice the subtraction instead of addition
index = ((ord(col) - base) - (ord(target) - base)) % 26
return chr(base + index)
def decrypt(cipher, key):
message = ''
key_index = 0
for letter in cipher.lower():
if ord(letter) in range(ord('a'), ord('z') + 1):
message += vignere_reverse(letter, key[key_index % len(key)].lower())
key_index += 1
else:
message += letter
return message
将所有这些放在一起,您可以做到:
cipher = encrypt("The eagle has landed.", "LINKED")
print(cipher) # prints "epr oejwm ukw olvqoh."
decrypted = decrypt(cipher, "LINKED")
print(decrypted) # prints "the eagle has landed."
我一直无法弄清楚如何在我的程序中编写和实现一些功能。调用 get_col_index 和 get_row_index 方法的加密方法,以及 get_col_index 和 get_row_index 方法。 encrypt方法由main方法调用,传递message、key、vignere_square。 Vignere Matrix 密码已经在一个单独的函数中生成。 encrypt 方法然后调用 get_col_index 和 get_row_index 方法来加密消息,跳过所有非字母的内容。
我的问题的很大一部分是弄清楚如何使用 get_row_index 和 get_col_index 方法对消息进行编码。对于 get_col_index,我们通过消息和 vigenere 方块,它 returns 是消息中每个字母的列索引。对于 get_row_index,我们通过键和 vigenere 方块,它 returns 键的每个字母的行索引。我一直在尝试对这些函数使用 for 循环,我通常会取回消息(未加密)、随机字母列表或错误。这是我最近的尝试,我尝试在加密方法中使用追加,但它只是将消息和密钥添加到列表中。
def main():
vig_square = create_vig_square()
message = input("Enter a multi-word message with punctuation: ")
input_key = input("Enter a single word key with no punctuation: ")
msg = message.lower()
key = input_key.lower()
print("The encoded message is: ",encrypt(msg, key, vig_square))
print("The decoded message is: ")
def encrypt(msg, key, vig_square):
msg_char = msg
key_char = key
coded_msg = list()
coded_msg.append(get_col_index(msg_char, vig_square))
coded_msg.append(get_row_index(key_char, vig_square))
return coded_msg
def get_col_index(msg_char, vig_square):
column_index = ""
for i in range(len(vig_square)):
column_index = msg_char
i += 1
return column_index
def get_row_index(key_char, vig_square):
row_index = ""
for i in range(len(vig_square)):
row_index = key_char
i += 1
return row_index
def create_vig_square():
vig_square = list()
for row in range(26):
next_row = list()
chr_code = ord('a') + row
for col in range(26):
letter = chr(chr_code)
next_row.append(letter)
chr_code = chr_code + 1
if chr_code > 122:
chr_code = ord('a')
vig_square.append(next_row)
return vig_square
main()
我希望输出是这样的:
The eagle has landed.
Enter a single word key with no punctuation:
LINKED
The encoded message is:
epr oejwm ukw olvqoh.
The decoded message is:
the eagle has landed.
vignere 密码有一些很好的特性,因为 vignere 平方在水平和垂直方向上都是循环的,这意味着查找可以这样完成:
# assume col and row are lowercase letters
def vignere_lookup(col, row):
base = ord('a')
index = ((ord(col) - base) + (ord(row) - base)) % 26
return chr(base + index)
这会将字母 a-z 分配给数字 0-25,添加列和行字母,并使用模运算以防值高于 'z'(25)
这意味着可以通过以下方式进行加密:
def encrypt(message, key):
ciphertext = ''
key_index = 0
# convert to lower case
for letter in message.lower():
# only encrypt the letters a-z, for space, punctuation, numbers, just add the raw letter
if ord(letter) in range(ord('a'), ord('z') + 1):
# make sure to lowercase the key as well
ciphertext += vignere_lookup(letter, key[key_index % len(key)].lower())
key_index += 1
else:
ciphertext += letter
return ciphertext
类似地,解密查找可以使用减法来完成,利用 python 中的事实,如我们希望的那样在负数循环上使用模。这给出解密为:
def vignere_reverse(col, target):
base = ord('a')
# notice the subtraction instead of addition
index = ((ord(col) - base) - (ord(target) - base)) % 26
return chr(base + index)
def decrypt(cipher, key):
message = ''
key_index = 0
for letter in cipher.lower():
if ord(letter) in range(ord('a'), ord('z') + 1):
message += vignere_reverse(letter, key[key_index % len(key)].lower())
key_index += 1
else:
message += letter
return message
将所有这些放在一起,您可以做到:
cipher = encrypt("The eagle has landed.", "LINKED")
print(cipher) # prints "epr oejwm ukw olvqoh."
decrypted = decrypt(cipher, "LINKED")
print(decrypted) # prints "the eagle has landed."