QOJ.ac

QOJ

Time Limit: 10.0 s Memory Limit: 256 MB Total points: 100

#15981. 维吉尼亚密码加密

Statistics

维吉尼亚密码(Vigenère Cipher)是最古老且最常用的加密算法之一。它非常古老——类似的加密方法最早由 Giovan Battista Bellaso 于 1553 年描述,并于 1586 年由 Blaise de Vigenère 进行了改进。

维吉尼亚加密为明文的每个字母产生一个密文字母,将一个明文字母与对应位置上的一个密钥字母相结合。如果密钥比明文短,则根据需要简单地重复使用。例如,对于长度为 3 的密钥和长度为 7 的明文,字母将按如下方式结合($K_i$ 是密钥字母,$P_i$ 是明文字母,$C_i$ 是得到的密文字母):

$K_1$ $K_2$ $K_3$ $K_1$ $K_2$ $K_3$ $K_1$
$P_1$ $P_2$ $P_3$ $P_4$ $P_5$ $P_6$ $P_7$
$C_1$ $C_2$ $C_3$ $C_4$ $C_5$ $C_6$ $C_7$

密钥的字母指定了明文字母在字母表中应该“向前移动”多少个位置。如果密钥字母是 A,则对应的明文字母将移动一个字符;B 意味着移动两个位置,依此类推。字母表被认为是循环的,因此如果最后一个字母(Z)需要移动,它会再次变成 A。请注意,A(密钥)与另一个 A(明文)结合将得到 B,这对于普通的维吉尼亚密码来说可能有点不同寻常。本题面末尾的维吉尼亚方格给出了明文字母如何与密钥字母结合以产生密文的概览。

你的任务是编写一个程序,使用给定的密钥通过维吉尼亚密码对消息进行加密。

输入格式

输入包含多个实例。每个实例由两行组成,第一行是加密密钥,第二行是明文。密钥和明文都由英文大写字母 $\{A, B, C, \dots, Z\}$ 组成。密钥的长度在 $1$ 到 $1000$ 之间,明文的长度在 $1$ 到 $100\,000$ 之间(均包含端点)。

输入以包含单个零(0)的一行结束。

输出格式

对于每个输入实例,输出密文——即加密后的消息版本。

样例

输入样例 1

ICPC
THISISSECRETMESSAGE
ACM
CENTRALEUROPEPROGRAMMINGCONTEST
LONGKEY
CERC
0

输出样例 1

CKYVRVIHLUUWVHIVJJU
DHAUUNMHHSRCFSEPJEBPZJQTDRAUHFU
OTFJ

说明

维吉尼亚方格(Vigenère square): 将给定的明文字母(列)和密钥字母(行)映射到所得的密文字母。

  | 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 | 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
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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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

Discussions

About Discussions

The discussion section is only for posting: General Discussions (problem-solving strategies, alternative approaches), and Off-topic conversations.

This is NOT for reporting issues! If you want to report bugs or errors, please use the Issues section below.

Open Discussions 0
No discussions in this category.

Issues

About Issues

If you find any issues with the problem (statement, scoring, time/memory limits, test cases, etc.), you may submit an issue here. A problem moderator will review your issue.

Guidelines:

  1. This is not a place to publish discussions, editorials, or requests to debug your code. Issues are only visible to you and problem moderators.
  2. Do not submit duplicated issues.
  3. Issues must be filed in English or Chinese only.
Active Issues 0
No issues in this category.
Closed/Resolved Issues 0
No issues in this category.