维吉尼亚密码(Vigenere)
-
加密对象: 字母
-
原理:
-
该密码类似于凯撒密码,是一种多表密码。
-
秘钥是字母组成的字符串,长度是1到明文长度。
-
加密时,将秘钥补全成明文长度,例如明文是12,而输入的秘钥是linux, 所以补全后是linuxlinuxli。
-
查表:取第一个明文字符作为横标,取第一个秘钥(上一步构成的秘钥)字符作为纵标,查找对应字符,在去第二个明文字符作为横标,取第二个秘钥字符作为纵标,查找对应字符,…。最后将所有字符合在一起就构成了密文
坐标 A B C D E F G H I J K L M N O P Q R S T U V W X Y Z A A B C D E F G H I J K L M N O P Q R S T U V W X Y Z B B C D E F G H I J K L M N O P Q R S T U V W X Y Z A C C D E F G H I J K L M N O P Q R S T U V W X Y Z A B D D E F G H I J K L M N O P Q R S T U V W X Y Z A B C E E F G H I J K L M N O P Q R S T U V W X Y Z A B C D F F G H I J K L M N O P Q R S T U V W X Y Z A B C D E G G H I J K L M N O P Q R S T U V W X Y Z A B C D E F H H I J K L M N O P Q R S T U V W X Y Z A B C D E F G I I J K L M N O P Q R S T U V W X Y Z A B C D E F G H J J K L M N O P Q R S T U V W X Y Z A B C D E F G H I K K L M N O P Q R S T U V W X Y Z A B C D E F G H I J L L M N O P Q R S T U V W X Y Z A B C D E F G H I J K M M N O P Q R S T U V W X Y Z A B C D E F G H I J K L N N O P Q R S T U V W X Y Z A B C D E F G H I J K L M O O P Q R S T U V W X Y Z A B C D E F G H I J K L M N P P Q R S T U V W X Y Z A B C D E F G H I J K L M N O Q Q R S T U V W X Y Z A B C D E F G H I J K L M N O P R R S T U V W X Y Z A B C D E F G H I J K L M N O P Q S S T U V W X Y Z A B C D E F G H I J K L M N O P Q R T T U V W X Y Z A B C D E F G H I J K L M N O P Q R S U U V W X Y Z A B C D E F G H I J K L M N O P Q R S T V V W X Y Z A B C D E F G H I J K L M N O P Q R S T U W W X Y Z A B C D E F G H I J K L M N O P Q R S T U V X X Y Z A B C D E F G H I J K L M N O P Q R S T U V W Y Y Z A B C D E F G H I J K L M N O P Q R S T U V W X Z Z A B C D E F G H I J K L M N O P Q R S T U V W X Y
-
-
代码
# write by 2021/7/12 # 维吉尼亚密码 DIC = "abcdefghijklmnopqrstuvwxyz" def judge_key(key): if not key: return 0 for i in key: if i not in DIC: return 0 return 1 def encrypt_vigenere(string, key): if not judge_key(key): return -1 ciphertext = "" key_index = 0 key_len = len(key) for i in string: if i not in DIC: ciphertext += i else: ciphertext += DIC[(DIC.index(i)+DIC.index(key[key_index % key_len])) % 26] key_index += 1 return ciphertext def decrypt_vigenere(string, key): if not judge_key(key): return -1 plaintext = "" key_index = 0 key_len = len(key) for i in string: if i not in DIC: plaintext += i else: plaintext += DIC[(DIC.index(i)-DIC.index(key[key_index % key_len])) % 26] key_index += 1 return plaintext if __name__ == '__main__': key_ = "linux" ciphertext_ = encrypt_vigenere("i love you", key_) plaintext_ = decrypt_vigenere(ciphertext_, key_) print(f"{plaintext_}: {ciphertext_}")