说明:
这个可以直接看这个解释:
如果你要对自己的男(女)神用维密(不是维多利亚的秘密)表白,先写好明文:
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 */