Saltar al contenido principal
es/blog/kyber/el-saber-y-el-hacer/

El saber y el hacer — La distancia del secreto — VI

Por Xscriptor — Óscar Preciado6 min de lectura
FilosofíaTecnologíaCriptografíaEnsayocriptografíapost-cuánticaKyberimplementaciónDartxkyber_cryptoepistemologíaAristótelesXscriptorÓscar Preciado
El saber y el hacer — La distancia del secreto — VI

Conocer no es hacer. Hacer no es asegurar.



Aristóteles distinguió tres formas de conocimiento. La episteme es el saber teórico —conocer que algo es verdad—. La techne es el saber productivo —conocer cómo hacer algo—. La phronesis es el saber práctico —conocer qué hacer en una situación concreta—.

La criptografía las exige las tres. Y la distancia entre ellas es el espacio donde ocurren la mayoría de las vulnerabilidades.

Episteme: el paper

Kyber es un logro de la episteme. El paper de Bos et al. (2018) describe un esquema de encapsulamiento de claves basado en Module-LWE, con demostraciones de seguridad, parámetros justificados, análisis de ataques conocidos. Es conocimiento teórico en su forma más depurada: define, demuestra, concluye.

Leer el paper y entenderlo produce la sensación de haber capturado algo importante. La estructura es elegante: la matriz A se genera de una semilla pública, el secreto s se muestrea con distribución binomial centrada, el ciphertext se comprime a 3 bits por coeficiente, el FO transform asegura IND-CCA2. Todo encaja.

Pero la episteme tiene un límite: el paper demuestra que si los componentes se ejecutan correctamente, entonces el esquema es seguro. La proposición condicional es verdadera. Pero el mundo real no evalúa condicionales; ejecuta código.

Episteme (el paper):  Si (NTT correcta ∧ tiempo constante ∧ FO correcto)
                      entonces el esquema es IND-CCA2 seguro.

Techne (el código):   NTT correcta? OK   Tiempo constante? ?   FO correcto? OK
                      La variable que no aparece en la premisa
                      es la que determina la seguridad real.

Techne: la implementación

Durante mi fase de aprendizaje implementé Kyber en Dart/Flutter —xkyber_crypto— siguiendo FIPS 203 al pie de la letra. La techne de traducir el paper a código tiene sus propias exigencias: elegir representaciones de datos, gestionar memoria, implementar SHAKE128 desde cero, organizar la multiplicación de polinomios en dominio NTT.

Cada decisión de implementación revela algo que el paper no dice:

El paper escribe: "Sample s ← β_η^k"

La implementación escribe:

void cbd(Poly r, Uint8List buf) {
  for (int i = 0; i < KYBER_N ~/ 8; i++) {
    int t = buf[2 * i] | (buf[2 * i + 1] << 8);
    for (int j = 0; j < 8; j++) {
      int aj = (t >> j) & 1;
      int bj = (t >> (j + 8)) & 1;
      r.coeffs[8 * i + j] = aj - bj;
    }
  }
}

El paper no especifica el orden de los bits. No dice si el bucle debe ser paralelizable. No menciona que cada acceso a r.coeffs[...] en Dart ejecuta un bounds check que la VM no puede elidir, y que cada bounds check es una oportunidad para que el tiempo varíe.

La implementación fue funcionalmente correcta. Todos los vectores de test pasaban. Pero la techne reveló algo que la episteme no podía: el lenguaje importa. Dart no fue diseñado para criptografía de alto aseguramiento. No hay garantía de que la VM compile un bucle sin ramificaciones dependientes de datos. No hay forma de asegurar que la reducción de Montgomery sea constante en tiempo cuando ~/ 65536 puede compilarse como división o como desplazamiento según la fase de optimización JIT.

La comparación de ciphertexts en el FO transform —el punto más crítico— ilustra el abismo:

// ¿Es esto constante en tiempo?
bool verify(Uint8List a, Uint8List b) {
  if (a.length != b.length) return false;
  int r = 0;
  for (int i = 0; i < a.length; i++) {
    r |= a[i] ^ b[i];
  }
  return r == 0;
}

En C, esta función se compila a instrucciones que un experto puede inspeccionar y verificar. En Dart, el compilador JIT puede reordenar el bucle, fusionar iteraciones, aplicar eliminación de código muerto si deduce que r no se usa, o insertar barreras de GC en las escrituras. No hay volatile. No hay __attribute__((const)). No hay manera de decirle a la VM: "esto debe ejecutarse exactamente como está escrito, sin optimizaciones, sin reordenaciones, sin sorpresas".

La techne de implementar Kyber en Dart se encontró con un límite material: el lenguaje no proporciona las herramientas que la criptografía exige.

Phronesis: el archivo

Llegado a este punto, la phronesis —el saber práctico de qué hacer— impone una decisión. La implementación funciona. Los tests pasan. Pero la seguridad no se demuestra con tests que pasan: se demuestra con propiedades que se garantizan.

No había forma de garantizar tiempo constante en Dart VM. No había forma de inspeccionar el assembly generado por el compilador AOT para verificar que los bucles se mantuvieran sin ramificación. No había forma de asegurar que el recolector de basura no introdujera pausas medibles en el momento exacto de la comparación del FO transform.

La decisión fue archivar el repositorio. No por fracaso técnico —la implementación era correcta— sino por honestidad intelectual:

La decisión de archivar:

  ¿Funciona?                    Sí. Los tests pasan.
  ¿Es seguro?                   No se puede demostrar.
  ¿Puede volverse seguro?       No sin reescribir en C/Rust y enlazar por FFI.
  ¿Aporta valor como referencia? Sí, como ejemplo de hasta dónde llega
                                 la techne sin la infraestructura adecuada.

Aristóteles escribió que la phronesis no es ciencia ni arte: es la capacidad de deliberar bien sobre lo que es bueno o malo para el ser humano. En criptografía, la phronesis es saber reconocer cuándo una implementación es insegura, incluso cuando todos los tests dicen que es correcta.

Lo que enseña el hacer

La serie "La distancia del secreto" ha explorado cinco distancias:

  1. I: la distancia entre la conjetura de LWE y la demostración de seguridad
  2. II: la distancia entre el algoritmo y su implementación constante en tiempo
  3. III: la distancia entre la seguridad computacional y el límite físico de Landauer
  4. IV: la distancia entre la protección presente y la amenaza futura (harvest now)
  5. V: la distancia entre la confianza institucional y la diversidad matemática

VI añade una distancia más fundamental: la distancia entre saber y hacer.

El paper de Kyber es conocimiento verdadero. La implementación en Dart fue conocimiento productivo. Pero la seguridad real —la que resiste un ataque real, no un test unitario— requiere algo que ninguno de los dos proporciona por separado: la capacidad de reconocer que un sistema puede ser funcionalmente correcto y criptográficamente inseguro al mismo tiempo.

Eso no se aprende en el paper. Se aprende implementando, fallando, archivando.


Con "El saber y el hacer" se cierra el ciclo de "La distancia del secreto". La exploración comenzó preguntando cuándo podemos decir que algo es seguro. La respuesta, después de seis ensayos, es: nunca del todo. Pero podemos acercarnos —combinando la teoría que demuestra, la práctica que construye y la sabiduría que reconoce los límites de ambas.


Referencias cruzadas con la investigación: