实验目的与要求

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

实验原理

维吉尼亚密码实验Python 维吉尼亚密码算法_java


:明文为 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();//大写输出密文
	}

验证加密算法:

维吉尼亚密码实验Python 维吉尼亚密码算法_密码学_02


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();//小写输出明文
    }

验证解密算法:

维吉尼亚密码实验Python 维吉尼亚密码算法_维吉尼亚密码实验Python_03

实验结论

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