# Código evolutivo

El código evolutivo o rolling code (también código variable o hopping code) se ideó para ser utilizado en los sistemas de llave remota, para impedir ataques de replay, donde un espía externo graba la transmisión y la reproduce en otro momento para hacer que el "receptor securizado" se desbloquee, por ejemplo, el "automóvil" o abra una puerta. Dichos sistemas son típicos en los mandos de puertas de garaje y en los sistemas de "control remoto sin llave" para automóviles.

## Técnicas

* Utiliza un PRNG (generador de números pseudoaleatorios ) — preferentemente un generador de números pseudo-aleatorios criptográficamente seguro; en ambos lados, transmisor y receptor
* El transmisor envía el 'siguiente' código en secuencia
* El receptor compara ese 'código siguiente' con su código 'siguiente' calculado.
* En una implementación típica se compara el código con los siguientes 256 códigos por si el receptor ha perdido alguna de las pulsaciones de tecla transmitidas
* El receptor también puede comparar el código recibido con una tabla de códigos previamente recibidos para determinar si hay repeticiones recientes.

## Aplicación en mandos RF

Un transmisor de código evolutivo o rolling-code, es útil en un sistema de seguridad para proporcionar una transmisión segura de radiofrecuencia (RF) que comprende un código fijo entrelazado con un código trinario más una porción con rolling-code. Un receptor demodula la transmisión de RF encriptada y recupera el código fijo y el rolling-code. Tras la comparación de los códigos fijo y el rolling-code con los códigos almacenados en el receptor, se puede asegurar que la señal ha emanado de un transmisor autorizado, y se genera una señal para accionar un motor eléctrico de una puerta o para liberar o bien bloquear un vehículo.

## KeeLoq

El Microchip HCS301 fue una vez el sistema más utilizado en los receptores y control remoto de garaje y puerta. El chip usa el algoritmo KeeLoq. El sistema HCS301 KeeLoq transmite 66 bits de datos.
* 34 bits no están encriptados: un número de serie de 28 bits, 4 bits de información de botón y 2 bits de estado (indicadores de batería baja y repetición).
* 32 bits están encriptados (el rolling code): 4 bits de información de botón, 2 bits de OVR (usado para extender el valor del contador), 10 bits de DISC (valor de discriminación, a menudo los 10 bits bajos del número de serie), y un 16 contador de bits. En una situación de resincronización, por pérdida de secuencia, los 32 bits cifrados se reemplazan por un valor inicial de 32 bits.

## Código evolutivo vs. código fijo en mandos RF

Los controles remotos envían un código mediante señales que usan algún tipo de codificación, de mayor o menor complejidad. Cuando el código recibido es el mismo que el que espera el receptor, el receptor activa el relé, desbloquea la puerta o abre la barrera. Los controles remotos con "código fijo" siempre envían el mismo código. Los controles remotos con "código evolutivo" (o rolling-code) cada vez envían un código diferente al que se envió anteriormente.

## Vulnerabilidades

Un código continuo transmitido por una señal de radio que puede ser interceptada puede ser vulnerable a la falsificación. En 2015, se informó que Samy Kamkar había construido un dispositivo electrónico económico del tamaño de una billetera que podía ocultarse en un vehículo cerrado o cerca de él para capturar un código único de "entrada sin llave" que se utilizaría más adelante para desbloquear el vehículo. El dispositivo transmite una señal de interferencia para bloquear la recepción del vehículo de las señales de código rodante del mando del propietario, mientras graba estas señales de sus dos intentos necesarios para desbloquear el vehículo. El primer código grabado se remite al vehículo solo cuando el propietario realiza el segundo intento, mientras que el segundo código registrado se retiene para su uso futuro. Kamkar declaró que esta vulnerabilidad era ampliamente conocida desde hace años por estar presente en muchos tipos de vehículos, pero que anteriormente no se había demostrado. Se hizo una demostración durante la DEF CON 23.