Vigenère 密码加密及解密

Posted zzctommy

tags:

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

定义:戳这里

加密:

#include<bits/stdc++.h>
using namespace std;
char a[1200],b[1200],tmp,ans[1200];
int main()
{
    printf("       Vigenère加密

" ); 
    printf("输入秘钥:");scanf("%s",b);puts(""); 
    printf("输入明文:");scanf("%s",a);puts(""); 
    for(int i=0;i<strlen(a);)
    {
        for(int j=0;j<strlen(a)&&j<strlen(b);j++,i++)
        {
            int tmp;
            if(b[j]>='A'&&b[j]<='Z')tmp=b[j]-'A'+'a';
            else tmp=b[j];
            tmp=tmp-'a';
            if(a[i]>='a'&&a[i]<='z') {
                if(tmp+a[i]>'z')ans[i]=tmp-26+a[i];
                else ans[i]=tmp+a[i];
            }
            if(a[i]>='A'&&a[i]<='Z') {
                if(tmp+a[i]>'Z')ans[i]=tmp-26+a[i];
                else ans[i]=tmp+a[i];
            }
        }
    }
    printf("密文:%s
",ans);
    return 0;
}

解密:

#include<bits/stdc++.h>
using namespace std;
char a[1200],b[1200],tmp,ans[1200];
int main()
{
    cout<<"       Vigenère解密
" <<endl; 
    cout<<"输入秘钥:";scanf("%s",b);puts(""); 
    cout<<"输入秘文:";scanf("%s",a);puts(""); 
    for(int i=0;i<strlen(a);)
    {
        for(int j=0;j<strlen(a)&&j<strlen(b);j++,i++)
        {
            if(a[i]>='A'&&a[i]<='Z')
            {
                if(b[j]>='a'&&b[j]<'z')tmp=b[j]-'a'+'A';
                else tmp=b[j];
                if(a[i]-tmp>=0)ans[i]=a[i]-tmp+'A';
                else ans[i]=a[i]-tmp+'Z'+1;
            }
            if(a[i]>='a'&&a[i]<='z')
            {
                if(b[j]>='A'&&b[j]<='Z')tmp=b[j]-'A'+'a';
                else tmp=b[j];
                if(a[i]-tmp>=0)ans[i]=a[i]-tmp+'a';
                else ans[i]=a[i]-tmp+'z'+1;
            }
        }
    }
    printf("明文:%s
",ans);
    return 0;
}

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

一本通1402 Vigenère密码

Vigenère 密码(luogu 1079)

洛谷 P1079 Vigenère 密码

[字符串][NOIP2012]Vigenère密码

洛谷 P1079 Vigenère 密码 题解

[NOIP2012] 提高组 洛谷P1079 Vigenère 密码