【密码学】Vigenere 维吉尼亚算法加解密

实验目的与要求

1、 理解维吉尼亚密码算法原理。
2、 编程实现维吉尼亚密码算法。

实验原理

在这里插入图片描述
:明文为 wearediscovered,密钥为 deceptive,密文为 ZICVTWQNGRZGVTM。

实验内容

采用自己熟悉的编程语言实现维吉尼亚密码算法,正确完成加解密。

实验步骤与结果

根据算法原理可知,维吉尼亚算法的加密和解密过程实际是就是对明文(密文)的每一位根据所给密钥进行移位(做加法/减法)而得出其对应的密文(明文)。

加密:C = P + K (mod 26)
解密:P = (C - K) % 26

在IntellJ IDEA集成开发环境中创建一个Vigenere类,类中定义两个方法vigenereEnCode()vigenereDeCode()分别实现加密和解密。

main()主方法:调用加密函数vigenereEnCode()和解密函数vigenereDeCode(),验证这两个函数的功能。

	public static void main(String args[]){

        Scanner scanner = new Scanner(System.in);//标准输入流

        System.out.println("请输入您要进行加密的明文和对应的密钥:");
        String plainText = scanner.next();//输入明文:wearediscovered
        String key = scanner.next();//输入密钥:deceptive
        String cipherText = vigenereEnCode(plainText, key);
        System.out.println("密文: " + cipherText);

        System.out.println("请输入您要进行解密的密文和对应的密钥:");
        cipherText = scanner.next();//输入密文:ZICVTWQNGRZGVTW
        key = scanner.next();//输入密钥:deceptive
        plainText = vigenereDeCode(cipherText, key);
        System.out.println("明文: " + plainText);
    }

vigenereEnCode()方法:实现加密功能。接收两个参数,第一个是小写的明文,第二个是小写的密钥。

	/**
     * 加密 C = P + K (mod 26)
     * @param plainText 明文
     * @param key 密钥
     * @return
     */
    public static String vigenereEnCode(String plainText, String key) {
        char[] pt = plainText.toLowerCase().toCharArray();//将传入的明文全部转成小写统一处理
        char[] k = key.toLowerCase().toCharArray();//将传入的密钥全部转成小写统一处理
        int length = plainText.length();
        int d = key.length();
        StringBuilder cipherText = new StringBuilder();
        int t;
        for (int i = 0;i < length;i++){
            t = (int)pt[i] + (int)k[i % d] - (int)'a';//把明文的每一位进行加密(移位)
            if (t > (int)'z'){
                t = t - 26;
            }
            char c = (char) t;
            cipherText.append(c);
        }
        return cipherText.toString().toUpperCase();//大写输出密文
	}

验证加密算法:
在这里插入图片描述
vigenereDeCode()方法:实现解密功能。接收两个参数,第一个是大写的密文,第二个是小写的密钥。

	/**
     * 解密 P = (C - K) % 26
     * @param cipherText 密文
     * @param key 密钥
     * @return
     */
    public static String vigenereDeCode(String cipherText, String key) {
        char[] ct = cipherText.toLowerCase().toCharArray();//将传入的密文全部转成小写统一处理
        char[] k = key.toLowerCase().toCharArray();//将传入的密钥全部转成小写统一处理
        int length = cipherText.length();
        int d = key.length();
        StringBuilder plainText = new StringBuilder();
        int t;
        for (int i = 0;i < length;i++){
            t = (int)ct[i] - (int)k[i % d] + (int)'a';//把密文的每一位进行解密(移位)
            if (t < (int)'a'){
                t = t + 26;
            }
            char c = (char) t;
            plainText.append(c);
        }
        return plainText.toString().toLowerCase();//小写输出明文
    }

验证解密算法:
在这里插入图片描述

实验结论

通过本次实验,我了解并学习到了维吉尼亚算法的原理,能够使用编程语言对维吉尼亚算法的加解密进行实现。这个算法的核心是为了掩盖一般凯撒密码的字母使用中暴露的频率特征,用多套符号代替原来的文字,密钥才是解密的关键,这使得频率分析法暂时失效。除此之外,也使我对Java语言的使用更加熟练。

  • 3
    点赞
  • 48
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Kaho Wang

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值