(3)Vigenere密码算法的Java实现

Vigenère密码是多表代换密码中的一种,其思想是:明文的每个字母使用不同k的凯撒加密
我们可以构造一个维吉尼亚密码表的矩阵,最左边为密钥字母,最上面为明文,加密过程很简单:给定密钥字母x和明文字母y,密文字母为位于x行和y列的字母。
其实,如果假设能被加密的字符有N个,如果把这N个字符建成一个环, 那么加密过程就是模N的过程,即,C(i)=(K(i)+P(i))modN,其中K、C、P分别代表的是密钥空间、密文空间、消息(明文)空间。
根据维吉尼亚密码算法,编写相应Java程序:


public class Vigenere {

    /**大写字母表**/
    static String alpha="ABCDEFGHIJKLMNOPQRSTUVWXYZ";

    /**
     * 处理密钥
     * @param str 字符串
     * @param K 密钥
     * @return 与str长度相等的密钥字符串
     */
    public static String dealK(String str,String K){   
        K=K.toUpperCase();// 将密钥转换成大写
        K=K.replaceAll("[^A-Z]", "");//去除所有非字母的字符  
        StringBuilder sb=new StringBuilder(K);
        String key="";
        if(sb.length()!=str.length()){ 
            //如果密钥长度与str不同,则需要生成密钥字符串
            if(sb.length()<str.length()){
                //如果密钥长度比str短,则以不断重复密钥的方式生成密钥字符串
                while(sb.length()<str.length()){
                    sb.append(K);
                }
            }
            //此时,密钥字符串的长度大于或等于str长度
            //将密钥字符串截取为与str等长的字符串
            key=sb.substring(0, str.length());
        }
        return key;
    }

    /**
     * 根据vigenere密码算法对明文进行加密
     * @param P 明文
     * @param K 密钥
     * @return 密文
     */
    public static String encrypt(String P,String K){
        P=P.toUpperCase();// 将明文转换成大写
        P=P.replaceAll("[^A-Z]", "");//去除所有非字母的字符   
        K=dealK(P,K);
        int len=K.length();
        StringBuilder sb=new StringBuilder();
        for(int i=0;i<len;i++){
            int row=alpha.indexOf(K.charAt(i));//行号
            int col=alpha.indexOf(P.charAt(i));//列号
            int index=(row+col)%26;
            sb.append(alpha.charAt(index));
        }
        return sb.toString();       
    }

    /**
     * 根据vigenere密码算法对密文进行解密
     * @param C 密文
     * @param K 密钥
     * @return 明文
     */
    public static String decrypt(String C,String K){
        C=C.toUpperCase();// 将密文转换成大写
        C=C.replaceAll("[^A-Z]", "");//去除所有非字母的字符   
        K=dealK(C,K);
        int len=K.length();
        StringBuilder sb=new StringBuilder();
        for(int i=0;i<len;i++){
            int row=alpha.indexOf(K.charAt(i));//行号
            int col=alpha.indexOf(C.charAt(i));//列号
            int index;
            if(row>col){
                index=col+26-row;
            }else{
                index=col-row;
            }
            sb.append(alpha.charAt(index));
        }
        return sb.toString();     
    }

    public static void main(String args[]){
        String P="explanation";
        String K="leg";
        String C=encrypt(P,K);
        System.out.println("密文:"+C);
        System.out.println("明文:"+decrypt(C,K));
    }

}

运行程序,结果如下:
密文:PBVWETLXOZR
明文:EXPLANATION

  • 1
    点赞
  • 29
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值