"Si un trabajador quiere hacer bien su trabajo, primero debe afilar sus herramientas." - Confucio, "Las Analectas de Confucio. Lu Linggong"
Página delantera > Programación > Cifrado simétrico: el apretón de manos secreto de la criptografía, Go Crypto 4

Cifrado simétrico: el apretón de manos secreto de la criptografía, Go Crypto 4

Publicado el 2024-11-04
Navegar:745

Symmetric Encryption: The Secret Handshake of Cryptography, Go Crypto 4

¡Hola, entusiasta de las criptomonedas! ¿Listo para sumergirse en el mundo del cifrado simétrico? Piense en ello como el apretón de manos secreto del mundo digital: una forma para que dos partes compartan información que sólo ellos pueden entender. ¡Desglosémoslo y veamos cómo Go nos ayuda a implementar estos apretones de manos secretos digitales!

Cifrados en bloque: los componentes básicos

En primer lugar, tenemos cifrados en bloque. Son como las ruedas de cifrado de la era digital: funcionan con fragmentos de datos de tamaño fijo. La estrella del espectáculo aquí es AES (Estándar de cifrado avanzado).

AES: El campeón de peso pesado

AES es como la navaja suiza del cifrado: es versátil, potente y ampliamente utilizado. Así es como lo configurarías en Go:

import (
    "crypto/aes"
    "crypto/rand"
    "fmt"
)

func main() {
    // Let's create a 256-bit key (32 bytes)
    key := make([]byte, 32)
    if _, err := rand.Read(key); err != nil {
        panic("Oops, the universe's randomness machine broke!")
    }

    block, err := aes.NewCipher(key)
    if err != nil {
        panic("AES threw a tantrum!")
    }

    fmt.Printf("Our AES block size: %d bytes\n", block.BlockSize())
}

Esto configura AES, pero recuerde, un cifrado de bloque por sí solo es como un automóvil sin ruedas: funcional, pero no muy útil todavía. Ahí es donde entran los modos de operación, pero llegaremos a eso en un momento.

Stream Ciphers: el río fluido del cifrado

A continuación, tenemos cifrados de flujo. Estos son como un flujo interminable de bits de apariencia aleatoria que aplicamos XOR con nuestros datos para cifrarlos. Go nos ofrece ChaCha20, un cifrado de flujo moderno y rápido.

ChaCha20: El chico nuevo de la cuadra

Así es como usarías ChaCha20:

import (
    "fmt"
    "golang.org/x/crypto/chacha20"
)

func main() {
    key := make([]byte, chacha20.KeySize)
    nonce := make([]byte, chacha20.NonceSize)

    cipher, err := chacha20.NewUnauthenticatedCipher(key, nonce)
    if err != nil {
        panic("ChaCha20 isn't feeling chatty today!")
    }

    secretMessage := []byte("ChaCha20 is my new dance move!")
    encrypted := make([]byte, len(secretMessage))
    cipher.XORKeyStream(encrypted, secretMessage)

    fmt.Printf("Our secret dance move, encrypted: %x\n", encrypted)
}

ChaCha20 es excelente cuando necesitas velocidad, especialmente en plataformas sin aceleración de hardware AES.

Modos de operación: poniéndolo todo junto

Ahora, hablemos de los modos de operación. Son como las reglas de un juego: definen cómo utilizamos nuestros cifrados para cifrar datos de forma segura.

GCM (Modo Galois/Contador): La navaja suiza

GCM es como la navaja suiza de los modos de cifrado. Proporciona tanto secreto como integridad, por lo que es muy recomendable para la mayoría de los casos de uso. Así es como lo usarías:

import (
    "crypto/aes"
    "crypto/cipher"
    "crypto/rand"
    "fmt"
)

func main() {
    key := make([]byte, 32)
    if _, err := rand.Read(key); err != nil {
        panic("The random number generator went on strike!")
    }

    block, err := aes.NewCipher(key)
    if err != nil {
        panic("AES is having an existential crisis!")
    }

    nonce := make([]byte, 12)
    if _, err := rand.Read(nonce); err != nil {
        panic("Nonce generator is feeling noncommittal!")
    }

    aesgcm, err := cipher.NewGCM(block)
    if err != nil {
        panic("GCM mode is feeling moody!")
    }

    secretMessage := []byte("AES-GCM: Making encryption great again!")
    encrypted := aesgcm.Seal(nil, nonce, secretMessage, nil)

    fmt.Printf("Our encrypted message: %x\n", encrypted)

    // Let's decrypt it to make sure it worked
    decrypted, err := aesgcm.Open(nil, nonce, encrypted, nil)
    if err != nil {
        panic("Decryption failed! Did someone tamper with our message?")
    }

    fmt.Printf("Decrypted message: %s\n", decrypted)
}

CTR (modo contador): el Streamifier

El modo CTR es como una varita mágica que convierte un cifrado de bloque en un cifrado de flujo. Es útil cuando necesitas la flexibilidad de un cifrado de flujo pero quieres seguir con un algoritmo de cifrado de bloques:

import (
    "crypto/aes"
    "crypto/cipher"
    "crypto/rand"
    "fmt"
)

func main() {
    key := make([]byte, 32)
    if _, err := rand.Read(key); err != nil {
        panic("Random number generator is feeling random about its job!")
    }

    block, err := aes.NewCipher(key)
    if err != nil {
        panic("AES is having a block party, and we're not invited!")
    }

    iv := make([]byte, aes.BlockSize)
    if _, err := rand.Read(iv); err != nil {
        panic("IV generator is feeling too independent!")
    }

    stream := cipher.NewCTR(block, iv)

    secretMessage := []byte("CTR mode: Turning blocks into streams since 1979!")
    encrypted := make([]byte, len(secretMessage))
    stream.XORKeyStream(encrypted, secretMessage)

    fmt.Printf("Our streamed secret: %x\n", encrypted)

    // Let's decrypt it
    decrypted := make([]byte, len(encrypted))
    stream = cipher.NewCTR(block, iv) // Reset the stream
    stream.XORKeyStream(decrypted, encrypted)

    fmt.Printf("Decrypted message: %s\n", decrypted)
}

Las reglas de oro del cifrado simétrico

Ahora que tienes estas nuevas y brillantes herramientas de cifrado, aquí tienes algunas reglas de oro que debes tener en cuenta:

  1. GCM es tu amigo: En la mayoría de los casos, utiliza AES-GCM. Es como un guardaespaldas para sus datos: protege tanto el secreto como la integridad.

  2. Nonce es el sabor de la vida: utilice siempre un nonce único (número usado una vez) para cada operación de cifrado. Es como un identificador único para cada mensaje secreto.

  3. La aleatoriedad es la clave: genera tus claves usando crypto/rand. Usar claves débiles es como usar "contraseña123" para su cuenta bancaria.

  4. CTR necesita un amigo: Si estás usando el modo CTR, recuerda que no protege la integridad. Considere vincularlo con una MAC si necesita protección de integridad.

  5. El manejo de errores no es opcional: maneje siempre los errores, especialmente durante la generación e inicialización de claves. Ignorar errores en el código criptográfico es como ignorar la luz "Check Engine" de tu auto.

  6. Mantén tus secretos en secreto: Nunca, jamás, codifiques claves en tu código fuente. Es como esconder las llaves de tu casa debajo del tapete de bienvenida: ¡el primer lugar donde mirará un atacante!

¿Qué sigue?

¡Felicidades! Acaba de agregar cifrado simétrico a su kit de herramientas criptográficas. Estas técnicas son excelentes para proteger los datos cuando ambas partes comparten una clave secreta.

Pero ¿qué pasa si necesitas establecer una conexión segura con alguien que nunca has conocido antes? Ahí es donde entra en juego la criptografía de clave pública, que exploraremos en la siguiente sección. Es como la diferencia entre un apretón de manos secreto y una firma pública: ambos son útiles, pero para escenarios diferentes.

Recuerde, en el mundo de la criptografía, comprender estos conceptos básicos es crucial. Es como aprender a cerrar las puertas con llave antes de construir un castillo. Domine estos y estará en el buen camino para crear aplicaciones seguras y sólidas en Go.

Entonces, ¿qué tal si intentas cifrar un mensaje para ti mismo? ¿O tal vez implementar una aplicación sencilla y segura para tomar notas utilizando AES-GCM? ¡El mundo de la comunicación segura está a tu alcance! ¡Feliz codificación, campeón de criptografía!

Declaración de liberación Este artículo se reproduce en: https://dev.to/rezmoss/metric-encryption-the-secret-handshake-of-cryptography-go-crypto-4-1d17?1 Si hay alguna infracción, comuníquese con Study_golang@163 .com para eliminarlo
Último tutorial Más>

Descargo de responsabilidad: Todos los recursos proporcionados provienen en parte de Internet. Si existe alguna infracción de sus derechos de autor u otros derechos e intereses, explique los motivos detallados y proporcione pruebas de los derechos de autor o derechos e intereses y luego envíelos al correo electrónico: [email protected]. Lo manejaremos por usted lo antes posible.

Copyright© 2022 湘ICP备2022001581号-3