[Práctica y principios de criptografía] (4) Implementación del código Java del cifrado de Virginia

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
Inserte la descripción de la imagen aquí

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());
    }
}

Supongo que te gusta

Origin blog.csdn.net/weixin_51656605/article/details/110390664
Recomendado
Clasificación