Red de conocimientos sobre prescripción popular - Conocimientos de oftalmología - Algoritmo de cifrado simétrico y cómo usarlo

Algoritmo de cifrado simétrico y cómo usarlo

El motivo del cifrado: garantizar la seguridad de los datos.

Elementos esenciales para el cifrado: 1. Texto plano/texto cifrado 2. Clave 3. Algoritmo.

Clave: En criptografía, es una cadena de longitud fija cuya longitud debe determinarse según el algoritmo de cifrado.

Los algoritmos de cifrado y los algoritmos de descifrado suelen ser recíprocos o idénticos.

Dos métodos de cifrado comúnmente utilizados:

Cifrado simétrico: Clave: el cifrado y el descifrado utilizan la misma clave, lo que garantiza la confidencialidad de los datos en ambas direcciones, con una alta eficiencia de cifrado y adecuado para cifrar big data. y archivos, la intensidad del cifrado no es alta (en relación con el cifrado asimétrico).

Cifrado asimétrico: Clave: El cifrado y el descifrado utilizan claves diferentes. Hay dos claves, que requieren un algoritmo de generación de claves para generarse. La confidencialidad de los datos sólo se puede cifrar en una dirección. Si desea resolver este problema, necesita un par de claves bidireccionales, que tienen una baja eficiencia de cifrado y una alta potencia de cifrado.

? Clave pública: clave pública, cifrado de clave pública y descifrado de clave privada.

? Clave privada: debe conservarse correctamente y no puede hacerse pública. Puede utilizar la clave privada para cifrar y la clave pública para descifrar.

Alta seguridad: cifrado múltiple

Operación XOR bit a bit

Cifrado César: El método de cifrado consiste en traducir las letras utilizadas en la inscripción según un número determinado de palabras. La tabla está cifrada.

Mod: Resto

Los tres elementos del cifrado: texto plano/texto cifrado (letras), clave (3) y algoritmo (3/-3 desplazado a la derecha).

Sentido común de seguridad: no utilice algoritmos de desarrollo propio, no se meta en problemas, no es necesario estudiar la implementación subyacente y saber cómo aplicarlas. Las contraseñas de baja seguridad son más peligrosas; que ningún cifrado; cualquier contraseña será descifrada; las contraseñas son solo para la seguridad de la información;

Asegurar la confidencialidad, integridad, autenticación y no repudio de los datos.

El objeto de las operaciones informáticas no es el texto, sino una secuencia de bits dispuestos en orden 0 o 1. El programa se almacena en el disco en forma de una cadena binaria. La operación de mapear el objeto físico en una secuencia de bits se llama codificación, y el descifrado se llama decodificación. Tabla de búsqueda ASCII y convertida a binario.

Tres algoritmos de cifrado simétrico: ¿DES\3DES\AES?

DES: Ha sido descifrado y ya no se utiliza excepto para el texto plano antes del descifrado.

La longitud de la clave es 56 bits/8/8, 7 bytes y se establece un bit por cada 7 bits para comprobar errores, por lo que en realidad son 64 bits.

Cifrado en bloque (procesamiento de grupo): cifra según una unidad (8 bytes/64 bits como grupo, cada grupo se combina con la clave para obtener el texto cifrado a través del algoritmo de cifrado, y la longitud del cifrado permanece). sin alterar.

3DES: Para aumentar la fuerza de DES, Triple DES es un algoritmo de cifrado que se obtiene repitiendo DES tres veces. La longitud de la clave es de 24 bytes y se divide en tres partes. Propósito de cifrado-descifrado-cifrado: para ser compatible con DES, la clave 1 y la clave 2 son iguales == ¿tres claves son iguales? -¿Cifrar una vez? La clave 1 y la clave 3 son iguales: es mejor cifrar tres veces y las tres claves son diferentes. En este momento, el descifrado es equivalente al cifrado, y el primer descifrado es para el caso en que las tres claves son iguales.

En este momento, la operación de descifrado y la operación de cifrado son recíprocas, lo cual es seguro e ineficiente.

¿Puedes descifrar los datos antes de cifrarlos? Sí, descifrar es equivalente a cifrar. Tanto el cifrado como el descifrado son algoritmos.

AES: (Preferido y recomendado) El algoritmo subyacente es Rijndael, la longitud del paquete es de 128 bits y la longitud de la clave está en el rango de 128 bits a 256 bits. En AES, la longitud de la clave es de solo 128 bits \ 192 bits \ 256 bits. En la interfaz proporcionada por go, solo puede ser de 16 bits.

El más seguro y eficaz hasta el momento

Algoritmo subyacente

Modo de cifrado en bloque:

XOR bit a bit, para que los datos se realicen bit a bit Operaciones, primero convierta los datos a binarios, use el operador XOR bit a bit, mismo verdadero, diferente falso, distinto de cero XOR bit a bit una vez es una operación de cifrado, XOR bit a bit dos veces es una operación de descifrado: A y B XOR bit a bit se realiza una vez. , y el resultado se realiza mediante XOR bit a bit con B.

¿BCE? : Si el texto sin formato es normal, el texto cifrado cifrado es normal e inseguro. Go no proporciona una interfaz. El paquete de texto sin formato se divide en bloques de tamaño fijo. Si el último paquete no cumple con la longitud del paquete, es necesario complementarlo.

CBC: Cadena de cifrado

Pregunta: ¿Cómo realizar una operación XOR bit a bit en una cadena? Resuelve las deficiencias de ECB, pero no se puede procesar en paralelo. También es necesario completar el último paquete de texto sin formato y la longitud del vector de inicialización es la misma que la longitud del paquete.

CFB: Modo de retroalimentación de texto cifrado

No es necesario rellenar el último paquete y cifrar el texto cifrado.

OFB:

No es necesario rellenar el último grupo.

Contador CTR:

¿No es necesario llenar el último grupo e inicializar el vector?

Implementación en Go

En el documento oficial:

Al crear una interfaz aes o des, llame al siguiente método y el bloque devuelto es una interfaz.

func NewCipher(clave [] byte)(contraseña. bloqueo, error)

Escriba interfaz de bloque {

//Devuelve el tamaño del bloque de bytes cifrado .

BlockSize() int

//Cifre el primer bloque de datos en src y escríbalo en dst, que puede apuntar a la misma dirección de memoria.

Cifrar (dst, src[] bytes)

//Descifrar el primer bloque de datos en src y escribirlo en dst, que puede apuntar a la misma dirección de memoria.

Decrypt(dst, src[] bytes)

}

La interfaz de bloque representa el cifrador/descifrador de bloque subyacente utilizando una clave específica. Proporciona la capacidad de cifrar y descifrar bloques de datos independientes.

El cifrado/descifrado de bloques también se puede cifrar, pero sólo el primer grupo. Debido a que la longitud de la clave de aes es 16, la longitud del primer conjunto de datos que se operará también es 16.

Si se selecciona cbc como modo de agrupación.

Func newcbcencrypter (bblock, iv [] byte) cifrado en modo bloque

Func newcbcdecrypter (bblock, iv [] byte) descifrado en modo bloque

Cifrado y descifrado Ambos llaman al mismo método CryptBlocks()

Y el modo de paquete cbc encontrará la adición del último paquete de texto sin formato, por lo que se utilizará el tamaño de los bytes cifrados.

Devuelve la interfaz BlockMode subyacente con cifrado B en modo de encadenamiento de bloques de cifrado. La longitud del vector inicial iv debe ser igual al tamaño del bloque de B. Cuatro autodefiniciones

El BlockMode devuelto también es un tipo de interfaz.

Tipo de interfaz de modo de bloque {

//Devuelve el tamaño del bloque de bytes cifrado.

BlockSize() int

//Para cifrar o descifrar bloques de datos contiguos, el tamaño de src debe ser un múltiplo entero del tamaño del bloque, y src y dst pueden apuntar al misma dirección de memoria.

Bloque de cifrado (dst, src[] bytes)

}

La interfaz BlockMode representa un cifrador/descifrador que funciona en modo bloque (como CBC, ECB , etc. ).

El BlockMode devuelto es en realidad B y iv en un tipo de puntero de cbc.

#Proceso de cifrado:?

1. Crear interfaz de cifrado "crypto/des" función nueva contraseña (clave [] bytes) (contraseña.

bloque, error)#-des func newtriplescipher(clave[]byte)(cipher.Block,error)#-3 des "crypto/AES" func new cipher(clave[]byte)(cipher.Block,error)# == aes?

2. Si utiliza el modo de paquete cbc/ecb, debe completar el paquete de texto sin formato.

3. Cree un objeto de interfaz en modo de bloque de cifrado -CBC Func newcbcencrypter (bBlock, IV[]byte)modo de bloque # cifrado-CFB Func newcfbencrypter(bloque de bloque, IV[]byte)stream # cifrado- ofb-CTR.

? 4. Cifre para obtener texto cifrado.

Proceso:

Complete el texto sin formato:

Primero busque el número de bytes en el último grupo y cree un nuevo segmento utilizando la longitud del nuevo segmento y el valor del segmento, y luego use bytes. Cambie la longitud en segmentos de bytes y agréguelos al texto sin formato original.

//Agregar explícitamente

texto sin formato del panel de funciones (texto sin formato[]byte, tamaño de bloque int)[]byte{

//1. número a llenar.

padNum:= tamaño de bloque-len(texto sin formato) tamaño de bloque

///2. Calcule el número de relleno y combínelo con el texto sin formato original.

nuevo relleno:=[]byte { byte(padNum)}

newPlain:=byte. repetir(newPadding, padNum)

texto sin formato = append(texto sin formato, newPlain...)

devolver texto sin formato

}

Eliminar datos de relleno:

Obtenga el último byte del segmento, obtenga el número de bytes rellenados al final, intercepte y regrese.

//Se agrega la melodía de texto plano descifrado.

func createPlaintText(plaint text[]byte, blockSize int)[]byte{

//1, obtiene el último byte, convierte el byte en un número, en este número de Los bytes se eliminan del texto sin formato.

padNum:= int(texto sin formato[len(texto sin formato)-1])

nuevo relleno:= texto sin formato[:len(texto sin formato)-padNum]

Devolver nuevo relleno

}

Cifrado Des:

1. Cree una interfaz criptográfica con des como capa subyacente y devuelva una clave secreta como Interfaz de parámetros.

2. Complete el texto sin formato

3. Para crear una interfaz en modo cbc, necesita crear un vector de inicialización iv y devolver un objeto en modo bloque.

4. Cifrado: el cifrado se realiza llamando a la función cryptBlock en modo bloque. Los parámetros son el parámetro de destino y el parámetro de origen.

//des utiliza el modo de bloqueo cbc para el cifrado.

func encrypto text(texto sin formato[]byte,clave[]byte)[]byte{

//1. Crea un objeto des

bloque de cifrado. , errar := des. Nueva contraseña (clave)

Si err! =cero{

Pánico (error)

}

//2. Completa el texto sin formato

texto nuevo: = padPlaintText (texto sin formato, cipherBlock.BlockSize())

//3 Seleccione el modo de agrupación, donde la longitud del vector debe ser la misma que la longitud de agrupación.

iv:= make([]bytes, bloqueo de contraseña. BlockSize())

blockMode:= contraseña. NewCBCEncrypter(bloque de cifrado, iv)

//4, cifrado

modo de bloqueo. Bloque de cifrado (texto nuevo, texto nuevo)

Devolver texto nuevo

}

Descifrado:

1. es la interfaz de contraseña subyacente y devuelve una interfaz con una clave secreta como parámetro.

2. Crear una interfaz en modo cbc. Debe crear un vector de inicialización iv y devolver un objeto en modo bloque.

3. Para cifrar y descifrar, llame a la función cryptBlock en modo bloque. Los parámetros son el parámetro de destino y el parámetro de origen.

4. Llame al método para eliminar los datos de relleno.

//des utiliza el descifrado cbc en modo bloque.

func DecryptoText(ciphertext[]byte, key[]byte)[]byte{

//1. Crea un objeto des

bloque de cifrado, err. := des. Nueva contraseña (clave)

Si err! =cero{

Pánico (error)

}

///2. Crea una interfaz de modo de agrupación cbc.

iv:=[]bytes(" 12345678 ")

blockMode:=Contraseña. NewCBCDecrypter(bloque de cifrado, iv)

//3.[Comunicación] Descifrado

Modo de bloqueo. Bloque de cifrado (texto cifrado, texto cifrado)

///4. Se eliminarán los datos de relleno de los datos descifrados.

newText:= clearPlaintText(texto cifrado, bloqueo de contraseña. BlockSize())

Devolver texto nuevo

}

Llamada a función principal

func main(){

//Texto sin formato a cifrar

plaint text:=[]byte("El texto cifrado CBC es irregular y, a menudo, el cifrado método utilizado, se debe completar el último paquete y se debe inicializar el vector "

" (una matriz, la longitud de la matriz es igual al paquete de texto sin formato, la fuente de datos la proporciona el persona responsable del cifrado, el vector de inicialización utilizado para el cifrado y descifrado debe ser el mismo)")

//La longitud de la clave La clave debe ser la misma que la longitud del paquete de datos, y el cifrado y Las claves de descifrado también deben ser las mismas.

Clave: =[]byte (" 1234abcd ")

//Función de cifrado de llamada

Criptotexto: = texto cifrado(texto sin formato, clave)

newPlaintText := DecryptoText(texto cifrado, clave)

fmt. Println(string(newPlaintText))

}

El cifrado y descifrado AES son iguales, por lo que solo necesita llamar al método una vez para cifrar y dos veces para descifrar.

Se recomienda utilizar los modos de agrupación: cbc y ctr.

Aes utiliza el modo de bloqueo cbc para el cifrado.

//Agregar texto sin formato

func paddingPlaintText(plaint text[]byte, blockSize int) []byte {

//1, encuentra el resto del grupo

padNum:= tamaño de bloque-len(texto sin formato) tamaño de bloque

//2. Convierte el resto en porciones de bytes y luego usa bytes. Repita para obtener porciones de bytes del tamaño restante.

padByte := byte. repetir([]byte{byte(padNum)}, padNum)

// 3. Agregue el segmento de bytes suplementario al texto sin formato original.

texto sin formato = append(texto sin formato, padByte...)

Devolver texto sin formato

}

//cifrado aes

p>

texto de cifrado funcional (texto sin formato[]byte,clave[]byte)[]byte{

//1, crea un objeto aes

bloquear, error: = aes. Nueva contraseña (clave)

Si err! =cero{

Pánico (error)

}

//2, agrega explícitamente

texto nuevo: = paddingPlaintText(texto sin formato) , block. BlockSize())

//3. Crea un objeto cbc

iv:=[]byte(" 12345678 abcdefgh ")

blockMode: =contraseña. NewCBCEncrypter (Área 4)

//4, cifrado

modo de bloqueo. Bloque de cifrado (texto nuevo, texto nuevo)

Devolver texto nuevo

}

//Eliminación de la cola descifrada

func clearplaintText (plaint text[]byte, blockSize int) []byte {

//1, obtiene el último byte y lo convierte en datos enteros.

padNum:= int(plain text[len(plain text)-1])

///2. Intercepte los datos antes de eliminar los datos enteros de los bytes de texto sin formato. Hay un error aquí. len-padNum es inútil.

texto nuevo:= texto sin formato[:len(texto sin formato)-padNum]

Devolver texto nuevo

}

// descifrado aes

texto de descifrado func(crypherText[]byte,key[]byte)[]byte{

//1, crea un objeto aes

bloque , error:= aes. Nueva contraseña (clave)

Si err! =cero{

Pánico (error)

}

///2. Crear un objeto cbc

iv: =[] byte (" 12345678 abcdefgh ")

blockMode := contraseña. NewCBCDecrypter(bloque, iv)

//3.[Comunicación] Descifrado

Modo de bloqueo.

Bloque de cifrado (texto cifrado, texto cifrado)

//4.residuo

nuevo texto:= clearplaintText(crypherText, block.BlockSize())

Regresar Nuevo texto

}

func main(){

//Texto sin formato a cifrar

texto sin formato:=[]byte ("CBC-Ciphertext es un método de cifrado irregular y de uso frecuente que requiere el relleno del último paquete y la inicialización del vector").

//La longitud de la clave debe ser la misma que la longitud del paquete de datos, y las claves de cifrado y descifrado también deben ser las mismas.

Clave: =[]byte(" 12345678 abcdefgh ")

//Función de cifrado de llamadas

Criptotexto: = texto cifrado(texto sin formato, clave)

//Llame a la función de descifrado

newPlaintText:= deCryptionText(ciphertext, key)

Fmt. Println("Después del descifrado", string(newPlaintText))

}

///aes - cifrado ctr

func cifrado ctrtext(texto sin formato[] palabra Sección, clave[]byte)[]byte{

//1, crea un objeto aes

Bloque, error: = aes. Nueva contraseña (clave)

Si err! =cero{

Pánico (error)

}

//2. Crea un objeto ctr. Aunque el modo ctr no requiere iv, iv aún es necesario cuando se usa ctr en go.

iv:=[]byte(" 12345678 abcdefgh ")

Transmisión:=contraseña. Nuevo Centro (Torre 4)

Arroyo. XORKeyStream(plaintText, PlainText)

Devolver PlaintText

}

func main() {

///aes - cifrado ctr y descifrado, llamarlo dos veces significa descifrado, porque las funciones de cifrado y descifrado son las mismas que las de la secuencia. XORKeyStream

Cifrado CTR:= texto CTR cifrado(texto sin formato, clave)

ctrplanttext:= cifradoCtrText(cifrado CTR, clave)

fmt(" Después del descifrado AES", string(ctrplanttext))

}

Palabra en inglés:

Texto sin formato: ¿texto sin formato? Relleno de texto cifrado: ¿relleno/relleno claro? ¿Cifrado cifrado? [Comunicación]Descifrado