Code tournant
# Code tournant

Un code tournant est utilisé dans les systèmes de verrouillage centralisé pour prévenir les tentatives de forçage par ré-émission, dont le principe est d'enregistrer le signal émis et de le rejouer plus tard afin de déclencher le déverrouillage par le récepteur. Ce type de code est notamment mis en œuvre dans les portes automatiques de garage et dans les verrouillages centralisés de voiture.

## Technique

* un générateur de nombres pseudo-aléatoires, pseudorandom number generator (PRNG) en anglais, — de préférence générateur de nombres pseudo-aléatoires à sécurité cryptographique, cryptographically secure pseudorandom number generator (CSPRNG) en anglais — présent à la fois dans l'émetteur et dans le récepteur.
* l'émetteur transmet le 'nouveau code'.
* le récepteur compare ce 'nouveau code' à son 'nouveau code' pré-calculé.
* Une implémentation standard consiste à le comparer à une liste de 256 futurs codes pré-calculés au niveau du récepteur, afin d'autoriser: plusieurs éventuelles pertes de transmission entre l'émetteur et le récepteur, ou cas le plus courant, un enfant s'amusant à appuyer sur les boutons.

## Application dans les télécommandes RF

Un émetteur de code tournant est utilisé dans un système de sécurité à base d'émission de signal radio-fréquence (RF) comprenant un code fixe et un code tournant. Un récepteur démodule le signal RF crypté et en extrait le code fixe et le code tournant. Après comparaison du code fixe et du code tournant avec les codes déjà reçus, et après vérification de la présence du code tournant dans la liste des 256 futurs codes attendus, cet ensemble code fixe + code tournant est reconnu comme valide, et une commande est générée pour, par exemple, actionner un moteur électrique ou bien activer l'ouverture ou la fermeture d'une porte.

## Télécommande RF à code tournant ou à code fixe

Lorsque le code émis est identique au code attendu par le récepteur, alors le récepteur va traduire cette commande par l'activation d'un moteur, le dé-verrouillage d'une porte, ou l'ouverture d'une barrière. Les télécommandes à code fixe émettent systématiquement le même code fixe. Les télécommandes à code tournant (ou code hopping) émettent quant à elles un code qui sera toujours différent des précédents.

## KeeLoq

Le composant Microchip HCS301 est un des composants générateurs de codes tournants les plus répandus dans les systèmes de télécommandes de portes de garage et de verrouillage de voiture. Ce composant utilise l'algorithme KeeLoq, basé sur la transmission de 66 bits de données.

* 34 bits non encodés : un numéro de série sur 28 bits, information bouton sur 4 bits, et 2 bits de statut (indicateurs de répétition et de batterie déchargée).
* 32 bits encodés (constituant le code tournant) : 4 bits d'information bouton, 2 bits OVR (utilisés pour étendre la valeur du compteur), 10 bits DISC (valeur discriminée; souvent les 10 bits de poids faible du numéro de série), et un compteur de 16 bits.
* Lors d'une resynchronisation, les 32 bits encodés sont remplacés par une valeur 32 bits de réinitialisation.

## Vulnérabilité

Un code tournant transmis par signal radio peut être intercepté et devenir de ce fait vulnérable au piratage. En 2015, Samy Kamkar a apporté la preuve de cette vulnérabilité en mettant au point un montage électronique bon marché de la taille d'un porte-feuilles, qui peut être dissimulé dans ou près d'un véhicule verrouillé, afin de capturer un code de déverrouillage de ce véhicule. Le boitier de Kamkar transmet un signal brouillant la réception du signal à code tournant provenant de la télécommande du propriétaire du véhicule, tandis qu'il enregistre les signaux de ses deux tentatives de déverrouillage. Le premier code enregistré est transmis au véhicule seulement lorsque le propriétaire effectue sa seconde tentative, tandis que le second est mis de côté pour une tentative ultérieure. Kamkar soutient que cette vulnérabilité concernant de nombreux modèles de voitures était parfaitement connue depuis des années, mais n'avait jamais encore été démontrée. Une démonstration fut réalisée lors du DEF CON 23.

