Loading

信息安全--维吉利亚密码

说明:

这个可以直接看这个解释: 

如果你要对自己的男(女)神用维密(不是维多利亚的秘密)表白,先写好明文:

I LOVE YOU

然后自己设定一个密钥,比如:KISS。
这样密钥与明文对应就是

K ISSK ISS
I LOVE YOU

对第一个字母 “I” 加密过程如下:
先找到最左侧密钥 K 所在的一行和最上方明文 I 所在列,找到他们的相交字母 S ,这样 I 就被加密成了 S 。
同理,这句话通过每一个对应密钥的加密后就变成如下

密钥:KISSKISS
明文:ILOVEYOU
密文:STGNOGGM

【原文链接】:
知乎-维吉利亚密码原理是什么

还有我们老师的 ppt 解释(真心简单):

是一种多表移位替换密码:
设d为一固定的正整数,d个移位替换表π=(π1,π2,…πd)由密钥序列K=(k1,k2,…,kd)给定;
第 i+td 个明文字母由表 πi 决定,即密钥 ki 决定;
ek(xi+td)= (xi+td+ki) mod q =y 
dk(yi+td)= (yi+td-ki) mod q =x

java 代码实现:

package com.jiangbiao.firsthomework;

import java.util.ArrayList;
import java.util.List;
import java.util.Scanner;

/**
 * 维吉尼亚密码
 */
public class VigenerePassword {

    public static final char[][] basicTable = new char[26][26];

    public static void main(String[] args) {
        Scanner input = new Scanner(System.in);

        init();
        System.out.println("请输入密钥:");
        String key = input.nextLine();
        System.out.println("请输入明文:");
        String express = input.nextLine();

        String ciphertext = new String();
        ciphertext = encryptionOperation(express, key);
        System.out.println("加密结果如下:" + ciphertext);
    }

    /**
     * 维吉利亚字母表的初始化
     */
    public static void init(){
        System.out.println("维吉尼亚码表如下:");
        for (int i = 0; i < 26; i++){
            for (int j = 0; j < 26; j++){
                basicTable[i][j] = (char)(((j + i) % 26 + 65));//65 = A
                //打印
                System.out.print(basicTable[i][j]);
            }
            System.out.println();
        }
    }

    /**
     * 加密过程
     * @param express
     * @param key
     * @return
     */
    public static String encryptionOperation(String express, String key){
        //对明文进行去除空格,转小写操作  |注:trim()只是去掉首位空格
        String express2 = express.toLowerCase().replaceAll(" ", "");
        System.out.println("express2 : " + express2);
        //若密钥长度小于明文长度,重复密钥
        StringBuffer keys = new StringBuffer("");
        String keyDouble = new String();
        if (key.length() < express2.length()){
           for (int i=0; i<express2.length() / key.length() + express2.length() % key.length(); i++){
               keys = keys.append(key);
           }
           //重复操作处理后的密钥,并进行切分,使长度与明文长度一致
           keyDouble = keys.toString().substring(0, express2.length());
        }
    System.out.println("处理后的密钥:" + keyDouble);
        int i = 0;
        int j = 0;
        char[] keyDoubleChar = keyDouble.toCharArray();
        char[] express2Char = express2.toUpperCase().toCharArray();
        List<Character> ciphertextL = new ArrayList<>();
        for (int m = 0; m < express2.length(); m++){
            for (int n = 0; n < 26; n++){
                if (express2Char[m] == basicTable[0][n]){
                    i = n;
                    System.out.print("  " + "i:" + i + " " + basicTable[0][n]);
                }
                if (keyDoubleChar[m] == basicTable[n][0]){
                    j = n;
                    System.out.print("  " + "j:" + j + " " + basicTable[n][0]);
                }
            }
            System.out.println();
            ciphertextL.add(basicTable[i][j]);
            i = 0;
            j = 0;
        }

        return ciphertextL.toString()
                .substring(1, ciphertextL.toString().length()-1)
                .replaceAll(", ", "");
    }

}
/**
     * 示例1:
     请输入密钥:
     RADIO
     请输入明文:
     p olyal p ha betic cipher
     express2 : polyalphabeticcipher
     处理后的密钥:RADIORADIORADIORADIO
     i:15 P  j:17 R
     j:0 A  i:14 O
     j:3 D  i:11 L
     j:8 I  i:24 Y
     i:0 A  j:14 O
     i:11 L  j:17 R
     j:0 A  i:15 P
     j:3 D  i:7 H
     i:0 A  j:8 I
     i:1 B  j:14 O
     i:4 E  j:17 R
     j:0 A  i:19 T
     j:3 D  i:8 I
     i:2 C  j:8 I
     i:2 C  j:14 O
     i:8 I  j:17 R
     j:0 A  i:15 P
     j:3 D  i:7 H
     i:4 E  j:8 I
     j:14 O  i:17 R
     加密结果如下:GOOGOCPKIPVTLKQZPKMF
     */

    /**
     * 示例2:
     请输入密钥:
     KISS
     请输入明文:
     I LOVE YOU
     express2 : iloveyou
     处理后的密钥:KISSKISS
     i:8 I  j:10 K
     j:8 I  i:11 L
     i:14 O  j:18 S
     j:18 S  i:21 V
     i:4 E  j:10 K
     j:8 I  i:24 Y
     i:14 O  j:18 S
     j:18 S  i:20 U
     加密结果如下:STGNOGGM
     */

 

posted @ 2018-03-26 12:47  sinatJ  阅读(1046)  评论(0编辑  收藏  举报