搜索
热搜: NOIP OIer 神牛
查看: 794|回复: 10

1176 【密码】

[复制链接]

主题

帖子

0

积分

新手上路

Rank: 1

积分
0
发表于 2022-7-14 19:46:37 | 显示全部楼层 |阅读模式
本帖最后由 Ethan 于 2023-3-19 09:37 编辑

Vigenère密码。Vigenère密码的加密解密算法简单易用,且破译难度比较高,曾在美国南北战争中为南军所广泛使用。
在密码学中,我们称需要加密的信息为明文,用M表示;称加密后的信息为密文,用C表示;而密钥是一种参数,是将明文转换为密文或将密文转换为明文的算法中输入的数据,记为k。 在Vigenère密码中,密钥k是一个字母串,k=k1k2…kn。当明文M=m1m2…mn时,得到的密文C=c1c2…cn,其中ci=mi®ki,运算®的规则如下表所示:



回复

使用道具 举报

主题

帖子

0

积分

新手上路

Rank: 1

积分
0
 楼主| 发表于 2022-7-14 19:46:38 | 显示全部楼层
本帖最后由 Ethan 于 2023-3-19 09:33 编辑

Vigenère加密在操作时需要注意:
1.®运算忽略参与运算的字母的大小写,并保持字母在明文M中的大小写形式;
2.当明文M的长度大于密钥k的长度时,将密钥k重复使用。

例如,明文M=Helloworld,密钥k=abc时,密文C=Hfnlpyosnd。

回复

使用道具 举报

主题

帖子

0

积分

新手上路

Rank: 1

积分
0
 楼主| 发表于 2022-7-14 19:46:39 | 显示全部楼层
本帖最后由 Ethan 于 2023-3-19 09:33 编辑

第一行为一个字符串,表示密钥k,长度不超过100,其中仅包含大小写字母。
第二行为一个字符串,表示经加密后的密文,长度不超过1000,其中仅包含大小写字母。
对于100%的数据,输入的密钥的长度不超过100,输入的密文的长度不超过1000,且都仅包含英文字母。
回复

使用道具 举报

主题

帖子

0

积分

新手上路

Rank: 1

积分
0
 楼主| 发表于 2022-7-14 19:46:40 | 显示全部楼层
本帖最后由 Ethan 于 2022-8-4 11:11 编辑

输出共1行,一个字符串,表示输入密钥和密文所对应的明文
回复

使用道具 举报

主题

帖子

0

积分

新手上路

Rank: 1

积分
0
 楼主| 发表于 2022-7-14 19:46:41 | 显示全部楼层
本帖最后由 Ethan 于 2022-8-4 11:12 编辑

样例输入
CompleteVictory
Yvqgpxaimmklongnzfwpvxmniytm
样例输出
Wherethereisawillthereisaway
回复

使用道具 举报

主题

帖子

0

积分

新手上路

Rank: 1

积分
0
 楼主| 发表于 2022-7-14 19:46:42 | 显示全部楼层
本题建议用函数编写

源码:

  1. #include<iostream>
  2. #include<string.h>
  3. using namespace std;
  4. int trans(char t)
  5. {
  6.         int k,f;
  7.         k=int(t);
  8.         if(k>=65 and k<=90)
  9.         {
  10.                 f=k-65;
  11.                 return f;
  12.         }
  13.         if(k>=97 and k<=122)
  14.         {
  15.                 f=k-97;
  16.                 return f;
  17.         }       
  18. }
  19. int main(){
  20.         char m[1000],key[100],c[1000];
  21.         char s;
  22.         int i,a,b,tt;
  23.         int j=0;
  24.         cin>>key>>c;
  25.         for (i=0;i<strlen(c);i++)
  26.         {
  27.                 s=key[j];
  28.                 a=trans(s);
  29.                 b=int(c[i]);
  30.                 tt=b-a;
  31.                 if(b>=65 and b<=90)
  32.                 {
  33.                         if(tt<65)
  34.                                 m[i]=char(tt+26);
  35.                         else       
  36.                                 m[i]=char(tt);
  37.                 }
  38.                 else if(b>=97 and b<=122)
  39.                 {
  40.                         if(tt<97)
  41.                                 m[i]=char(tt+26);
  42.                         else       
  43.                                 m[i]=char(tt);       
  44.                 }
  45.                 j++;
  46.                 if(j>strlen(key)-1)
  47.                         j=0;
  48.         }
  49.         cout<<m;
  50.         return 0;
  51. }
复制代码


回复

使用道具 举报

主题

帖子

0

积分

新手上路

Rank: 1

积分
0
 楼主| 发表于 2022-7-14 19:47:22 | 显示全部楼层
有人吗                  
回复

使用道具 举报

主题

帖子

0

积分

新手上路

Rank: 1

积分
0
 楼主| 发表于 2022-7-14 19:49:27 | 显示全部楼层
回复

使用道具 举报

主题

帖子

0

积分

新手上路

Rank: 1

积分
0
发表于 2022-7-14 19:53:15 | 显示全部楼层
额,很不错
回复

使用道具 举报

主题

帖子

0

积分

新手上路

Rank: 1

积分
0
 楼主| 发表于 2022-7-14 20:25:24 | 显示全部楼层
第一次发这种格式的帖子
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

津ICP备19006949号-1 | 津公网安备12010102000465号

快速回复 返回顶部 返回列表