【NOIP 2012】vigenere密碼


描述

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行,一個字符串,表示輸入密鑰和密文所對應的明文。

樣例1

樣例輸入1

 
CompleteVictory
Yvqgpxaimmklongnzfwpvxmniytm

樣例輸出1

 
Wherethereisawillthereisaway

限制

每個測試點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;
}


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM