Πίνακας περιεχομένων:

Ασφάλεια με Arduino: Atecc608a: 7 βήματα
Ασφάλεια με Arduino: Atecc608a: 7 βήματα

Βίντεο: Ασφάλεια με Arduino: Atecc608a: 7 βήματα

Βίντεο: Ασφάλεια με Arduino: Atecc608a: 7 βήματα
Βίντεο: #12 - Arduino project απο την αρχή, Μέρος 1ο 2024, Ιούλιος
Anonim
Ασφάλεια με Arduino: Atecc608a
Ασφάλεια με Arduino: Atecc608a
Ασφάλεια με Arduino: Atecc608a
Ασφάλεια με Arduino: Atecc608a

Θέμα

Γεια σε όλους !

Αυτό είναι το πρώτο μου άρθρο με οδηγίες, οπότε ελπίζω ότι θα είναι ενδιαφέρον για όλους εσάς.

Σε αυτό το άρθρο, θα σας εξηγήσω πώς να χρησιμοποιήσετε ένα μικροτσίπ που ονομάζεται "ATECC608A" που παρέχει πολλαπλά εργαλεία ασφαλείας.

Αυτό το τσιπ έχει σχεδιαστεί από τη MicroChip και είναι η τελευταία έκδοση του "chip CryptoAuthentication". Πριν από αυτήν την έκδοση, υπήρχε το "ATSHA204A" και το "ATECC508A".

Γιατί αποφάσισα να χρησιμοποιήσω την τελευταία έκδοση και όχι την προηγούμενη;

Αυτή η έκδοση είναι το πιο προηγμένο τσιπ και έχει λειτουργίες που δεν διαθέτει η παλιά έκδοση (Για παράδειγμα: μονάδα AES, μονάδα προστασίας IO…).

Γιατί αυτό το έργο;

Δουλεύω στον τομέα της CyberSecurity και σαν όλους μου άρεσε ο προγραμματισμός και τα ηλεκτρονικά. Κατά τη διάρκεια των σπουδών μου, παίρνω ένα συνέδριο με έναν ειδικό για το IoT Security, ο οποίος μας έδειξε ότι η Industrial δεν χρησιμοποιεί ασφάλεια στο αντικείμενο IoT. Μου έδειξα ένα λουκέτο που μπορεί να ανοίξει με το smartphone σας μέσω Bluetooth. Στο λουκέτο, μια πρόταση είπε "Αυτό το λουκέτο είναι πιο ασφαλές από ένα λουκέτο κλειδιού!". Αυτή η πρόταση τον κάνει να χαμογελάει και τροποποίησε την πρόταση "Αυτό το λουκέτο είναι το χειρότερο λουκέτο που κατασκευάστηκε ποτέ!".

Μας έδειξε με τον δικό του υπολογιστή και ένα sniffer Bluetooth ότι κάθε εντολή που στέλνεται από το smartphone είναι η ίδια κάθε φορά και είναι πολύ απλό να αντιγράψετε αυτήν την εντολή και να την στείλετε με το smartphone σας. Μας εξήγησε ότι το "Security" για το "Industrial" δεν είναι το κύριο πρόβλημα. Μας έδειξε μάρκες (λιγότερο από 0,60 $) που θα μπορούσαν να προσθέσουν ένα επίπεδο ασφάλειας σε αυτά τα αντικείμενα.

Μετά από αυτήν την επίδειξη, προσπάθησα να βρω κάποιο έργο ανοιχτού κώδικα που προσθέτει επίπεδο ασφαλείας σε αντικείμενο IoT, αλλά δεν το βρήκα ποτέ.

Έτσι αποφάσισα να εργαστώ σε ένα έργο που χρησιμοποιεί επίπεδο ασφαλείας για επικοινωνία μεταξύ δύο αντικειμένων IoT.

Ποια είναι η ιδέα μου;

Κατά τη διάρκεια μιας επικοινωνίας μεταξύ δύο αντικειμένων IoT, μπορεί να υπάρξουν πολλαπλές επιθέσεις: Man Of the mild, Αντιγραφή πληροφοριών και πολλά άλλα. Η ιδέα μου λοιπόν είναι πολύ απλή:

  1. Χρήση κρυπτογραφημένων δεδομένων μεταξύ δύο ή περισσότερων αντικειμένων IoT.
  2. Προμήθειες χαμηλού κόστους
  3. Μπορεί να συνεργαστεί με Arduino UNO

Τώρα θα σας εξηγήσω πώς υλοποίησα αυτήν την αφηρημένη εικόνα με ένα τσιπ Arduino και ένα Atecc608a. Σε αυτό το άρθρο, θα σας εξηγήσω πώς να χρησιμοποιήσετε το Arduino UNO με το ATECC608A.

Θα γράψω ένα άρθρο για την επικοινωνία δύο αντικειμένων την επόμενη φορά.

Προμήθειες

Χρειάζεστε μερικά πράγματα για αυτό το έργο:

  1. Arduino UNO ή MEGA (Το τσιπ πρέπει να είναι Atmega 328 ή ATMEGA 2560)
  2. Τσιπ Atecc608A (κόστος λιγότερο από 0,80 $ το καθένα, εύκολο να το βρείτε στον ιστότοπο του προμηθευτή σας)
  3. Προσαρμογέας SOIC 8 ακίδων
  4. Μερικά καλώδια και αντιστάσεις

Το φύλλο δεδομένων της προηγούμενης έκδοσης αυτού του τσιπ (Atecc508a) είναι διαθέσιμο εδώ -> Φύλλο δεδομένων Atecc508a

Βήμα 1: Βήμα προς βήμα

Βήμα βήμα
Βήμα βήμα

Σε αυτό το άρθρο, θα σας δείξω πώς να τροποποιήσετε τη διαμόρφωση αυτού του τσιπ και μετά πώς να κρυπτογραφήσετε δεδομένα χρησιμοποιώντας τον αλγόριθμο AES CBC.

Θα ακολουθήσουμε αυτά τα βήματα:

  1. Σχεδιασμός του κυκλώματος
  2. Διαμόρφωση αυτού του τσιπ
  3. Χρήση της ενότητας AES CBC
  4. Γιατί πρέπει να χρησιμοποιήσετε αυτό το τσιπ

Για κάθε βήμα, θα αναφέρω τα πάντα για εσάς. Επίσης, πρόσθεσα τον κωδικό μου στο Github μου με σχόλια για κάθε συνάρτηση. Εάν έχετε κάποιες ερωτήσεις σχετικά με τον κωδικό μου ή αυτό το έργο, θα χαρώ να σας απαντήσω.

My Github: Το Github μου

Βήμα 2: Προειδοποίηση για το Atecc608a

Προειδοποίηση για το Atecc608a
Προειδοποίηση για το Atecc608a

Το τσιπ Atecc608a δεν είναι ένα «εύκολο» τσιπ.

Πρώτον, η τεκμηρίωση αυτού του τσιπ βρίσκεται υπό NDA, οπότε δεν θα το βρείτε ολοκληρωμένο στο Διαδίκτυο. Αλλά δεν υπάρχει πρόβλημα για αυτό, το φύλλο δεδομένων της προηγούμενης έκδοσης είναι διαθέσιμο στο Internet Datasheet Complete ATECC508A.

Δεύτερον, όταν χρησιμοποιείτε αυτό το τσιπ πρέπει να κλειδώσετε τη διαμόρφωσή του και είναι αδύνατο να τροποποιήσετε τη διαμόρφωση του τσιπ εάν είναι κλειδωμένο. Προσέξτε λοιπόν πότε θα κλειδώσετε τη ζώνη διαμόρφωσης και τη ζώνη δεδομένων.

Τρίτον, η βιβλιοθήκη που γράφτηκε στο C είναι πολύ μεγάλη και πλήρης, οπότε πρέπει να διαβάσετε την τεκμηρίωση των λειτουργιών που θα χρησιμοποιήσετε πριν.

Τέσσερις, η βιβλιοθήκη έγραψε ότι αυτό το τσιπ δεν λειτουργεί για το Arduino UNO, αλλά πρόσθεσε ότι οι λειτουργίες του χρειάζονται για να συνεργαστεί με το Arduino UNO.

Το τσιπ ATECC608A

Μπορείτε να επικοινωνήσετε με αυτό το τσιπ μέσω I2C. Η διεύθυνση αυτού του τσιπ μπορεί να τροποποιηθεί στη διαμόρφωση.

Αυτό το τσιπ περιέχει 16 διαφορετικές υποδοχές που μπορούν να περιέχουν διαφορετικό τύπο δεδομένων:

  1. Κλειδί ECC (ιδιωτικό ή δημόσιο)
  2. Κλειδί AES
  3. Άλλα δεδομένα (όπως Sha hash ή απλά λέξεις)

Στην περίπτωσή μας, θα αποθηκεύσουμε το κλειδί AES σε μία υποδοχή.

Βήμα 3: 1. Desing of the Circuit

1. Desing of the Circuit
1. Desing of the Circuit
1. Desing of the Circuit
1. Desing of the Circuit

1. Σχεδιασμός του κυκλώματος

Το σχήμα αυτού του κυκλώματος είναι πολύ απλό!

Πρέπει να χρησιμοποιήσετε τροφοδοσία 3,3V επειδή η σύσταση είναι μεταξύ 2,0V και 5,5V, αλλά προτιμώ να χρησιμοποιήσω το 3,3V.

Για αυτό το τσιπ, κανονικά έχετε μια τελεία σε μια γωνία του τσιπ, αυτή η κουκκίδα είναι το Pin 1 αυτού του πίνακα. Πρόσθεσα την Κάτοψη του Atecc608a με αριθμό PIN επειδή είναι SOIC 8 μολύβδων οπότε το τσιπ είναι πολύ μικρό.

  1. ARDUINO 3.3V -> PIN 8 (Atecc608a)
  2. ARDUINO GND -> PIN 4 (Atecc608a)
  3. ARDUINO A4 (SDL) -> PIN 5 (Atecc608a)
  4. ARDUINO A5 (SCL) -> PIN 6 (Atecc608a)

Πρέπει να χρησιμοποιήσετε τροφοδοσία 3,3V επειδή η σύσταση είναι μεταξύ 2,0V και 5,5V, αλλά προτίμησα να χρησιμοποιήσω το 3,3V.

Πρόσθεσα την κάτοψη του Atecc608a επειδή είναι SOIC 8 μολύβδων οπότε το τσιπ είναι πολύ μικρό. Εάν προτιμάτε, ώστε οι προμηθευτές να κατασκευάσουν κάποιο χαρτόνι με τη συγκόλληση τσιπ, θα μπορούσε να είναι ευκολότερο για εσάς.

Προσοχή: Στην περίπτωσή μου, πρέπει να προσθέσω μια αντίσταση μεταξύ του SDA του Arduino και του Chip (επίσης για το SDL). Πρόσθεσα αντίσταση 4,7Kohm για το καθένα.

Βήμα 4: 2. Διαμόρφωση του τσιπ (Atecc608a)

Πριν χρησιμοποιήσετε τη λειτουργία κρυπτογράφησης ή αποκρυπτογράφησης, πρέπει να διαμορφώσετε το τσιπ. Σε αυτό το βήμα, θα αναφέρω λεπτομερώς κάθε βήμα που πρέπει να κάνετε για τη διαμόρφωση αυτού του τσιπ.

Προειδοποίηση: αυτό το βήμα είναι πολύ σημαντικό και αν κλειδώσετε τις ζώνες πριν από το τέλος, δεν μπορείτε να τις τροποποιήσετε.

Όπως εξηγήθηκε προηγουμένως, αυτό το τσιπ πήρε δύο ζώνες:

  1. Config Zone
  2. Ζώνη δεδομένων

Η διαμόρφωση Ζώνη έχει μέγεθος 128 byte, αλλά τα πρώτα 16 byte δεν μπορούν να τροποποιηθούν.

Για να διαμορφώσετε αυτό το τσιπ, χρειάζεστε δύο ακολουθήστε αυτά τα βήματα. Είναι πολύ σημαντικό να ακολουθήσετε κάθε βήμα με τη σειρά, διαφορετικά η διαμόρφωσή σας δεν θα λειτουργήσει και το τσιπ σας θα είναι κλειδωμένο και άχρηστο. Αυτά τα βήματα είναι:

  1. Δημιουργήστε ένα πρότυπο διαμόρφωσης
  2. Γράψτε αυτό το πρότυπο στο τσιπ
  3. Κλείδωμα της ζώνης διαμόρφωσης
  4. Γράψτε το κλειδί AES (128 Bits) σε μια υποδοχή
  5. Κλείδωμα της ζώνης δεδομένων

Πληροφορίες

Παρακάτω αναφέρω λεπτομερώς κάθε βήμα της διάπλασης με τον κωδικό μου, αλλά μην ανησυχείτε, πρόσθεσα ένα πλήρες παράδειγμα διαμόρφωσης στο Github μου. Βάζω σχόλια σε κάθε συνάρτηση και ένα αρχείο *.ino είναι διαθέσιμο σε κάθε βήμα για εσάς.

  • My Github: Το Github μου
  • Διαδρομή παραδείγματος Διαμόρφωση: configuration_example.ino

Πρώτο βήμα: Δημιουργήστε ένα πρότυπο διαμόρφωσης

Όπως εξηγήθηκε προηγουμένως, η ζώνη διαμόρφωσης έχει μέγεθος 128 bits, αλλά τα πρώτα 16 bits δεν μπορούν να αλλάξουν. Αυτή η ζώνη αποτελείται από πολλά μέρη, αλλά πρέπει να γνωρίζετε μόνο 3 μέρη αυτής της ζώνης διαμόρφωσης για αυτό το έργο:

  1. Τα Bytes 16 -> Αυτή είναι η διεύθυνση I2C του τσιπ
  2. Τα Bytes 20 έως 51 -> Μπορείτε να τροποποιήσετε εδώ τον τύπο υποδοχής για τις 16 υποδοχές αυτού του τσιπ
  3. Τα Bytes 96 έως 127 -> Μπορείτε να ορίσετε εδώ τον τύπο του κλειδιού ή των δεδομένων που χρησιμοποιούνται σε κάθε υποδοχή.

(Εάν χρειάζεστε περισσότερη επεξήγηση όλης αυτής της ζώνης, διαβάστε την τεκμηρίωση (σελίδα 13, ενότητα 2.2))

Εδώ, αναφέρω λεπτομερώς κάθε Bytes/Parts των 112 byte της διαμόρφωσης ενός Chip. Αυτό είναι ένα παράδειγμα, κάθε τσιπ που αγοράζεται μπορεί να έχει διαφορετική διαμόρφωση:

0xC0, // I2C διεύθυνση

0x00, 0x00, 0x00, 0x83, 0x20, // Slot Config Slot 1 0x85, 0x20, // Slot Config Slot 2 0x8F, 0x20, // Slot Config Slot 3 0xC4, 0x8F, // Slot Config Slot 4 0x8F, 0x8F, // Slot Config Slot 5 0x8F, 0x8F, // Slot Config Slot 6 0x9F, 0x8F, // Slot Config Slot 7 0x0F, 0x0F, // Slot Config Slot 8 0x8F, 0x0F, // Slot Config Slot 9 0x8F, 0x0F, // Slot Config Slot 10 0x8F, 0x0F, // Slot Config Slot 11 0x8F, 0x0F, // Slot Config Slot 12 0x8F, 0x0F, // Slot Config Slot 13 0x00, 0x00, // Slot Config Slot 14 0x00, 0x00, // Slot Config Slot 15 0xAF, 0x8F, // Slot Config Slot 16 0xFF, 0xFF, 0xFF, 0xFF, 0x00, 0x00, 0x00, 0x00, 0xFF, 0xFF, 0xFF, 0xFF, 0x00, 0x00, 0x00, 0x00 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xFF, 0xFF, 0x00, 0x00, 0x00, 0x00 0x00, 0x00, 0x33, 0x00, // Slot Config Slot 1 0x33, 0x00, // Slot Config Slot 2 0x33, 0x00, // Key Config Slot 3 0x1C, 0x00, // Key Config Slot 4 0x1C, 0x00, // Υποδοχή διαμόρφωσης κλειδιού 5 0x 1C, 0x00, // Slot Config Key 6 0x1C, 0x00, // Slot Config Slot 7 0x3C, 0x00, // Slot Config Slot 8 0x1A, 0x00, // Key Config Slot 9 0x3A, 0x00, // Key Config Slot 10 0x1A, 0x00, // Slot Config Slot 11 0x3A, 0x00, // Slot Config Slot 12 0x3A, 0x00, // Key Config Slot 13 0x3C, 0x00, // Key Config Slot 14 0x3C, 0x00, // Key Config Slot 15 0x1C, 0x00 // Υποδοχή διαμόρφωσης κλειδιού 16

Όπως φαίνεται, έβαλα ορισμένα σχόλια σε αυτόν τον κώδικα για να κατανοήσω περισσότερο αυτήν τη διαμόρφωση.

Στην περίπτωσή σας, πρέπει να καταλάβετε μόνο τρία πράγματα:

  1. Τα Bytes 16 -> Αυτή είναι η διεύθυνση I2C του τσιπ
  2. Τα Bytes 20 έως 51 -> Μπορείτε να τροποποιήσετε εδώ τον τύπο υποδοχής για τις 16 υποδοχές αυτού του τσιπ
  3. Το Byte 96 έως 127 -> Μπορείτε να ορίσετε εδώ τον τύπο του κλειδιού ή των δεδομένων που χρησιμοποιούνται σε κάθε υποδοχή.

Δεν θα εξηγήσω τον τύπο διαμόρφωσης και γιατί χρησιμοποίησα αυτό και όχι κάποιο άλλο, επειδή είναι περίπλοκο να εξηγήσω τα πάντα. Εάν χρειάζεστε περισσότερες πληροφορίες, μεταβείτε στην τεκμηρίωση, σελίδα 16 ενότητα 2.2.1 για το "SlotConfig" και σελίδα 19 ενότητα 2.2.5 για "KeyConfig"

Για αυτό το παράδειγμα, θα χρησιμοποιήσετε την υποδοχή 9 για να αποθηκεύσετε ένα κλειδί AES.

Για αυτό, πρέπει να βάλουμε (αν χρειαστεί, μπορείτε να αντιγράψετε το παραπάνω παράδειγμα, η τροποποίηση έχει γίνει σε αυτό):

  1. Byte 36 = 0x8F
  2. Byte 37 = 0x0F
  3. Byte 112 = 0x1A
  4. Byte 113 = 0x00

Γιατί έθεσα αυτήν τη διαμόρφωση: Για κάθε υποδοχή αυτού του τσιπ, μπορείτε να ορίσετε παραμέτρους που θα λένε στο τσιπ τι είδους δεδομένα θα αποθηκευτούν. Έχετε πολλές παραμέτρους:

  • Η υποδοχή μπορεί να γραφτεί ή να διαβαστεί (σαφής ή κρυπτογραφημένη ενέργεια)
  • Τύπος αποθηκευμένων δεδομένων (κλειδί ECC, δημόσιο κλειδί, SHA Hash, κλειδί AES…)
  • Η υποδοχή μπορεί να κλειδώνεται
  • Επιτρέπεται η δημιουργία κλειδιού

Με τα byte 36 και 37 ρυθμισμένα σε "0x0F8F":

  • Τα δεδομένα μπορούν να γραφτούν στο Clear
  • Τα περιεχόμενα αυτής της υποδοχής είναι μυστικά και δεν μπορούν να διαβαστούν
  • Η υποδοχή δεν μπορεί να χρησιμοποιηθεί για την εντολή Αντιγραφή CheckMac

Με τα byte 112 και 113 ρυθμισμένα σε "0x001A":

Η υποδοχή μπορεί να αποθηκεύσει έως και τέσσερα συμμετρικά κλειδιά AES 128-bit (KeyType = 0x6)

Δεύτερο βήμα: Γράψτε αυτήν τη διαμόρφωση

Αυτό το βήμα είναι πολύ σημαντικό γιατί θα ορίσουμε το τσιπ με τη διαμόρφωσή μας και αν αυτή η διαμόρφωση δεν είναι καλή, θα χρησιμοποιήσετε αυτό το τσιπ.

Αλλά μην ανησυχείτε, εφόσον η διαμόρφωση δεν είναι κλειδωμένη, μπορείτε να τροποποιήσετε τη διαμόρφωσή σας.

Εδώ, αυτός είναι ο κώδικας που χρησιμοποιήθηκε για τη σύνταξη της διαμόρφωσης στο τσιπ:

/** / brief Γράψτε μια νέα διαμόρφωση στο τσιπ.

* / param [in] cfg Διαμόρφωση λογικής διεπαφής. Ορισμένες προκαθορισμένες διαμορφώσεις * μπορούν να βρεθούν στο atca_cfgs.h * / param [in] config Array uint8_t της ρύθμισης παραμέτρων (μήκος 112) * / param [in] len Μέγεθος του πίνακα ρυθμίσεων * / επιστροφή ATCA_SUCCESS με επιτυχία, διαφορετικά κωδικός σφάλματος. */ ATCA_STATUS write_configuration (ATCAIfaceCfg *cfg, uint8_t *config, size_t len) {if (len! = 112) return ATCA_BAD_PARAM; Κατάσταση ATCA_STATUS. κατάσταση = atcab_init (cfg); if (status == ATCA_SUCCESS) {// Γράψτε τον πίνακα διαμόρφωσης στο τσιπ // Padding 16 byte (16 πρώτα byte δεν μπορούν να γραφτούν) status = atcab_write_bytes_zone (ATCA_ZONE_CONFIG, 0, 16, (uint8_t *) config, len); κατάσταση επιστροφής? } κατάσταση επιστροφής. }

Αυτή η συνάρτηση θα γράψει τη διαμόρφωσή σας στο τσιπ.

Τρίτο βήμα: κλείδωμα της ζώνης διαμόρφωσης

Προειδοποίηση: προσέξτε με αυτό το βήμα, εάν κλειδώσετε αυτήν τη Ζώνη και η διαμόρφωσή σας δεν είναι καλή, το τσιπ είναι άχρηστο και δεν μπορείτε να τροποποιήσετε αυτήν τη ζώνη

Για αυτήν την ενέργεια, θα χρησιμοποιήσουμε αυτήν τη συνάρτηση:

/** / σύντομος Ελέγξτε αν μια DATA_ZONE ή CONFIG_ZONE είναι κλειδωμένη

* / param [in] cfg Διαμόρφωση λογικής διεπαφής. Ορισμένες προκαθορισμένες διαμορφώσεις * μπορούν να βρεθούν στη διεύθυνση atca_cfgs.h * / param [στη] ζώνη LOCK_ZONE_DATA ή LOCK_ZONE_CONFIG * / να επιστρέψουν ATCA_SUCCESS με επιτυχία, διαφορετικά ένας κωδικός σφάλματος. */ ATCA_STATUS check_lock_zone (ATCAIfaceCfg *cfg, uint8_t zone) {κατάσταση ATCA_STATUS; bool lock = false? εάν (ζώνη! = (uint8_t) LOCK_ZONE_CONFIG && ζώνη! = (uint8_t) LOCK_ZONE_DATA) επιστροφή ATCA_BAD_PARAM; κατάσταση = atcab_init (cfg); εάν (κατάσταση == ATCA_SUCCESS) {εάν (ATCA_SUCCESS! = (κατάσταση = atcab_is_locked (ζώνη, & κλείδωμα))) {επιστροφή ATCA_FUNC_FAIL; } if (! lock) {return ATCA_NOT_LOCKED; } επιστροφή ATCA_SUCCESS; } επιστροφή ATCA_BAD_PARAM; } check_lock_zone (& cfg, LOCK_ZONE_CONFIG);

Τέταρτο βήμα: Γράψτε το κλειδί AES σε μια υποδοχή

Σε αυτό το μέρος θα ορίσετε το προσωπικό σας κλειδί AES στην υποδοχή που έχετε ορίσει στη διαμόρφωση του τσιπ.

Για αυτό το παράδειγμα, θα χρησιμοποιήσω την υποδοχή με αριθμό 9 του τσιπ.

Πρέπει να γνωρίζετε: Ένα ειδικό χαρακτηριστικό αυτού του τσιπ είναι ότι μπορείτε να γράψετε δεδομένα στην υποδοχή μόνο κατά 4 byte ή 32 byte. Για το AES χρειαζόμαστε 128 bit κλειδί, έτσι 16 byte δεδομένων. Έτσι αποφάσισα να γράψω σε κλειδί 16 bytes το καθένα σε αυτήν την υποδοχή για να έχει 32 bytes δεδομένα.

Τώρα, θα σας δείξω τον κωδικό που χρησιμοποιήσατε:

/** / brief Γράψτε το κλειδί AES σε μια δεδομένη υποδοχή. * / param [in] cfg Διαμόρφωση λογικής διεπαφής. Ορισμένες προκαθορισμένες διαμορφώσεις * μπορούν να βρεθούν στο atca_cfgs.h * / param [in] αριθμός κλειδιού κλειδιού * / param [in] datakey key array uint8_t * / param [in] len Μέγεθος του πίνακα πλήκτρων * / επιστροφή ATCA_SUCCESS στην επιτυχία, αλλιώς κωδικός σφάλματος. */ ATCA_STATUS write_key_slot (ATCAIfaceCfg *cfg, uint8_t key, uint8_t *datakey, size_t len) {if (key 16) return ATCA_BAD_PARAM; εάν (len! = 32) επιστρέψτε ATCA_BAD_PARAM; Κατάσταση ATCA_STATUS = atcab_init (cfg); if (status == ATCA_SUCCESS) {status = atcab_write_zone (ATCA_ZONE_DATA, (uint16_t) key, 0, 0, datakey, 32); εάν (κατάσταση! = ATCA_SUCCESS) επιστροφή κατάστασης. } κατάσταση επιστροφής. }

Για αυτό το παράδειγμα, θα χρησιμοποιήσω δύο κλειδιά AES των 16 bytes το καθένα:

// Παράδειγμα του κλειδιού AES (len 32) uint8_t example_of_key [32] = "AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA"; write_key_slot (& cfg, 9, example_of_key, sizeof (example_of_key));

Εάν αυτή η ενέργεια είναι καλή, τώρα, πρέπει να περάσετε το τελευταίο βήμα "κλείδωμα της ζώνης δεδομένων"

Τελευταίο βήμα: κλείδωμα της ζώνης δεδομένων

Προειδοποίηση: προσέξτε με αυτό το βήμα, εάν κλειδώσετε αυτήν τη Ζώνη και τα δεδομένα σας δεν είναι ρυθμισμένα, το τσιπ είναι άχρηστο και δεν μπορείτε να τροποποιήσετε αυτήν τη ζώνη

Για αυτήν την ενέργεια, θα χρησιμοποιήσουμε αυτήν τη συνάρτηση:

/** / σύντομος Ελέγξτε αν μια DATA_ZONE ή CONFIG_ZONE είναι κλειδωμένη

* / param [in] cfg Διαμόρφωση λογικής διεπαφής. Ορισμένες προκαθορισμένες διαμορφώσεις * μπορούν να βρεθούν στη διεύθυνση atca_cfgs.h * / param [στη] ζώνη LOCK_ZONE_DATA ή LOCK_ZONE_CONFIG * / να επιστρέψουν την ATCA_SUCCESS με επιτυχία, διαφορετικά ένας κωδικός σφάλματος. */ ATCA_STATUS check_lock_zone (ATCAIfaceCfg *cfg, uint8_t zone) {κατάσταση ATCA_STATUS; bool lock = false? εάν (ζώνη! = (uint8_t) LOCK_ZONE_CONFIG && ζώνη! = (uint8_t) LOCK_ZONE_DATA) επιστροφή ATCA_BAD_PARAM; κατάσταση = atcab_init (cfg); εάν (κατάσταση == ATCA_SUCCESS) {αν (ATCA_SUCCESS! = (κατάσταση = atcab_is_locked (ζώνη, & κλείδωμα))) {επιστροφή ATCA_FUNC_FAIL; } if (! lock) {return ATCA_NOT_LOCKED; } επιστροφή ATCA_SUCCESS; } επιστροφή ATCA_BAD_PARAM; } check_lock_zone (& cfg, LOCK_ZONE_DATA);

Εάν αυτή η ενέργεια είναι καλή, το τσιπ σας είναι έτοιμο για χρήση

Βήμα 5: 3. Αξιοποίηση της ενότητας AES CBC

3. Χρήση της μονάδας AES CBC
3. Χρήση της μονάδας AES CBC

Θα εξηγήσω τον τρόπο κρυπτογράφησης και αποκρυπτογράφησης δεδομένων με τον αλγόριθμο AES CBC και το τσιπ Atecc608a.

Θυμηθείτε: Πριν χρησιμοποιήσετε αυτήν τη λειτουργία, πρέπει να ρυθμίσετε το τσιπ. Για αυτό, ακολουθήστε το βήμα 2 αυτού του άρθρου

Αυτό το τσιπ πήρε πολλαπλό τύπο μονάδας AES (AES 128 bits), μόνο AES 128 bit είναι δυνατό:

  1. AES φυσιολογικό
  2. AES CBC
  3. AES GCM (με κατακερματισμό GFM) (δείτε τη wikipedia για περισσότερες επεξηγήσεις)

Για ευκολότερη χρήση, δημιούργησα δύο λειτουργίες:

  1. aes_cbc_encrypt
  2. aes_cbc_decrypt

Αυτές οι δύο λειτουργίες είναι διαθέσιμες στο Github μου.

Εξήγηση

Επιλέγω να χρησιμοποιήσω τον αλγόριθμο AES CBC επειδή είναι ασφαλέστερος από τα βασικά AES 128 bit. Αυτός ο αλγόριθμος χρησιμοποιεί ένα αρχικό διάνυσμα για την κρυπτογράφηση των δεδομένων σας.

Πληροφορίες

Παρακάτω περιγράφω λεπτομερώς κάθε βήμα της μεθόδου κρυπτογράφησης και αποκρυπτογράφησης. Έγραψα όμως έναν κωδικό για το Arduino που χρησιμοποιεί και τις δύο αυτές λειτουργίες. Μπορείτε να δείτε αυτόν τον κώδικα στο Github μου:

  • Github: Το Github μου
  • Παράδειγμα κώδικα "Κρυπτογράφηση/Αποκρυπτογράφηση": AES_crypto_example.ino

Πρώτο βήμα: Κρυπτογράφηση των δεδομένων σας

Σε αυτό το μέρος, θα σας δείξω πώς να κρυπτογραφείτε τα δεδομένα σας.

Πρώτα θα χρειαστείτε αυτήν τη λειτουργία:

/** / short Κρυπτογράφηση δεδομένων χρησιμοποιώντας αλγόριθμο AES CBC* / param [in] cfg Διαμόρφωση λογικής διεπαφής. Ορισμένες προκαθορισμένες διαμορφώσεις * μπορούν να βρεθούν στα δεδομένα atca_cfgs.h * / param [σε] δεδομένα Λέξεις προς κρυπτογράφηση (πρέπει να διαιρούνται με 16, μέγιστο μήκος 240) * / param [σε] μήκος λέξεων προς κωδικοποίηση (πρέπει να διαιρούνται με 16, μέγιστο μήκος 240) * / param [out] iv Αρχικό διάνυσμα που χρησιμοποιείται στο AES CBC (επιστρέψτε το διάνυσμα σε αυτό το var) * / param [out] κρυπτογραφημένο κείμενο επιστρέψτε εδώ το κείμενο Cypher * / param [in] κλειδί Αριθμός υποδοχής του κλειδί * / επιστροφή ATCA_SUCCESS για επιτυχία, διαφορετικά ένας κωδικός σφάλματος. */ ATCA_STATUS aes_cbc_encrypt (ATCAIfaceCfg *cfg, uint8_t *data, int len, uint8_t *iv, uint8_t *ciphertext, uint8_t key) {atca_aes_cbc_ctx_t ctx; εάν (len> LIMIT_DATA_SIZE_CBC && len % 16! = 0) {Serial.print (F ("ERROR: ATCA_BAD_PARAM")); επιστροφή ATCA_BAD_PARAM? } uint8_t tmp_iv [IV_LENGTH_CBC]; uint8_t tmp_data [len]; Κατάσταση ATCA_STATUS = atcab_init (cfg); εάν (κατάσταση == ATCA_SUCCESS) {status = atcab_aes_cbc_init (& ctx, κλειδί, 0, tmp_iv); εάν (κατάσταση! = ATCA_SUCCESS) {Serial.print (F ("ERROR Encrypt: atcab_aes_cbc_init, Code Error 0x")); Serial.println (κατάσταση, HEX); ΕΠΙΣΤΡΟΦΗ; } memcpy (iv, tmp_iv, IV_LENGTH_CBC); memcpy (tmp_data, data, len); int max = len / 16; για (int j = 0; j <max; j ++) {status = atcab_aes_cbc_encrypt_block (& ctx, & tmp_data [j * 16], & ciphertext [j * 16]); } if (κατάσταση! = ATCA_SUCCESS) {Serial.print (F ("ERROR Encrypt: atcab_aes_cbc_encrypt_block, Code Error 0x")); Serial.println (κατάσταση, HEX); } κατάσταση επιστροφής. } κατάσταση επιστροφής. }

Αυτή η λειτουργία είναι απλή στη χρήση, πρέπει να ορίσετε δύο πράγματα:

  1. Ένα κενό IV (αρχικό διάνυσμα) 16 Bytes
  2. Δεδομένα για κρυπτογράφηση (μέγιστο μέγεθος 240 Bytes)

Εδώ είναι ένα παράδειγμα "πώς να χρησιμοποιήσετε αυτήν τη λειτουργία".

Θέλω να κρυπτογραφήσω τη λέξη "AAAAAAAAAAAAAA", με το κλειδί μου γραμμένο στον αριθμό υποδοχής "9":

Κατάσταση ATCA_STATUS = atcab_init (& cfg); εάν (κατάσταση! = ATCA_SUCCESS) {Serial.println (F ("atcab_init () failed: Code -> 0x")); Serial.println (κατάσταση, HEX); } uint8_t plaintext [16] = "AAAAAAAAAAAAAAA"; // Αρχικό κείμενο uint8_t iv [IV_LENGTH_CBC], // Αρχικό διάνυσμα uint8_t cypherdata [sizeof (plaintext)]; // Κρυπτογραφημένη κατάσταση δεδομένων = aes_cbc_encrypt (& cfg, plaintext, sizeof (plaintext), iv, cypherdata, 9);

Εάν η ενέργεια είναι καλή, θα έχετε τα κρυπτογραφημένα δεδομένα στη μεταβλητή "cypherdata" και το αρχικό διάνυσμα στη μεταβλητή "IV".

Κρατήστε αυτές τις δύο μεταβλητές για να αποκρυπτογραφήσετε το κείμενό σας!

Δεύτερο βήμα: αποκρυπτογράφηση των δεδομένων σας

Για να αποκρυπτογραφήσετε τα δεδομένα σας θα χρειαστείτε δύο πράγματα:

  1. Το αρχικό διάνυσμα
  2. Τα δεδομένα Cypher (κρυπτογραφημένα δεδομένα)

Για να αποκρυπτογραφήσετε τα δεδομένα σας, θα χρειαστείτε αυτήν τη λειτουργία:

/** / σύντομη αποκρυπτογράφηση δεδομένων χρησιμοποιώντας αλγόριθμο AES CBC* / param [in] cfg Διαμόρφωση λογικής διεπαφής. Ορισμένες προκαθορισμένες διαμορφώσεις * μπορούν να βρεθούν στο atca_cfgs.h * / param [σε] κρυπτογραφημένες λέξεις για αποκρυπτογράφηση (πρέπει να διαιρεθεί με 16, μέγιστο μήκος 240) * / param [σε] μήκος λέξεων προς αποκρυπτογράφηση (πρέπει να διαιρεθεί με 16, μέγιστο μήκος 240) * / param [in] iv Initial Vector to use in the AES CBC * / param [out] plaintext επιστρέψτε εδώ το κρυπτογραφημένο κείμενο * / param [in] αριθμός υποδοχής του κλειδιού * / επιστρέψτε ATCA_SUCCESS στην επιτυχία, διαφορετικά ένας κωδικός σφάλματος. */ ATCA_STATUS aes_cbc_decrypt (ATCAIfaceCfg *cfg, uint8_t *ciphertext, int len, uint8_t *iv, uint8_t *plaintext, uint8_t key) {atca_aes_cbc_ctx_t ctx; εάν (len> LIMIT_DATA_SIZE_CBC || len % 16! = 0) {Serial.print (F ("ERROR Decrypt: ATCA_BAD_PARAM")); επιστροφή ATCA_BAD_PARAM? } Κατάσταση ATCA_STATUS = atcab_init (cfg); εάν (κατάσταση == ATCA_SUCCESS) {status = atcab_aes_cbc_init (& ctx, κλειδί, 0, iv); εάν (κατάσταση! = ATCA_SUCCESS) {Serial.print (F ("ERROR Decrypt: atcab_aes_cbc_init, Code Error 0x")); Serial.println (κατάσταση, HEX); ΕΠΙΣΤΡΟΦΗ; } int max = len / 16; για (int j = 0; j <max; j ++) {status = atcab_aes_cbc_decrypt_block (& ctx, & ciphertext [j * 16], & plaintext [j * 16]); } if (κατάσταση! = ATCA_SUCCESS) {Serial.print (F ("ERROR Decrypt: atcab_aes_cbc_encrypt_block, Code Error 0x")); Serial.println (κατάσταση, HEX); } κατάσταση επιστροφής. } κατάσταση επιστροφής. }

Θέλω να αποκρυπτογραφήσω τα προηγούμενα δεδομένα μου (δείτε παρακάτω, Πρώτο βήμα). Για αυτό θα κάνω αυτό:

uint8_t plaintext [16] = "AAAAAAAAAAAAAAA"; uint8_t iv [IV_LENGTH_CBC]; uint8_t cypherdata [sizeof (plaintext)]; uint8_t αποκρυπτογράφηση δεδομένων [sizeof (απλό κείμενο)]; κατάσταση = aes_cbc_decrypt (& cfg, cypherdata, sizeof (cypherdata), iv, decryptdata, 9); if (status == ATCA_SUCCESS) {Serial.print ("Το κρυπτογραφημένο κείμενο είναι:"); για (size_t i = 0; i <sizeof (decryptdata); i ++) {Serial.print ((char) decryptdata ); } Serial.println (""); } else {// Δείτε το αρχείο atca_status.h για τον κωδικό Error Serial.print (F ("Impossible do the decryption | Code Error 0x")); Serial.println (κατάσταση, HEX); ΕΠΙΣΤΡΟΦΗ; }

Εάν η ενέργεια είναι καλή, θα έχετε τα αποκρυπτογραφημένα δεδομένα στη μεταβλητή "αποκρυπτογραφημένα".

Τώρα ξέρετε πώς να χρησιμοποιείτε κρυπτογράφηση και αποκρυπτογράφηση με το τσιπ Atecc608a

Βήμα 6: 5. Γιατί πρέπει να χρησιμοποιήσετε αυτό το τσιπ

Τα κρυπτογραφημένα δεδομένα είναι πολύ χρήσιμα επειδή μπορείτε να αποκρύψετε τις πληροφορίες σας και να τις στείλετε μέσω Wireless ή απλά να τις αποθηκεύσετε.

Ακολουθεί ένα παράδειγμα χρήσης:

  1. Αποθηκευμένα δεδομένα σε εξωτερικό EEPROM: Μπορείτε να εξασφαλίσετε δεδομένα εξωτερικής EEPROM και εάν κάποιος εξακολουθεί να είναι αυτό το EEPROM, θα χρειαστεί το κλειδί και το IV για την αποκρυπτογράφηση
  2. Αποστολή ασύρματων δεδομένων: Μπορείτε να στείλετε αυτά τα κρυπτογραφημένα δεδομένα μέσω Wireless (nrf24L01, RFM95W…) και αν κάποιος υποκλέψει τα δεδομένα σας, αυτά τα δεδομένα θα είναι ασφαλή
  3. Αποθηκευμένος κωδικός πρόσβασης

Μπορείτε να κάνετε πολλά πράγματα με αυτό το τσιπ. Μπορεί να χρησιμοποιηθεί σε πολλαπλά έργα. Αν έχετε χρόνο, πείτε μου σε ποιο έργο θα χρησιμοποιήσετε αυτό το τσιπ;

Μια τελευταία συμβουλή, αν φτιάξετε κάποιο ασύρματο έργο ή αποθηκεύσετε κάποια ακατέργαστα δεδομένα, να είστε προσεκτικοί, η ασφάλεια είναι πολύ σημαντική και αν γνωρίζετε πώς είναι απλό για ένα "noob" να υποκλέψει ή να κλέψει τα δεδομένα σας. Τώρα με το Διαδίκτυο, ο καθένας μπορεί να έχει σενάρια για εκκίνηση στον υπολογιστή του μόνο και μόνο για να σας "χακάρει"!

Βήμα 7: Συμπέρασμα

Ελπίζω ότι αυτό το άρθρο θα είναι χρήσιμο για εσάς. Συγγνώμη αν έκανα λάθος στο κείμενό μου, αλλά τα αγγλικά δεν είναι η κύρια γλώσσα μου και μιλάω καλύτερα από ό, τι γράφω.

Ευχαριστώ που διαβάσατε τα πάντα.

Απόλαυσέ το.

Συνιστάται: