维吉尼亚密码算法

算法的实现

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

    原文作者:维吉尼亚加密问题
    原文地址: https://blog.csdn.net/mengsiyuan1997/article/details/78317454
    本文转自网络文章,转载此文章仅为分享知识,如有侵权,请联系博主进行删除。
点赞