2017-08-30 2 views
0

Récemment, j'essaie de concevoir un protocole personnalisé pour les appareils IoT avec Python Twisted. Comme la plupart des périphériques IoT (noeud final) ne sont pas assez puissants pour prendre en charge TLS, je dois implémenter une sécurité de transport légère et modifiée. Cependant, AES128/256 est utilisé pour le cryptage des données de la même manière que le TLS standrad.Dois-je implémenter le délimiteur de paquets avec un flux TCP chiffré AES?

Il est bien connu que TCP est un flux, et les messages remis peuvent nécessiter un délimiteur dans le flux TCP. Dans un message orienté texte comme HTTP/FTP, \ n \ r est utilisé. Dans un message binaire, nous devrions définir notre propre structure telle que TLV et V signifie données utiles. Cela peut être implémenté par Netty en Java, Twisted en Python.

Lorsque TCP est crypté, les choses deviennent compliquées. En théorie, le texte brut devrait être chiffré avec AES, puis transporté sur le flux TCP. C'est facile pour un message texte, mais dans un message binaire, les champs Type/Longueur sont également cryptés. De plus, AES est un algorithme orienté bloc, ce qui signifie qu'un message peut avoir besoin d'un message suivant pour être chiffré/décrypté. Bien que l'AES puisse être un transport transparent, il est difficile à implémenter pour le découpage et l'analyse de messages binaires. Il y a une autre façon, nous pouvons laisser les champs TL dans TLV comme simples, tout en gardant V crypté par AES. Mais cela ne fonctionne que pour les données binaires. et il a besoin de rembourrage dans AES aussi bien.

Y a-t-il des suggestions ou des références, y compris du code ou un projet? Merci!

Répondre

0

AES est un chiffrement par bloc, donc lisez les données en morceaux de la taille de bloc. Du côté de l'émetteur, votre code de cryptage AES devrait ajouter un remplissage si nécessaire, il devrait faire partie de l'implémentation AES. (Je vous recommande d'utiliser AES-CBC pour cette application). Sur l'émetteur, il suffit de lire les données en morceaux de la taille du bloc.

En java j'utiliserais un DataInputStream de mon socket, et fais un readFully().

Socket socket; 
DataInputStream ins = new DataInputStream(socket.getInputStream()); 

while(connectionOpen) { 
    byte[] aes = new Byte[blockSize]; 
    ins.readFully(aes); 
    //Decrypt received data aes 
    ... 
} 

Puisque vous utilisez readFully() ci-dessus, vous vous assurer de recevoir toujours des données de la bonne taille, à savoir la taille du bloc.

+0

Lire les données en multiples de la taille du bloc et seulement remplir le dernier bloc. – zaph

+0

Maintenant, j'ai compris. avec AES, les choses deviennent plus simples. Le récepteur vient de lire des blocs de taille de bloc (comme 16B/32B). Et la méthode de remplissage peut même aider le récepteur à délimiter les flux de paquets! –