信息安全--維吉利亞密碼
阿新 • • 發佈:2018-03-26
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 */
信息安全--維吉利亞密碼