• NOIP201205Vigenère密码


    NOIP201205Vigenère密码
    难度级别: A; 编程语言:不限;运行时间限制:1000ms; 运行空间限制:51200KB; 代码长度限制:2000000B
    试题描述
       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®ki,运算®的规则如下表所示:  

           

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

           

    输入
    输入共2行。第一行为一个字符串,表示密钥k,长度不超过100,其中仅包含大小写字母。第二行为一个字符串,表示经加密后的密文,长度不超过1000,其中仅包含大小写字母。
    输出
    输出共1行,一个字符串,表示输入密钥和密文所对应的明文。
    输入示例
    CompleteVictory
    Yvqgpxaimmklongnzfwpvxmniytm
    输出示例
    Wherethereisawillthereisaway
    其他说明
    【数据说明】输入的密钥的长度不超过100,输入的密文的长度不超过1000,且都仅包含英文字母。
     

    需要找一下规律,之后就很容易了。

     1 #include<iostream>
     2 
     3 using namespace std;
     4 
     5 int main()
     6 {
     7     int i,lenk,lenmw,key[100];
     8     char k[101],mw[1001],ch;
     9     cin>>k>>mw;
    10     lenk=strlen(k);
    11     lenmw=strlen(mw);
    12     for(i=0;i<lenk;i++)  //先把所有密文和密钥都减掉一个A或a(大写字母减A,小写字母减a),方便后面计算 
    13     {
    14     if(k[i]>='a') key[i]=k[i]-'a';
    15     else key[i]=k[i]-'A'; 
    16     }
    17     for(i=0;i<lenmw;i++)    //进行转换 
    18     {
    19         ch=mw[i]-key[i%lenk];
    20         if((ch<'A')||(ch<'a'&&mw[i]>='a')) ch+=26;
    21         cout<<ch;
    22     }
    23     return 0;
    24 }
    NOIP201205Vigenère密码
  • 相关阅读:
    Core Animation笔记(变换)
    Core Animation笔记(- Layer 基本属性)
    使用AndroidStudio编写APICloud模块需要注意的地方,解决模块未定义。
    MAC中使用APICloud同步代码错误解决办法
    【深入理解Java虚拟机 】类加载器的命名空间以及类的卸载
    【深入理解Java虚拟机 】类的加载器
    【深入理解Java虚拟机】类的初始化过程
    Netty中ByteBuf的引用计数线程安全的实现原理
    Java使用PipedStream管道流通信
    Java中的守护线程
  • 原文地址:https://www.cnblogs.com/YXY-1211/p/5666171.html
Copyright © 2020-2023  润新知