Cifrado Vigenere
Vuelva a imprimir la fuente
Ya sea una contraseña de turno o una contraseña de sustitución, una vez que se selecciona la clave secreta, el número correspondiente a cada letra se cifra y se transforma en un número único correspondiente. A esto lo llamamos una contraseña de sustitución de una sola tabla y este artículo trata sobre una contraseña de sustitución de varias tablas.
definición
Sea m un entero positivo, defina P = C = K = (Z 26 ) my defina E k (x 1 , x 2 , para cualquier clave secreta K = (k 1 , k 2 , k 3 … k m ) X. 3 ... X m ) = (X. 1 + K. 1 , X. 3 + K 2 ... X m + K m ), y D K (Y. 1 , Y 2 ... Y K ) = (Y. 1 -k . 1 , Y 2 - k 2 … y m -k m )
Todos los cálculos anteriores se realizan en Z 26 .
En correspondencia con el alfabeto anterior, cada tecla K equivale a una cadena de longitud m, llamada palabra clave. La contraseña de Virginia cifra m letras de nombre a la vez.
El tamaño del espacio de clave del cifrado de Virginia es de 26 m , por lo que incluso si el valor de m es pequeño, lleva mucho tiempo utilizar la clave exhaustiva. En términos generales, las contraseñas de sustitución de varias tablas son más seguras que las contraseñas de sustitución de una sola tabla.
Dar una castaña
Suponiendo que m = 6, la palabra clave es CIPHER, que corresponde a la siguiente cadena de números (2,8,15,7,4,17), el texto plano a cifrar es: codificar y decodificar, la clave secreta es mykey
Código
package com.slp.cryptography;
/**
* @ClassName VigenereCipher
* @Description 维吉尼亚密码
* @Author sanglp
* @Date 2020/11/30 15:55
* @Version 1.0
**/
public class VigenereCipher {
static int [] arr = {
12,24,10,4,24};
public static void main(String[] args) {
encrypt("encodeanddecode");
decrypt("QLMSBQYXHBQAYHC");
}
/**
* 加密函数
* @param resource
*/
public static void encrypt(String resource){
char [] souarr = resource.toUpperCase().toCharArray();
int len = arr.length;//密钥串的长度
StringBuilder result = new StringBuilder();
for(int i=0;i<souarr.length;i++){
int temp =(souarr[i]-'A'+arr[i%len])%26<0?(souarr[i]-'A'+arr[i%len])%26+26:(souarr[i]-'A'+arr[i%len])%26;
result.append((char)('A'+temp));
}
System.out.println(result.toString());
}
/**
* 解密函数
* @param resource
*/
public static void decrypt(String resource){
char [] souarr = resource.toUpperCase().toCharArray();
int len = arr.length;//密钥串的长度
StringBuilder result = new StringBuilder();
for(int i=0;i<souarr.length;i++){
int temp =(souarr[i]-'A'-arr[i%len])%26<0?(souarr[i]-'A'-arr[i%len])%26+26:(souarr[i]-'A'-arr[i%len])%26;
result.append((char)('A'+temp));
}
System.out.println(result.toString());
}
}