情报破译-Cryptanalysis

描述

A国和B国正在进行一场战争。A国通过间谍知道B国的情报加密规则为:

1.    仅对字母加密,其他符号保留(如空格,逗号等)

2.    对第i个单词(i1开始)的加密方法是把第i个单词反转(如abc变成cba),然后对单词内的每个字母采用经典的Caesar加密法,循环后移i个字母。例如:第5个单词的加密表如下所示:

密码字母:A B C D E F G H I J K L M N O P Q R S T U VW X Y Z

原文字母:V W X Y Z A B C D E F G H I J K L M N O P QR S T U

3.      单词的定义是:任何一串极大的连续字母串。

比如,样例输出第三行,第二个单词为ba,反转后为aba后移2个单词变成cb后移两个单词变成d,故该单词加密后为cd(见样例输入第三行)。

现在A国又截获了一些B国的情报密文。请你帮A国破译出情报的内容。

输入一共有不超过int范围行,每行为一个字符串(int范围)。注意,每行是可以以空格开头的。输出情报破译后得到的内容。每条情报对应输出一行。样例输入
fiU umncv oolz  ioex jhfqu,  zg uh zqI nlaxO  ockl yz kmpzgE.
fX gxcj , ghlsxffr cxmG K.
ab3cd
样例输出
The talks will  take place,  at an Air Force  base on Sunday.
We have , occupied City F.
az3ba



代码实现

/*
 * To change this license header, choose License Headers in Project Properties.
 * To change this template file, choose Tools | Templates
 * and open the template in the editor.
 */

package test1;
import java.lang.*;

/**
 *
 * @author Sapphire
 */

public class Test1 {
    /**
     * @param args the command line arguments
     */
    public static void main(String[] args)throws Exception {
        // TODO code application logic here
        String time=javax.swing.JOptionPane.showInputDialog("请输入密文");
        int length=time.length();
        int count=0,t=0,k=0;
        char[] msg=new char[length];
        char[] mesg=new char[100];
        for(int i=0;i<length;i++){
            msg[i]=time.charAt(i);
        }      
         for(int m=0;m<length;m++){
            if(msg[m]>='a'&&msg[m]<='z'||msg[m]>='A'&&msg[m]<='Z'){
                mesg[t]=msg[m];
                t++;
                if(m==length-1){   
                    count++;  
                    k=m;
                    for(int n=0;n<t;n++){
                    int ik=mesg[n]-count;
                    if(!(ik>64&&ik<91||ik>96&&ik<123))
                    ik=ik+26;
                    mesg[n]=(char)ik; 
                    msg[k]=mesg[n];
                    k--;
                }     
                }
            }
            else{
                count++;  
                k=m-1;
                for(int n=0;n<t;n++){
                    int ik=mesg[n]-count;
                    if(!(ik>64&&ik<91||ik>96&&ik<123))
                    ik=ik+26;
                    mesg[n]=(char)ik; 
                    msg[k]=mesg[n];
                    k--;
                }        
                if(!(msg[m+1]>='a'&&msg[m+1]<='z'||msg[m+1]>='A'&&msg[m+1]<='Z')){
                    m++;
                }
                else{
                    t=0;
                    continue;
                }  
            }        
         }
         for(int i=0;i<length;i++){
            System.out.print(msg[i]);
        }   
         //System.out.println(count);
    }
}


猜你喜欢

转载自blog.csdn.net/sapphireirene/article/details/45768939