Contraseña de reemplazo de columna

Contraseña de reemplazo de columna

Libro de texto de referencia: "Curso de criptografía moderna" P46 3.1.1

Proceso

Proceso de cifrado

  1. Escriba el texto sin formato p con un ancho de grupo fijo m establecido por línea, es decir, cada línea tiene m caracteres; si la longitud del texto sin formato no es un múltiplo entero de m , la parte insuficiente se rellena de la manera acordada por ambas partes. Carácter, también puede establecer la matriz de caracteres final [M p ] n × m

  2. Press ... 1,2, m una substitución σ columna de intercambio orden posicional para obtener matriz de caracteres [M P ] n-m ×

  3. Lea la secuencia de texto cifrado c en el orden de las columnas [M p ] n × m .

Proceso de descifrado

  1. Escriba el texto cifrado c por el ancho de columna n para obtener la matriz de caracteres [M p ] n × m

  2. La matriz de caracteres [M p ] n × m se obtiene intercambiando el orden de posición de las columnas de acuerdo con la sustitución inversa σ -1 del reemplazo σ utilizado en el proceso de cifrado

  3. La matriz [M p ] n × m se lee en orden de 1, 2, ..., n filas para obtener el texto plano p

Explicación

Tome el ejemplo 3.2 como ejemplo σ = (143) (56), es decir, cada parte entre paréntesis corresponde a 1 → 4 → 3 → 1 5 → 6 → 5. Aquí uso un diccionario para representar Inserte la descripción de la imagen aquí

        para i en rango (len (s)): 
             para j en rango (len (s [i]) - 1 ): 
                Clave [int (s [i] [j])] = int (s [i] [j + 1]) # diccionario clave 
                antiKey [int (S [i] [j + 1])] = int (S [] [J]) I # contra diccionario tecla 
            tecla [int (s [i] [- 1] )] = int (S [I] [0]) # solucionar el último problema 
            antiKey [int (S [I] [0])] = int (S [I] [-. 1 ]) 
            temp.append (int ( s [i] [ -1]))

 

Por supuesto, no hay 2 en σ = (143) (56), porque 2 corresponde a sí mismo, es decir 2 → 2, por lo que debemos expresarlo por separado

Lenkey-SET = sameKey (TEMP) # encuentran ninguna tecla de cambio 
    para que en sameKey: 
        [I] = I 
        antiKey [I] = I

 

Al cifrar, el texto plano se convierte primero en una matriz y la conversión se realiza de acuerdo con la clave. Por ejemplo, en esta pregunta, la primera columna de la matriz se convierte en la cuarta columna, la cuarta columna se convierte en la tercera columna y la tercera columna se convierte en la primera Las columnas, etc., se pueden hacer usando generativo

M = [M [i] [Tecla [j + 1] -1] para i en rango (n) para j en rango (m)] # 矩阵 转换

 

Código completo

'' ' Código de permutación de columna 
Auher: Jarrycow 
Hora: 17/04/2020 
' '' 
Importación Re 
clase colCode:
     __M = 0
     __N = 0
     __key = [] # clave 
    __apaMsg = ""  # expresamente 
    __secMsg = ""  # secreta Wen 
    
    DEF  la __init__ (Self, m): # de inicialización, la matriz definida anchura 
        . Auto __M = m
         __N = 0
         __key = [] 
         __apaMsg =""  
        __SecMsg = ""  
    DEF getKey (Ser, S): # clave forma de función 
        m = Auto. __M 
        Key = {} 
        antiKey = {} 
        S = re.split (R & lt ' [()] ' , S) # a () límite 
        al mismo tiempo  ''  en S: # eliminando '' 
            s.remove ( '' ) 
        TEMP = [] 
        Lenkey = {. I + 1 para I en Rango (m)} # longitud de la clave 
        para que enrango (len (s)): 
             para j en rango (len (s [i]) - 1 ): 
                Clave [int (s [i] [j])] = int (s [i] [j + 1]) # diccionario clave 
                antiKey [int (S [i] [j +. 1])] = int (S [I] [J]) # clave contra diccionario 
                temp.append (int (s [i] [j])) # incluida clave 
            tecla [int (S [I] [-. 1])] = int (S [I] [0]) # solucionar el último problema 
            antiKey [int (s [i] [0])] = int ( S [I] [- 1. ]) 
            temp.append (int (S [I] [ -1 ])) 
        sameKey = Lenkey-SET (TEMP) # encontrar ninguna tecla de cambio 
        para que en sameKey:
            Key [I] = I 
            antiKey [I] = I 
        Ser. __Key .Append (Key) 
        Ser. __Key .Append (antiKey) 
    DEF ENCODE (Self, P): # función de cifrado 
        . Auto __ApaMsg = P 
        m . = Auto __M 
        n- = Auto. __N 
        Key = Auto. __key [0] 
        P = p.replace ( '  ' , '' ) # eliminado espacio 
        P + = '  ' * (m-len (P)% m) # final acolchado 
        N- = len (P) // m # matriz debe 
        . Auto __N = n- 
        M = [P [m * I: (. I + 1) * m] para I en Rango (n-)] # generación matriz 
        M = [ m [I] [Key [J +. 1] -1] para I en Rango (n-) para J en Rango (m)] # matriz convertidor de 
        m = '' .join (m) # lista en una cadena 
        Ser. __secMsg = M
         retorno M 
    
    def deCode (self, q): 
        self. __ApaMsg = p
        m = auto. __m 
        n = auto. __n 
        Clave = auto. __key [1 ] 
        M = [q [i * m: (i + 1) * m] para i en rango (n)] 
        M = [M [i] [Tecla [j + 1] -1] para i en rango (n) para j en el rango (m)] 
        M = '' .join (M) 
        self. __secMsg = M
         return M
     def Print (self):
         print (self. __m , self. __n , self.__key , auto. __apaMsg , auto. __secMsg ) 
si  __name__ == ' __main__ ' : 
    m = 6 
    p = " Beijing Juegos Olímpicos de 2008 " 
    s = ' (143) (56) ' 
    un = colCode (m) 
    a.getKey (s) 
    q = a.enCode ( p) 
    e = a.deCode (q) 
    A.Print () 
def main ():
     pase

 

Supongo que te gusta

Origin www.cnblogs.com/Jarrycow/p/12717252.html
Recomendado
Clasificación