描述
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-'A'+ki-'A')mod26+'A',運算?的規則如下表所示:
Vigenere加密在操作時需要注意:
1. ?運算忽略參與運算的字母的大小寫,並保持字母在明文M中的大小寫形式;
2. 當明文M的長度大於密鑰k的長度時,將密鑰k重復使用。
格式
輸入格式
輸入共2行。
第一行為一個字符串,表示密鑰k,長度不超過100,其中僅包含大小寫字母。第二行為一個字符串,表示經加密后的密文,長度不超過1000,其中僅包含大小寫字母。
輸出格式
輸出共1行,一個字符串,表示輸入密鑰和密文所對應的明文。
限制
每個測試點1s
提示
對於100%的數據,輸入的密鑰的長度不超過100,輸入的密文的長度不超過1000,且都僅包含英文字母。
來源
Noip2012提高組復賽Day1T1
模擬秒之。。如果你要是跟我一樣腦殘的話那你調一個小時吧
#include<cstdio>
#include<cctype>
#include<cstring>
using namespace std;
char key[110],miwen[1010];
int keynum[110],mingwen[1010];
int lenkey,lenmiwen;
int main()
{
scanf("%s%s",key,miwen);
lenkey = strlen(key);
lenmiwen = strlen(miwen);
for(int i=0;i<lenkey;i++)
if(key[i] >='a' && key[i]<='z') keynum[i] = key[i] - 'a';
else keynum[i] = key[i] - 'A';
for(int i=0;i<lenmiwen;i++)
mingwen[i]=miwen[i]-keynum[i%lenkey];
for(int i=0;i<lenmiwen;i++)
if(isupper(miwen[i]))
{
if(mingwen[i]<'A')mingwen[i]+=26;
printf("%c",mingwen[i]);
}
else
{
if(mingwen[i]<'a')mingwen[i]+=26;
printf("%c",mingwen[i]);
}
puts("");
return 0;
}