16 世纪法国外交家 Blaise de Vigenère 设计了一种多表密码加密算――Vigenère 密码。Vigenère 密码的加密解密算法简单易用,且破译难度比较高,曾在美国南北战争中为南军所广泛使用。
在密码学中,我们称需要加密的信息为明文,用 M 表示;称加密后的信息为密文,用C 表示;而密钥是一种参数,是将明文转换为密文或将密文转换为明文的算法中输入的数据,记为 k。 在 Vigenère 密码中,密钥 k 是一个字母串,k=k1k2…kn。当明文 M=m1m2…mn时,得到的密文 C=c1c2…cn,其中 ci=mi®ki,运算®的规则如下表所示:
Vigenère 加密在操作时需要注意:
® 运算忽略参与运算的字母的大小写,并保持字母在明文 M输入格式
第一行为一个字符串,表示密钥 k,长度不超过 100,其中仅包含大小写字母。
第二行为一个字符串,表示经加密后的密文,长度不超过 1000,其中仅包含大小写字母。
输出格式
输出共 1 行,一个字符串,表示输入密钥和密文所对应的明文。
数据范围
对于 100% 的数据,输入的密钥的长度不超过 100,输入的密文的长度不超过 1000,且都仅包含英文字母。
输出时每行末尾的多余空格,不影响答案正确性
样例输入 复制
CompleteVictory
Yvqgpxaimmklongnzfwpvxmniytm
样例输出 复制
Wherethereisawillthereisaway
import java.util.Scanner;
/**
* @author 作者 E-mail: WYJ 1627407425@qq.com
* @version 创建时间:2019年5月11日 下午8:01:40
* 类说明
*/
public class Main {
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
String K = sc.nextLine();
String C = sc.nextLine();
char[] k1 = K.toCharArray();
char[] c = C.toCharArray();
char[] k = new char[c.length];
if(k1.length<c.length) {
for(int i=0;i<c.length;i++) {
if(i<k1.length)
k[i] = k1[i];
else
k[i] = k[i-k1.length];
}
}
char[] m = new char[c.length];
for(int i=0;i<c.length;i++) {
if(k[i]>='a'&&k[i]<='z') {
m[i] = (char)((int)c[i]-(int)k[i]+(int)'a');
if(m[i]<'A')
m[i] = (char) ((int)m[i]+26);
else if(m[i]<'a'&&c[i]>=97)
m[i] = (char) ((int)m[i]+26);
}
else if(k[i]>='A'&&k[i]<='Z') {
m[i] = (char)((int)c[i]-(int)k[i]+(int)'A');
if(m[i]<'A')
m[i] = (char) ((int)m[i]+26);
else if(m[i]<'a'&&c[i]>=97)
m[i] = (char) ((int)m[i]+26);
}
}
for(int i=0;i<c.length;i++) {
System.out.print(m[i]);
}
}
}