1. 程式人生 > >信息安全--維吉利亞密碼

信息安全--維吉利亞密碼

work tab 原理 basic AR ann lin return https

說明:

這個可以直接看這個解釋:

如果你要對自己的男(女)神用維密(不是維多利亞的秘密)表白,先寫好明文:

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
     */

信息安全--維吉利亞密碼