1.密码学课代码实现
英文加密
def my_encode_2_english(plaintext,key):
n = len(key)
encode_string = ''
move_numbers = [ord(e)-97 for e in key]
t = -1
for chr_ in plaintext:
t += 1
string_to_asscii = ord(chr_)
move_index =t%n
move_number = move_numbers[move_index]
move = string_to_asscii + move_number
if move > 122:
move = 97+(move-123)
encode_string += chr(move)
return encode_string
def my_decode_2_english(clipher,key):
n = len(key)
decode_string = ''
move_numbers = [ord(e)-97 for e in key]
t = -1
for chr_ in clipher:
t += 1
string_to_asscii = ord(chr_)
move_index =t%n
move_number = move_numbers[move_index]
move = string_to_asscii - move_number
if move < 97:
move = 123 -(97 - (string_to_asscii-move_number) )
print(move ,string_to_asscii,move_number)
decode_string += chr(move)
return decode_string
key = 'yes'
string = """hello"""
encoding2 = my_encode_2_english(string,key)
decoding2 = my_decode_2_english(encoding2,key)
encoding2,decoding2
中文加密
def my_encode_2(plaintext,key):
n = len(key)
encode_string = ''
move_numbers = [ord(e) for e in key]
t = -1
for chr_ in plaintext:
t += 1
string_to_asscii = ord(chr_)
move_index =t%n
move_number = move_numbers[move_index]
move = string_to_asscii + move_number
encode_string += chr(move)
return encode_string
def my_decode_2(clipher,key):
n = len(key)
decode_string = ''
move_numbers = [ord(e) for e in key]
t = -1
for chr_ in clipher:
t += 1
string_to_asscii = ord(chr_)
move_index =t%n
move_number = move_numbers[move_index]
move = string_to_asscii - move_number
decode_string += chr(move)
return decode_string
key = 'yes'
string = """english"""
encoding2 = my_encode_2(string,key)
decoding2 = my_decode_2(encoding2,key)
encoding2,decoding2
查表实现
import numpy as np
import pandas as pd
pd.set_option('display.max_rows', None)
pd.set_option('display.max_columns', None)
pd.set_option('display.width', None)
pd.set_option('display.max_colwidth', None)
start_number = 97
end_number = 122
letter_lenght = end_number-start_number+1
Vigenère_table = {}
for i in range(letter_lenght):
letter = chr(i+97)
ciphers = []
for j in range(letter_lenght):
cipher = 97+j+i
if cipher > 122:
cipher = cipher-123+97
ciphers.append(chr(cipher))
Vigenère_table.update({letter:ciphers})
Vigenère_table = pd.DataFrame(Vigenère_table)
Vigenère_table = Vigenère_table.T
print(f"维吉尼亚密码表:\n{Vigenère_table}")
Vigenère_table_numpy = Vigenère_table.to_numpy()
def my_encode_2_english_1(plaintext,key,Vigenère_table):
n=len(key)
encode_string = ''
move_numbers = [ord(e)-97 for e in key]
t = -1
for chr_ in plaintext.lower():
t += 1
asscii_index = ord(chr_)-97
move_index = t%n
move_number = move_numbers[move_index]
cipher_letter = Vigenère_table[asscii_index][move_number]
print(chr_,asscii_index,move_number)
encode_string += cipher_letter
return encode_string
def my_decode_2_english_1(clipher,key,Vigenère_table):
n=len(key)
encode_string = ''
move_numbers = [ord(e)-97 for e in key]
t = -1
for chr_ in clipher:
t += 1
move_index =t%n
move_number = move_numbers[move_index]
column = Vigenère_table[:,move_number:move_number+1]
letter_index = np.where(column==chr_)[0][0]
letter_asscii = 97+letter_index
encode_string += chr(letter_asscii)
return encode_string
key = 'yes'
string = """Hello"""
encoding2_1 = my_encode_2_english_1(string,key,Vigenère_table=Vigenère_table_numpy)
decoding2_1 = my_decode_2_english_1(encoding2_1,key,Vigenère_table=Vigenère_table_numpy)
encoding2_1,decoding2_1