蓝桥杯——Playfair密码——字符串

本文介绍了一种基于Playfair密码的变种加密方法,首先通过密钥填充5x5方阵,然后对输入字符串进行加密。加密过程中考虑了多种特殊情况的处理,如相同字母、不在方阵中的字母等。程序读取密钥和待加密字符串,输出加密后的结果。解密过程则是对加密字符串再次进行相同的加密操作,以恢复原始信息。

题目描述
一种 Playfair 密码变种加密方法如下:首先选择一个密钥单词(称为 pair )(字母不重复,且都为小写字母),然后与字母表中其他字母一起填入至一个 5x5 的方阵中,填入方法如下:

首先按行填入密钥串。

紧接其后,按字母序按行填入不在密钥串中的字母。

由于方阵中只有 25 个位置,最后剩下的那个字母则不需变换。

如果密钥为 youandme,则该方阵如下:

y o u a n

d m e b c

f g h i j

k l p q r

s t v w x

在加密一对字母时,如 am,在方阵中找到以这两个字母为顶点的矩形:

y o u a n

d m e b c

f g h i j

k l p q r

s t v w x

这对字母的加密字母为该矩形的另一对顶点,如本例中为 ob。

请设计程序,使用上述方法对输入串进行加密,并输出加密后的串。

另外有如下规定:

  • 一对一对取字母,如果最后只剩下一个字母,则不变换,直接放入加密串中;
  • 如果一对字母中的两个字母相同,则不变换,直接放入加密串中;
  • 如果一对字母中有一个字母不在正方形中,则不变换,直接放入加密串中;
  • 如果字母对出现在方阵中的同一行或同一列,如 df 或 hi,则只需简单对调这两个字母,即变换为 fd 或 ih ;

如果在正方形中能够找到以字母对为顶点的矩形,假如字母对为 am,则该矩形的另一对顶点字母中,与 a 同行的字母应在前面,在上例中应是 ob;同样若待变换的字母对为 ta,则变换后的字母对应为 wo;

本程序中输入串均为小写字母,并不含标点、空格或其它字符。

解密方法与加密相同,即对加密后的字符串再加密,将得到原始串。

输入描述
两行字符串。

第一行为密钥单词(长度小于等于 25 )。

第二行为待加密字符串(长度小于等于 50 )。

两行字符串末尾都有一个回车换行符,并且两行字符串均为小写字母,不含其它字符。

输出描述
输出加密后的字符串。

输入输出样例
示例
输入

youandme
welcometohangzhou

输出

vbrmmomvugnagzguu

int indexOf(int ch)
返回指定字符在此字符串中第一次出现处的索引。

import java.util.*;
public class Main {
      public static void main(String[] args) {
          Scanner scanner = new Scanner(System.in);
          String line = scanner.nextLine();
          int x='a';
          while (line.length()<25) {
              if(line.indexOf((char)x)==-1)
                  line+=(char)x;
              x++;
        }
          String nums = scanner.nextLine();
          String answer="";
          for(int i=0;i<nums.length()-1;i+=2){
              char frist=nums.charAt(i),second=nums.charAt(i+1);
              int indexOfFrist=line.indexOf(frist),indexOfSecond=line.indexOf(second);
              if (indexOfFrist==indexOfSecond) {
                answer+=frist;
                answer+=second;
            }else if(indexOfFrist==-1||indexOfSecond==-1) {
                answer+=frist;
                answer+=second;
            }else if(indexOfFrist/5==indexOfSecond/5||indexOfFrist%5==indexOfSecond%5) {
                answer+=second;
                answer+=frist;
            }else {
                
                char a=line.charAt(indexOfFrist/5*5+indexOfSecond%5),b=line.charAt(indexOfSecond/5*5+indexOfFrist%5);
                answer+=a;
                answer+=b;
            } 
        }
          if (nums.length()%2!=0)
              answer+=nums.charAt(nums.length()-1);
         System.out.println(answer);
}}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值