#P690. 【NOIP2012-S2】Vigenère 密码

    ID: 1108 传统题 1000ms 256MiB 尝试: 0 已通过: 0 难度: 2 上传者: 标签>字符串模拟NOIP2012提高组密码学加密解密

【NOIP2012-S2】Vigenère 密码

题目描述

16 世纪法国外交家 Blaise de Vigenère 设计了一种多表密码加密算法——Vigenère 密码。Vigenère 密码的加密解密算法简单易用,且破译难度比较高,曾在美国南北战争中为南军所广泛使用。

在密码学中,我们称需要加密的信息为明文,用 MM 表示;称加密后的信息为密文,用 CC 表示;而密钥是一种参数,是将明文转换为密文或将密文转换为明文的算法中输入的数据,记为 kk。在 Vigenère 密码中,密钥 kk 是一个字母串,k=k1k2knk = k_1 k_2 \dots k_n。当明文 M=m1m2mnM = m_1 m_2 \dots m_n 时,得到的密文 C=c1c2cnC = c_1 c_2 \dots c_n,其中 ci=mikic_i = m_i \otimes k_i。运算 \otimes 的规则基于以下的 Vigenère 方表:

  • 将字母 A~Z 按顺序排列,行为明文字母,列为密钥字母,交叉点即为密文字母。
  • 例如,行为 A,列为 B,则密文为 B;行为 C,列为 D,则密文为 F。即密文字母 cic_i 是明文字母 mim_i 在密钥字母 kik_i 对应的行向右循环移位后的字母,或者简单说:若将 A~Z 对应数字 0~25,则 \otimes 运算等价于 ci=(mi+ki)mod26c_i = (m_i + k_i) \bmod 26(再将数字转为字母)。
  • 解密时,明文 mi=(ciki+26)mod26m_i = (c_i - k_i + 26) \bmod 26 对应的字母。

Vigenère 加密在操作时需要注意:

  1. \otimes 运算忽略参与运算的字母的大小写,并保持字母在明文 MM 中的大小写形式;密文的大小写由对应位置的明文决定。
  2. 当明文 MM 的长度大于密钥 kk 的长度时,将密钥 kk 重复使用。

例如,明文 M=HelloworldM = \text{Helloworld},密钥 k=abck = \text{abc} 时,密钥重复为 abcabcabca,密文 C=HfnlpyosndC = \text{Hfnlpyosnd}

现在给定密钥和密文,请解密得到明文。

输入格式

输入共 22 行。

第一行为一个字符串,表示密钥 kk,长度不超过 100100,其中仅包含大小写英文字母。

第二行为一个字符串,表示经加密后的密文 CC,长度不超过 10001000,其中仅包含大小写英文字母。

输出格式

输出共 11 行,一个字符串,表示解密得到的明文。

样例

CompleteVictory
Yvqgpxaimmklongnzfwpvxmniytm
Wherethereisawillthereisaway

数据范围与提示

  • 对于 100%100\% 的数据,密钥长度不超过 100100,密文长度不超过 10001000,且都仅包含英文字母。
  • 解密时注意保持明文字母的大小写:若密文某位为大写,则明文对应位也为大写;若为小写,则明文也为小写。

来源

NOIP 2012 提高组 Day2