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 p>
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 p>
//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 p>
//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 p>
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...) p>
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()) p>
//3. Crear objeto cbc
iv:= []byte("12345678abcdefg
h")
blockMode:= cipher.NewCBCEncrypter(block, iv)
//4. Cifrado
blockMode.CryptBlocks(newText, newText) p>
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>
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?