欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

维吉尼亚密码算法

程序员文章站 2022-07-08 20:34:46
...

算法的实现

package com.custs.msy;

public class Vigenere {
    /**
     * 大写字母表
     */
     static String dateList="ABCDEFGHIJKLMNOPQRSTUVWXYZ";

     /**
      * 处理**
      * @param key
      * @param inform
      * @return
      */
     public static String dealKey(String key,String inform){
         key = key.toUpperCase();//转大写
         key = key.replaceAll("[^A-Z]", "");//去除所有非字母的字符   

         StringBuffer sb = new StringBuffer(key);
         String realKey = "";
         if(sb.length()!=inform.length()){ 
                //如果**长度与inform不同,则需要生成**字符串
                if(sb.length()<inform.length()){
                    //如果**长度比inform短,则以不断重复**的方式生成**字符串
                    while(sb.length()<inform.length()){
                        sb.append(key);
                    }
                }
                //此时,**字符串的长度大于或等于inform长度
                //将**字符串截取为与inform等长的字符串
                realKey=sb.substring(0, inform.length());
            }
            return realKey;

     }

     /**
      * 
      * @param inform//原文
      * @param key//**
      * @return  密文
      */
    public static String buildPass(String inform,String key){
        inform = inform.toUpperCase();//转大写
        inform = inform.replaceAll("[^A-Z]", "");//去除所有非字母的字符   

        key = dealKey(key, inform);
        int len = key.length();
        StringBuffer sb = new StringBuffer();
        for(int i=0;i<len;i++){
            int row = dateList.indexOf(key.charAt(i));//密码表的行

              int col=dateList.indexOf(inform.charAt(i));//密码表的列号

              int index=(row+col)%26;
                sb.append(dateList.charAt(index));//生成密文

        }
        return sb.toString();
    }


    public static String decrypt(String pass,String key){
        pass = pass.toUpperCase();//转大写
        pass = pass.replaceAll("[^A-Z]", "");//去除所有非字母的字符   
        key = dealKey(key, pass);

        int len = key.length();
        StringBuffer sb = new StringBuffer();
        for(int i=0;i<len;i++){
             int row=dateList.indexOf(key.charAt(i));//行号
                int col=dateList.indexOf(pass.charAt(i));//列号
                int index;
                if(row>col){
                    index=col+26-row;
                }else{
                    index=col-row;
                }
                sb.append(dateList.charAt(index));

        }

        return sb.toString();

    }





    public static void main(String[] args) {
        Scanner scanner = new Scanner(System.in);
        System.out.println("输入原文:");

        String P=scanner.nextLine();

        System.out.println("输入**:");
        String K=scanner.nextLine();        
        System.out.println("密文:"+C);

        System.out.println("明文"+R);

    }
}

效果:

(一)
输入原文:
tobeor not to be
输入**:
jllkjkl
密文:CZMOXBYXEEYKO
明文TOBEORNOTTOBE
(二)
输入原文:
yes
输入**:
no
密文:LSF
明文YES

(三)
输入原文:
china
输入**:
string
密文:UAZVN
明文CHINA

相关标签: 算法 密码