[Principio y práctica de la criptografía] (2) Implementación del código de sustitución en el código Java

Cifrado de sustitución

Vuelva a imprimir la fuente

definición

Sea P = C = Z 26 , K está compuesto por todas las posibles permutaciones de 26 números 0,1, ... 25. Para cualquier π∈K, defina e π (x) = π (x) yd π (y) = π -1 (y), donde π -1 representa la permutación inversa de la permutación π.

En comparación con el cifrado por desplazamiento de la sección anterior, el cifrado y el descifrado del cifrado por desplazamiento son operaciones algebraicas, pero en el caso del cifrado de sustitución, el proceso de cifrado y descifrado se puede considerar simplemente como una permutación del alfabeto.

Debido a que la contraseña de sustitución es relativamente simple, no introduciremos demasiado. Cabe señalar que el tamaño del espacio clave de la contraseña de sustitución es 26!> 4.0 × 10 26 es un número grande, por lo que el método de ataque de fuerza bruta se usa incluso en la computadora También es imposible hacerlo, pero eso no significa que la contraseña de reemplazo no pueda ser descifrada. Usando otros métodos de criptoanálisis, la contraseña de reemplazo aún puede romperse.

Dar una castaña

Pruebe la contraseña de sustitución para cifrar el siguiente texto sin formato:

nos encontraremos a la medianoche,

Donde la permutación de π en Z 26 es la siguiente

X 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 dieciséis 17 18 19 20 21 22 23 24 25
π (x) 23 13 24 0 7 15 14 6 25 dieciséis 22 1 19 18 5 11 17 2 21 12 20 4 10 9 3 8

Primero obtenga el número correspondiente a cada letra del siguiente alfabeto

UN segundo C re mi F GRAMO H yo J K L METRO norte O PAGS Q R S T U V W X Y CON
0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 dieciséis 17 18 19 20 21 22 23 24 25

disponible:

22 4 22 8 11 11 12 4 4 19 0 19 12 8 3 13 8 6 7 19

El número de textos cifrados disponibles de la permutación es:

10 7 10 25 1 1 12 7 7 12 23 12 19 28 0 18 28 14 6 12

El texto cifrado que se puede recuperar del alfabeto es:

KHKZ BBTH HMXM TZAS ZOGM

Código

package com.slp.cryptography;


import java.util.Arrays;

/**
 * @ClassName SubstitutionCipher
 * @Description 代换密码
 * @Author sanglp
 * @Date 2020/11/30 11:24
 * @Version 1.0
 **/
public class SubstitutionCipher {
    
    
    static  int[] arr = {
    
    23,13,24,0,7,15,14,6,25,16,22,1,19,18,5,11,17,2,21,12,20,4,10,9,3,8};
    static  int[] arr2 = new int[26];
    public static void main(String[] args) {
    
    
        init();
        enCrypt("wewillmeetatmidnight");
        deCrypt("KHKZBBTHHMXMTZASZOGM");
    }

    /**
     * 加密 代还密码需要先初始化一个代换表 在此我们用数组来表示
     * @param resource
     */
    private static void enCrypt(String resource){
    
    
        char[] chararr = resource.toUpperCase().toCharArray();
        StringBuilder result = new StringBuilder();
        for(int i=0;i<chararr.length;i++){
    
    
           result.append( (char) ('A'+arr[chararr[i]-'A']));
        }
        System.out.println(result);
    }

    /**
     * 解密
     * @param resource
     */
    private static void deCrypt(String resource){
    
    
        char[] chararr = resource.toUpperCase().toCharArray();
        StringBuilder result = new StringBuilder();
        for(int i=0;i<chararr.length;i++){
    
    
            result.append( (char) ('A'+arr2[chararr[i]-'A']));
        }
        System.out.println(result);
    }

    /**
     * 初始化逆置换矩阵
     */
    private static void init(){
    
    
        for(int i=0;i<26;i++){
    
    
            arr2[arr[i]]=i;
        }
        System.out.println(Arrays.toString(arr2));
    }
}

Supongo que te gusta

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