Red de conocimiento informático - Conocimiento informático - Algoritmo de cifrado simétrico y cómo usarlo

Algoritmo de cifrado simétrico y cómo usarlo

Motivo del cifrado: garantizar la seguridad de los datos

Elementos necesarios para el cifrado: 1. Texto sin formato/texto cifrado 2. Clave secreta 3. Algoritmo

Clave secreta : en En criptografía, es una cadena de longitud fija cuya longitud debe determinarse de acuerdo con el algoritmo de cifrado

El algoritmo de cifrado y el algoritmo de descifrado son generalmente recíprocos o pueden ser iguales

Dos métodos de cifrado comúnmente utilizados:

Cifrado simétrico: Clave secreta: el cifrado y el descifrado utilizan la misma clave, la confidencialidad de los datos está garantizada en ambas direcciones, la eficiencia del cifrado es alta, adecuada para cifrar grandes datos y archivos grandes. La intensidad del cifrado no es alta (en comparación con el cifrado asimétrico)

Cifrado asimétrico: clave secreta: se utilizan diferentes claves secretas para el cifrado y el descifrado. Es necesario utilizar dos claves para generar dos claves. claves La confidencialidad de los datos solo se puede cifrar en una dirección. Si desea resolver este problema, ambas direcciones deben tener un par de claves secretas, la eficiencia del cifrado es baja y la intensidad del cifrado es alta.

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

Clave privada: debe conservarse correctamente, no se puede revelar, cifrado de clave privada y descifrado de clave pública

Alta seguridad: cifrados múltiples

Operación XOR bit a bit

p>

Cifrado César: El método de cifrado consiste en cifrar cambiando el alfabeto utilizado en la inscripción según un cierto número de palabras

mod: resto

Tres elementos de cifrado: texto sin formato/texto cifrado (letras), clave secreta (3), algoritmo (pan 3/-3 a la derecha)

Sentido común en materia de seguridad: no utilice algoritmos de desarrollo propio, no se meta en problemas, no es necesario estudiar la implementación subyacente y comprenda cómo las aplicaciones de contraseñas de baja seguridad son más peligrosas que no tener cifrado; ; cualquier contraseña será descifrada; las contraseñas son solo una parte de la seguridad de la información

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

El objeto de operación de la computadora no es texto, sino un secuencia de bits ordenada por 0 o 1. El programa se almacena en el disco como una cadena binaria, que es una secuencia de bits. La operación de mapear cosas reales en una secuencia de bits se llama codificación, el cifrado también se llama codificación y el descifrado. decodificación, busque el número correspondiente según la tabla de comparación ASCII y conviértalo a binario

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

DES: ha sido descifrado y está ya no se usa excepto para descifrar texto plano anterior

La longitud de la clave es 56 bits/8, 7 bytes, y cada 7 bits se configurará para bits de verificación de errores, por lo que en realidad es de 64 bits

Bloque cifrado (procesado en grupos): al cifrar, el cifrado se realiza en unidades (8 bytes / 64 bits como grupo) y cada grupo se combina. La clave secreta obtiene el texto cifrado a través del algoritmo de cifrado y la longitud cifrada permanece sin cambios

3DES: Triple DES es un algoritmo de cifrado que se obtiene repitiendo DES tres veces para aumentar la fuerza de DES. La longitud de la clave es de 24 bytes, dividida en tres Cifrado--Descifrado--Propósito del cifrado: ¿En orden? 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? ¿Cifrar tres veces y tres claves? no son lo mismo en este momento, el descifrado es equivalente al cifrado. El descifrado en el medio es para garantizar que las tres claves sean iguales.

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

p>

¿Está bien descifrar los datos primero y luego cifrarlos? Sí, el descifrado es equivalente al cifrado. El cifrado y el descifrado son algoritmos.

AES: (preferido y recomendado) El algoritmo subyacente es Rijndael. La longitud del grupo es de 128 bits y la longitud de la clave está dentro del rango de 128 bits. 256 bits, pero 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 bytes (se puede seleccionar 128 bits). >

El más seguro y eficiente hasta el momento

Algoritmo subyacente

>

Modo de cifrado de bloque:

XOR bit a bit, realice operaciones bit a bit en los datos, primero convierta los datos en binario, operador XOR bit a bit ^, lo mismo es cierto, diferente es falso, No-0 es falso, 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 se realizan XOR una vez y el resultado se realiza XOR bit a bit con b

¿ECB?: Si el texto sin formato es regular y el El texto cifrado cifrado es regular e inseguro, esta interfaz no se proporciona en go. El grupo de texto sin formato se divide en bloques de tamaño fijo. Si el último grupo no cumple con la longitud del grupo, es necesario rellenarlo

CBC. : Cadena de cifrado

Pregunta: ¿Cómo realizar XOR bit a bit en una cadena? Resuelve las deficiencias de la verificación de reglas del BCE, pero no se puede procesar en paralelo, el último grupo de texto sin formato también debe completarse y la longitud del vector de inicialización es la misma que la longitud del grupo

CFB: retroalimentación de texto cifrado modo

No es necesario rellenar el último grupo y cifrar el texto cifrado

OFB:

No es necesario rellenar el último grupo

Contador CTR:

¿No es necesario completar el último grupo o inicializar el vector?

Implementación en Go

Documentación oficial:

Al crear aes o cuando es una interfaz des, se llama al siguiente método y el bloque devuelto es una interfaz

func NewCipher(clave [] byte) (cifrado. Bloque, error)

type Block interface {

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

BlockSize() int

// Cifra el primero bloque de datos en src y escribirlo en dst, src y dst pueden apuntar a la misma dirección de memoria

Encrypt(dst, src []byte)

// Descifrar el primer bloque de datos en src y escribirlos en dst. src y dst pueden apuntar a la misma memoria

Decrypt(dst, src []byte)

}

<. p> La interfaz Block representa un cifrador/descifrador de bloques de bajo nivel que utiliza una clave específica. Proporciona la capacidad de cifrar y descifrar bloques de datos independientes.

Encrypt/Decrypt del bloque también puede cifrar, pero solo puede cifrar el primer grupo. Debido a que la longitud de la clave de aes es 16, la longitud del primer grupo de datos que se operará también es 16.

Si el modo de agrupación es cbc

func NewCBCEncrypter(b Block, iv []byte) Cifrado BlockMode

func NewCBCDecrypter(b Block, iv []byte) Descifrado BlockMode

Tanto el cifrado como el descifrado llaman al mismo método CryptBlocks()

Y el modo de agrupación cbc encontrará la adición del último grupo de texto sin formato, por lo que el tamaño de los bytes cifrados será ser utilizado

Devuelve una interfaz BlockMode en modo de encadenamiento de bloques de cifrado, con el cifrado subyacente usando b. La longitud del vector inicial iv debe ser igual al tamaño de bloque de b.

iv Defínalo usted mismo

El BlockMode devuelto también es un tipo de interfaz

escriba la interfaz BlockMode {

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

BlockSize() int

// Cifrar o descifrar bloques de datos continuos, el tamaño de src debe ser un múltiplo entero del tamaño del bloque, src y dst pueden apuntar a la misma dirección de memoria

CryptBlocks (dst, src []byte)

}

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 cbc

# Proceso de cifrado:?

1. Cree una interfaz criptográfica de nivel inferior " crypto" usando des/3des/aes /des" func NewCipher(clave []byte) (cipher.Block, error) # -- des func NewTripleDESCipher(clave []byte) (cipher.Block, error) # -- 3des " crypto/aes" func NewCipher(key []byte) (cipher.Block, error) # == aes?

2. Si está utilizando el modo de agrupación cbc/ecb, debe completar el grupo de texto sin formato

3. Cree un objeto de interfaz para el modo de bloque de cifrado - cbc func NewCBCEncrypter(b Block, iv []byte) BlockMode # Encryption - cfb func NewCFBEncrypter(block Block, iv []byte) Stream # Encryption - ofb - ctr

?4. Cifrar y obtener texto cifrado

Proceso:

Complete texto sin formato:

Primero busque el número de bytes en el último grupo, cree un nuevo segmento. La longitud es el nuevo segmento y el valor también es la longitud del segmento. Luego use bytes.Reapet para cambiar la longitud a un segmento de bytes y agréguelo al texto sin formato original. >

//Suplemento de texto sin formato

func padPlaintText (plaintText []byte, blockSize int)[]byte{

// Encuentra el número a completar

padNum:= blockSize-len(plaintText) blockSize

//2. Opera el número rellenado y combínalo con el texto sin formato original

newPadding:= []byte{ byte(padNum)}

newPlain: = bytes.Repeat(newPadding, padNum)

PlainText = append(plaintText, newPlain...)

devuelve PlainText

}

Eliminar los datos de relleno:

Tome el último byte del segmento, obtenga el número de bytes rellenados al final, intercepte y devuelva

//El lugar donde se agrega la melodía de texto plano descifrado

func createPlaintText(plaintText []byte, blockSize int)[]byte{

//1. Obtener el último byte, convertir el byte en un número y eliminar los bytes de tamaño numérico en el texto sin formato

padNum:= int(plaintText[len(plaintText)-1])

newPadding:= PlaintText[:len(plaintText)-padNum]

return newPadding

}

des cifrado:

1. Cree una interfaz criptográfica subyacente usando des, siendo el parámetro una clave secreta y devolviendo una interfaz

2. Complete el texto sin formato

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

4. Cifrado, llame a la función cryptBlock en modo bloque para el cifrado, los parámetros son el parámetro de destino y el parámetro de origen

//des usa agrupación Cifrar en modo cbc

func EncryptoText(plaintText []byte, clave []byte)[]byte{

//Crear objeto des.

cipherBlock , err:= des.NewCipher(key)

if err != nil {

pánico(err)

}

/ /2. Complete el texto sin formato

newText:= padPlaintText(plaintText, cipherBlock.BlockSize())

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

iv:= make([]byte, cipherBlock.BlockSize())

blockMode:= cipher. NewCBCEncrypter(cipherBlock, iv)

// 4. Cifrado

blockMode.CryptBlocks(newText, newText)

devuelve newText

}

des decryption:

1. Cree una interfaz criptográfica subyacente usando des, con el parámetro como clave secreta, y devuelva una interfaz

2. Cree un Interfaz de modo cbc, necesita crear un vector de inicialización iv y devolver un objeto en modo bloque

3. Cifre, llame a la función cryptBlock en modo bloque para descifrar, 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 use el modo de grupo cbc para descifrar

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

//1. Crear objeto des

cipherBlock, err:= des.NewCipher(key)

if err != nil {

pánico(err)

}

//2. Crear interfaz en modo grupo cbc

iv:= []byte("12345678 ")

blockMode:= cipher.NewCBCDecrypter(cipherBlock, iv)

//3. Descifrado

blockMode.

CryptBlocks(cipherText, cipherText)

//4. Elimina los datos rellenados de los datos descifrados

newText:= clearPlaintText(cipherText, cipherBlock.BlockSize())

<. p> return newText

}

Llamada a función principal

func main(){

//Texto sin formato que debe cifrarse

plaintText := []byte("CBC: el texto cifrado no tiene reglas y se usa a menudo para el cifrado. Es necesario completar el último grupo y se requiere un vector de inicialización"

"(una matriz, la longitud de la matriz es igual al grupo de texto sin formato, fuente de datos: proporcionada por la 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 grupo, y las claves para el cifrado y descifrado son las mismas

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

//Llamar a la función de cifrado

cipherText:= EncryptoText(plaintText, key)

newPlaintText:= DecryptoText(cipherText, key)

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 llamarlo dos veces para descifrar

Se recomienda utilizar el modo de agrupación: cbc, ctr

aes utiliza el modo de agrupación cbc para el cifrado

//Complementa el texto sin formato

func paddingPlaintText(plaintText []byte, blockSize int) []byte {

//1. Encuentra el resto de la agrupación

padNum:= blockSize - len(plaintText) blockSize

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

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

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

PlaintText = append(plaintText, padByte...)

return texto plano

}

//cifrado aes

func texto cifrado (texto plano []byte, clave []byte) []byte {

//1. Crear objeto aes

bloque, err:= aes.NewCipher(key )

if err != nil {

pánico(err)

}

//2. Suplemento de texto sin formato

newText:= paddingPlaintText(plaintText, block.BlockSize())

//3. Crear objeto cbc

iv:= []byte("12345678abcdefg

h")

blockMode:= cipher.NewCBCEncrypter(block, iv)

//4. Cifrado

blockMode.CryptBlocks(newText, newText)

return newText

}

//Cola después del descifrado

func clearplaintText(plaintText []byte, blockSize int) []byte {

//1. Obtener el último byte y convertirlo en datos enteros

padNum:= int(plaintText[len(plaintText)-1])

/. /2. Intercepte los datos antes de eliminar los datos enteros del byte de texto sin formato. Aquí hay un error y no se utiliza len-padNum.

newText:= PlaintText[:len(plaintText)-padNum]

devolver texto nuevo

}

//descifrado aes

func deCryptionText(crypherText []byte, clave []byte) [ ]byte {

//1. Crear objeto aes

bloque, err:= aes.NewCipher(key)

si err!= nil {

pánico(err)

}

//2. Crear objeto cbc

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

blockMode:= cipher.NewCBCDecrypter(block, iv)

//3. Descifrado

blockMode.CryptBlocks(crypherText, crypherText)

/ /4. Quitar la cola

newText:= clearplaintText(crypherText, block.BlockSize())

return newText

}

func main(){

//Texto sin formato que debe cifrarse

PlaintText:= []byte("CBC: el texto cifrado no tiene reglas y se utiliza a menudo para cifrar. Finalmente, es necesario completar un grupo y se requiere un vector de inicialización")

//La longitud de la clave La clave debe ser la misma que la longitud del grupo, y las claves de cifrado y descifrado deben ser las mismas

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

//Llamar a la función de cifrado

cipherText:= cifradoText(plaintText, clave)

//Llamar a la función de descifrado

newPlaintText:= deCryptionText(cipherText, key)

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

}

//aes --ctr cifrado

func cifradoCtrText(plaintText []byte, clave []byte

e) []byte {

//1. Crear objeto aes

bloque, err: = aes.NewCipher(key)

si err!= nil {

panic(err)

}

//2. Crea un objeto ctr Aunque iv no es necesario en el modo ctr, sigue siendo necesario cuando. usando ctr en go iv

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

stream:= cipher.NewCTR(block, iv)

stream. .XORKeyStream(plaintText, PlainText)

return PlaintText

}

func main() {

//cifrado aes--ctr y descifrado, llamado dos veces. Eso es descifrado, porque las funciones de cifrado y descifrado son la misma secuencia > fmt.Println("aes decryption", string(ctrPlaintText))

}

. Palabras en inglés:

Texto sin formato: texto sin formato? Criptotexto: relleno de texto cifrado: relleno/relleno ¿eliminar cifrado?