Capitalización Total del Mercado:$00
API
ES
Oscuro

Buscar SSI/Mag7/Meme/ETF/Moneda/Índice/Gráficos/Investigación
00:00 / 00:00
Ver
    Mercados
    Índexes
    Información
    TokenBar®
    Análisis
    Macro
    Lista
Comp

DAEAD: Cifrado Autenticado Determinista con Datos Asociados

Prof Bill Buchanan OBE
1KPalabras
29/06/2025

DAEAD: Cifrado Autenticado Determinista con Datos Asociados

Superando la Reutilización/Uso Indebido de Nonce: Modo SIV

Existe un principio fundamental en criptografía, donde una salida puede ser determinista o no determinista. Con una salida determinista, siempre obtenemos la misma salida para las mismas entradas. Por ejemplo, podemos crear un cifrado a partir de texto plano, donde la salida siempre será el mismo texto cifrado. Con no determinista, no podemos predecir qué salida se utilizará, ya que se ha utilizado alguna forma de aleatorización en el proceso. Con las firmas, ECDSA es no determinista y EdDSA es determinista.

Cuando se trata de métodos de clave simétrica, la naturaleza determinista puede ser útil en la búsqueda de datos, pero será más débil desde un punto de vista de seguridad, ya que un adversario puede mapear las entradas a la salida. En este caso, combinaremos la naturaleza determinista con el Cifrado Autenticado con Datos Asociados (Deterministic AEAD) y utilizaremos el modo AES-SIV.

SIV: Vector de Inicialización Sintético

Revelamos demasiado de nuestros secretos y, a menudo, no protegemos uno de nuestros secretos más importantes: nuestras claves de cifrado. Para superar esto, podemos utilizar un método llamado "key wrapping", que protege la clave. Esto es especialmente importante cuando transmitimos la clave a través de canales no confiables o la almacenamos en lugares sin un control de acceso sólido. Para un "key wrapping", Rogaway et al. propusieron el método SIV (Synthetic Initialisation Vector) [here] que autentica y cifra, junto con la autenticación de cualquier dato adicional relacionado con la clave:

El método ahora está estandarizado con RFC 5297 [here]. Con métodos de cifrado mejorados, podemos autenticar el cifrado y probar su integridad. Esto se conoce como Cifrado Autenticado con Datos Asociados (AEAD). Para esto, proporcionamos datos adicionales para autenticar el proceso de cifrado y podemos identificar dónde se ha modificado el texto cifrado, de modo que no se pueda descifrar. Con la mayoría de los métodos AEAD convencionales, creamos un valor nonce y agregamos datos adicionales (AD) que se autentican pero no se cifran. Con un enfoque sin nonce, podemos utilizar un método de "key wrapping", que a menudo se ha utilizado para proteger las claves de cifrado. Los datos adicionales pueden incluir [here]:

addresses, ports, sequence numbers, protocol version numbers, and other fields that indicate how the plaintext or ciphertext should be handled, forwarded, or processed

De esta manera, podemos vincular los paquetes de red a los datos cifrados y proporcionar integridad para que un intruso no pueda copiar y pegar texto cifrado válido de otras transmisiones. Por ejemplo, si nos vinculamos a un número de secuencia de paquete y al puerto, la autenticación fallaría para otro número de secuencia u otro puerto.

En el siguiente código, utilizaremos la información adicional de "101112131415161718191a1b1c1d1e1f2021222324252627", pero en la práctica, esto puede tener cualquier longitud. Dentro de SIV, también, podemos tener múltiples fuentes de estos datos adicionales (conocido como un vector de cadenas). Esta información podría estar distribuida en múltiples fuentes y es probable que sea difícil de capturar y replicar para un intruso. Esta es una de las características especiales de SIV y permite que se utilicen múltiples cadenas para la autenticación, en lugar de tener que fusionarlas en una sola cadena para obtener información adicional:

byte[] plaintext = pl.getBytes();

String additional="101112131415161718191a1b1c1d1e1f2021222324252627";
byte[] ciphertext = daead.encryptDeterministically(plaintext, Hex.decode(additional));

Los métodos AEAD tradicionales pueden ser débiles en términos de reutilización de nonce y también de uso indebido de nonce. En muchos sistemas, utilizamos un método no determinista para generar un nonce, por lo que no hay forma de saber si los valores generados previamente no se han utilizado antes. Otra debilidad es donde un nonce puede ser "reproducido" al revertir una máquina virtual y descubrir el valor nonce utilizado. Por lo tanto, la mayoría de los métodos AEAD son seguros con un nonce único, pero no hay garantía de seguridad si el nonce no es único. Como el valor nonce es de tamaño limitado, siempre existirá la posibilidad de reutilizarlo con la misma clave y, por lo tanto, es posible que tengamos que cambiar nuestras claves de forma regular. SIV proporciona más protección para la reutilización/uso indebido de nonce, y donde un atacante solo puede determinar que un valor de texto plano dado y un conjunto dado de datos asociados se protegieron utilizando la clave y el valor nonce definidos.

Codificación

En el siguiente código, creamos una clave SIV y luego creamos valores de texto cifrado, que deberían ser iguales [here]:

package main

import (
"fmt"
"os"

"github.com/tink-crypto/tink-go/v2/daead"
"github.com/tink-crypto/tink-go/v2/keyset"


)

func main() {

msg:="Hello"
associated:="Hello"

argCount := len(os.Args[1:])
if (argCount>0) {msg = os.Args[1]}
if (argCount>1) {associated =os.Args[2]}

handle, _ := keyset.NewHandle(daead.AESSIVKeyTemplate())

primitive, _ := daead.New(handle)

plaintext := []byte(msg)
associatedData := []byte(associated)


ciphertext1, _:= primitive.EncryptDeterministically(plaintext, associatedData)
ciphertext2, _:= primitive.EncryptDeterministically(plaintext, associatedData)

res, _ := primitive.DecryptDeterministically(ciphertext1, associatedData)

fmt.Printf("Plaintext is %s\n",msg)
fmt.Printf("Associated data is %s\n\n",associated)

fmt.Printf("Key is %s\n\n",handle)

fmt.Printf("Cipher1 is %x\n\n",ciphertext1)
fmt.Printf("Cipher2 is %x\n\n",ciphertext2)
fmt.Printf("Decrypted is %s",res)


}

Una ejecución de muestra muestra que tenemos el mismo cifrado cuando ciframos de forma determinista [here]:

Plaintext is Testing 123
Associated data is qwerty123

Key is primary_key_id:1537855825 key_info:{type_url:"type.googleapis.com/google.crypto.tink.AesSivKey" status:ENABLED key_id:1537855825 output_prefix_type:TINK}

Cipher1 is 015ba9d1518f3a5d213ce9630294f87af76ce86011c8631842aa96571d0dee03

Cipher2 is 015ba9d1518f3a5d213ce9630294f87af76ce86011c8631842aa96571d0dee03

Decrypted is Testing 123

10s para entender el mercado crypto
Términospolítica de privacidadLibro BlancoVerificación oficialCookieBlog
sha512-gmb+mMXJiXiv+eWvJ2SAkPYdcx2jn05V/UFSemmQN07Xzi5pn0QhnS09TkRj2IZm/UnUmYV4tRTVwvHiHwY2BQ==
sha512-kYWj302xPe4RCV/dCeCy7bQu1jhBWhkeFeDJid4V8+5qSzhayXq80dsq8c+0s7YFQKiUUIWvHNzduvFJAPANWA==