Libro de texto de referencia: "Curso de criptografía moderna" P46 3.1.1
Proceso
Proceso de cifrado
-
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
-
Press ... 1,2, m una substitución σ columna de intercambio orden posicional para obtener matriz de caracteres [M P ] n-m ×
-
Lea la secuencia de texto cifrado c en el orden de las columnas [M p ] n × m .
Proceso de descifrado
-
Escriba el texto cifrado c por el ancho de columna n para obtener la matriz de caracteres [M p ] n × m
-
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
-
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
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