Vigenère 密码

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Vigenère 密码相关的知识,希望对你有一定的参考价值。

略简单的字符串+模拟。

原题链接:https://www.luogu.org/problem/show?pid=1079#sub

如果你对那个图感到懵逼,那属于正常,但没关系,这个图其实作用不大,我们需要的是找到字符串的规律。

可以发现,每一个字母都代表一个数字,从a到z分别代表0到25,而明文和密文的转换是通过一个减法,用密钥减去这个代表数字,得到一个数,这个数对应的ascii字符即为明文。

有几个细节问题。一个是密钥不够长的问题,这里需要一个预判,如果密钥不够长就把它补长。第二个就是大小写问题,这个好办,判断时大小写都判断就好。

以为这样就完了?并不。。。这样有可能会出现减过头的情况,需要加回来,加一个26就好。

附代码:

 1 #include <cstdio>
 2 #include <cstring>
 3 #define maxn 1005
 4 char k[maxn],c[maxn],m[maxn];
 5 int lena,lenb;
 6 int main(){
 7     gets(k);
 8     gets(c);
 9     lena = strlen(k);
10     lenb = strlen(c);
11     if (lena < lenb)
12         for (int i=lena;i<lenb;i++)
13             k[i] = k[i-lena];
14     int t;
15     for (int i=0;i<lenb;i++){
16         if (k[i]>=A && k[i]<=Z)
17             t = k[i]-A;
18         if (k[i]>=a && k[i]<=z)
19             t = k[i]-a;
20         m[i] = c[i] - t;
21         if (c[i]>=A && c[i]<=Z && m[i]<A)
22             m[i]+=26;
23         if (c[i]>=a && c[i]<=z && m[i]<a)
24             m[i]+=26;
25     }
26     for (int i=0;i<lenb;i++)
27         printf("%c",m[i]);
28     return 0;
29 }

 

以上是关于Vigenère 密码的主要内容,如果未能解决你的问题,请参考以下文章

Vigenère密码

Vigenère密码

codevs1197 Vigenère密码

1402Vigenère密码(Noip2012提高组第1题)

一本通1402 Vigenère密码

Vigenère 密码(luogu 1079)