[1402] 一本通 Vigenère密码

这个题的思路并不算太难,主要是®运算的转化

®运算可以转化成一张由字母的ASCII码与A的ASCII码的差值组成的表格

我们会发现,密钥的ASCII码和A的ASCII码的差值(简称ki好了)(同理明文的叫mi,密文的叫ci),这个东西,它符合一个规律:ci=ki+mi,所以想得到mi,只需ci-ki,而明文就是ci-ki+A的ASCII码,也就是密文的ASCII码-密钥的ASCII码+A的ASCII码(大家都能化简的,相信我~~看我真诚的大眼睛~~)

后面的你们都能看懂了
```cpp
#include<bits/stdc++.h> 
using namespace std;  
void turn(char &x);  
int main()  
{  
    char k[1000],C[1000];//定义密钥k和密文C  
    int len1,len2;  
    int i,j;  
    gets(k);//读入密钥
    gets(C);//读入密文  
    len1=strlen(k);  
    len2=strlen(C);   
    for(i=0;i<len1;i++)  
        turn(k[i]);//将密钥转化为大写,方便运算  
    for(i=0,j=0;i<len2;i++)  
    {  
        if(C[i]<='Z')//判断原字母大小写  
        {  
            C[i]=C[i]-(k[j]-'A');//进行运算,得到原明文 
            j++;//这是一个指针,记录现在是密钥的第几位  
            if(C[i]<'A')  
                C[i]='Z'-('A'-C[i])+1;//转换回原大小写  
        }  
        else  
        {  
            C[i]=C[i]-(k[j]-'A');  
            j++;  
            if(C[i]<'a')  
                C[i]='z'-('a'-C[i])+1;  
        }  
        if(j>len1-1)//如果到了最后一位,重新开始  
            j=0;  
    }  
    cout<<C<<endl;//输出明文  
    return 0;  
}  
void turn(char &x)//大小写转换  
{  
    if((x>='a')&&(x<='z'))  
        x-=32;  
}
```  
 
 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
Vigenère密码是一种多表密码加密算法,由16世纪法国外交家Blaise de Vigenère设计。它的加密解密算法简单易用,且破译难度比较高,曾在美国南北战争中为南军所广泛使用。在Vigenère密码中,明文M经过加密算法转换为密文C,密钥k是一个字母串,过运算规则将明文的每个字符与密钥的对应字符进行运算得到密文的每个字符。具体的运算规则可以参考引用\[2\]中的表格。\[1\] 对于题目中要求将密文转化为明文的问题,可以使用公式:明文=(密文-(密钥-‘a’))+26。需要注意的是,当明文小于'A'时,按照规律进行转换,即明文=(密文-(密钥-‘a’))+26。可以参考引用\[3\]中的代码示例来实现解密过程。\[3\] 总结起来,Vigenère密码是一种多表密码加密算法,过密钥和运算规则将明文转换为密文。解密过程则是将密文根据相应的规则转换为明文。 #### 引用[.reference_title] - *1* *2* [【1402Vigenère密码](https://blog.csdn.net/developer_zhb/article/details/104944216)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v91^insertT0,239^v3^insert_chatgpt"}} ] [.reference_item] - *3* [信奥一本1402Vigenère密码详解](https://blog.csdn.net/mayuanxie/article/details/105493273)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v91^insertT0,239^v3^insert_chatgpt"}} ] [.reference_item] [ .reference_list ]
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值