Mündəricat:

Arduino ilə Təhlükəsizlik: Atecc608a: 7 addım
Arduino ilə Təhlükəsizlik: Atecc608a: 7 addım

Video: Arduino ilə Təhlükəsizlik: Atecc608a: 7 addım

Video: Arduino ilə Təhlükəsizlik: Atecc608a: 7 addım
Video: Arduino. İşıqfor 2024, Iyul
Anonim
Arduino ilə Təhlükəsizlik: Atecc608a
Arduino ilə Təhlükəsizlik: Atecc608a
Arduino ilə Təhlükəsizlik: Atecc608a
Arduino ilə Təhlükəsizlik: Atecc608a

Mövzu

Hamıya salam !

Bu mənim ilk göstərişli məqaləmdir, buna görə hamınız üçün maraqlı olacağını ümid edirəm.

Bu yazıda sizə birdən çox təhlükəsizlik vasitəsi verən "ATECC608A" adlı mikro çipdən necə istifadə edəcəyinizi izah edəcəyəm.

Bu çip MicroChip tərəfindən hazırlanmışdır və "CryptoAuthentication chip" in son versiyasıdır. Bu versiyadan əvvəl "ATSHA204A" və "ATECC508A" var idi.

Niyə əvvəlki versiyanı deyil, son versiyanı istifadə etməyə qərar verdim?

Bu versiya ən inkişaf etmiş çipdir və köhnə versiyada olmayan funksiyalara malikdir (Məsələn: AES modulu, IO qoruma modulu …).

Niyə bu layihə?

CyberSecurity sahəsində işləyirəm və proqramlaşdırma və elektronikanı sevdiyim hər kəs kimi. Təhsil aldığım müddətdə, IoT Təhlükəsizliyi üzrə bir mütəxəssislə bir konfrans keçirirəm ki, bu da Sənaye şirkətinin IoT obyektində Təhlükəsizlikdən istifadə etmədiyini göstərdi. Bizə Bluetooth vasitəsilə smartfonunuzla açıla bilən bir kilid göstərdim. Asma kiliddə bir cümlə "Bu asma kilid açar asma kiliddən daha etibarlıdır!" Deyildi. Bu cümlə onu güldürür və "Bu asma kilid indiyə qədər tikilmiş ən pis asma kiliddir!" Cümləsini dəyişdirdi.

Öz şəxsi kompüteri və Bluetooth sniffer ilə bizə göstərdi ki, smartfon tərəfindən göndərilən hər əmr hər dəfə eynidir və bu əmri kopyalayıb smartfonunuzla göndərmək çox sadədir. Bizə "Sənaye" üçün "Təhlükəsizlik" in əsas problem olmadığını izah etdi. Bizə bu obyektlərə bir təhlükəsizlik təbəqəsi əlavə edə biləcək çipləri (0.60 dollardan aşağı) göstərdi.

Bu nümayişdən sonra IoT obyektinə təhlükəsizlik qatı əlavə edən bəzi açıq mənbə layihələri tapmağa çalışdım, amma heç tapa bilmədim.

Beləliklə, iki IoT obyekti arasında əlaqə üçün təhlükəsizlik qatından istifadə edən bir layihə üzərində işləmək qərarına gəldim.

Mənim fikrim nədir?

İki IoT Obyekti arasında ünsiyyət əsnasında birdən çox hücum ola bilər: Yüngül adam, Məlumatın surəti və daha çox.. Deməli fikrim çox sadədir:

  1. İki və ya daha çox IoT obyekti arasında şifrələnmiş məlumatların istifadəsi.
  2. Aşağı qiymətli təchizatlar
  3. Bir Arduino UNO ilə işləyə bilər

İndi bu mücərrəd şəkli bir Arduino və Atecc608a çipi ilə necə tətbiq etdiyimi izah edəcəyəm. Bu yazıda, Arduino UNO -nu ATECC608A ilə necə istifadə edəcəyinizi izah edəcəyəm.

Növbəti dəfə iki obyektin əlaqəsi haqqında bir məqalə yazacağam.

Təchizat

Bu layihə üçün bir neçə şeyə ehtiyacınız var:

  1. Arduino UNO və ya MEGA (Çip Atmega 328 və ya ATMEGA 2560 olmalıdır)
  2. Atecc608A çipi (hər birinin qiyməti 0.80 dollardan aşağıdır, təchizatçı veb saytınızda tapmaq asandır)
  3. 8 pinli SOIC adapteri
  4. Bəzi tellər və rezistorlar

Bu çipin əvvəlki versiyasının (Atecc508a) məlumat cədvəli burada mövcuddur -> Datasheet Atecc508a

Addım 1: Addım -addım

Addım addım
Addım addım

Bu yazıda, bu çipin konfiqurasiyasını necə dəyişdirəcəyinizi və AES CBC Alqoritmini istifadə edərək məlumatları necə şifrələyəcəyinizi sizə göstərəcəyəm.

Bu addımları izləyəcəyik:

  1. Dövrün dizaynı
  2. Bu çipin konfiqurasiyası
  3. AES CBC modulunun istifadəsi
  4. Niyə bu çipdən istifadə etməlisiniz?

Hər bir addım üçün sizin üçün hər şeyi ətraflı izah edəcəyəm. Ayrıca kodumu Github -a hər funksiya üçün şərhlər əlavə etdim. Kodum və ya bu layihə ilə bağlı bəzi suallarınız varsa, məmnuniyyətlə cavablandıracağam.

Github'ım: Github'ım

Addım 2: Atecc608a haqqında xəbərdarlıq

Atecc608a haqqında xəbərdarlıq
Atecc608a haqqında xəbərdarlıq

Atecc608a çipi "asan" bir çip deyil.

Birincisi, bu çipin sənədləri NDA altındadır, buna görə İnternetdə tam tapa bilməzsiniz. Ancaq bunun üçün heç bir problem yoxdur, əvvəlki versiyanın məlumat cədvəli İnternet Datasheet Complete ATECC508A -da mövcuddur.

İkincisi, bu çipdən istifadə edərkən konfiqurasiyasını kilidləməlisiniz və çip kilidlənərsə konfiqurasiyasını dəyişdirmək mümkün deyil. Konfiqurasiya Zonasını və Məlumat Zonasını bağlayanda diqqətli olun.

Üçüncüsü, C dilində yazılmış kitabxana çox böyük və tamdır, buna görə də əvvəl istifadə edəcəyiniz funksiyaların sənədlərini oxumalısınız.

Dördüncüsü, kitabxana bu çip üçün Arduino UNO üçün işləmədiyini yazdı, ancaq Arduino UNO ilə işləmək üçün lazım olan funksiyaları əlavə etdi.

ATECC608A çipi

Bu çiplə I2C ilə əlaqə qura bilərsiniz. Bu çipin ünvanı konfiqurasiyada dəyişdirilə bilər.

Bu çip, fərqli növ məlumatları ehtiva edə biləcək 16 fərqli yuvadan ibarətdir:

  1. ECC Açarı (şəxsi və ya ümumi)
  2. AES açarı
  3. Digər məlumatlar (Sha hash və ya sadəcə sözlər kimi)

Bizim vəziyyətimizdə AES Açarını bir yuvada saxlayacağıq.

Addım 3: 1. Dövrün dizaynı

1. Dövrün dizaynı
1. Dövrün dizaynı
1. Dövrün dizaynı
1. Dövrün dizaynı

1. Dövrün dizaynı

Bu dövrənin sxemi çox sadədir!

Tövsiyə 2.0V ilə 5.5V arasındadır, amma 3.3V istifadə etməyi üstün tutduğum üçün 3.3V güc istifadə etməlisiniz.

Bu çip üçün, ümumiyyətlə çipin bir küncündə bir nöqtə var, bu nöqtə bu lövhənin Pin 1 -dir. Atecc608a-nın üst görünüşünü PIN nömrəsi ilə əlavə etdim, çünki 8 qurğulu SOIC olduğundan çip çox kiçikdir.

  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)

Tövsiyə 2.0V ilə 5.5V arasındadır, amma 3.3V istifadə etməyi üstün tutduğum üçün 3.3V güc istifadə etməlisiniz.

Atecc608a-nın Üst Görünüşünü əlavə etdim, çünki 8 qurğulu SOIC olduğundan çip çox kiçikdir. İstəyirsinizsə, təchizatçılar çip lehimlə bir lövhə qursalar, sizin üçün daha asan ola bilər.

Xəbərdarlıq: Mənim vəziyyətimdə, Arduino və Çipin SDA arasına bir rezistor əlavə etməliyəm (həm də SDL üçün). Hər biri üçün 4.7Kohm rezistor əlavə etdim.

Addım 4: 2. Çipin Konfiqurasiyası (Atecc608a)

Şifrələmə və ya deşifr etmə funksiyasından istifadə etməzdən əvvəl çipi konfiqurasiya etməlisiniz. Bu addımda, bu çipin konfiqurasiyası üçün etməli olduğunuz hər addımı ətraflı şəkildə izah edəcəyəm.

Xəbərdarlıq: bu addım çox önəmlidir və zonaları sona qədər kilidləsəniz, onları dəyişdirə bilməzsiniz.

Daha əvvəl izah edildiyi kimi, bu çip iki zonaya malikdir:

  1. Konfiqurasiya Zonası
  2. Məlumat Bölgəsi

Konfiqurasiya Zonasının ölçüsü 128 baytdır, lakin ilk 16 bayt dəyişdirilə bilməz.

Bu çipi konfiqurasiya etmək üçün bu addımı izləyən iki nəfərə ehtiyacınız var. Hər bir addımı ardıcıllıqla izləmək çox vacibdir, yoxsa konfiqurasiyanız işləməyəcək və çipiniz kilidlənəcək və istifadəyə yararsız olacaq. Bu addımlar:

  1. Bir konfiqurasiya şablonu yaradın
  2. Bu şablonu çipə yazın
  3. Konfiqurasiya Zonasını kilidləyin
  4. AES Açarınızı (128 Bit) bir yuvaya yazın
  5. Məlumat Zonasını kilidləyin

Məlumat

Aşağıda konfiqurasiyanın hər bir addımını kodumla izah edirəm, amma heç bir narahatçılığım yoxdur, Github -da konfiqurasiyanın tam nümunəsini əlavə etdim. Hər bir funksiyaya şərh yazıram və sizin üçün hər addımda *.ino faylı mövcuddur.

  • Github'ım: Github'ım
  • Nümunə Konfiqurasiya Yolu: configuration_example.ino

İlk addım: Bir konfiqurasiya şablonu yaradın

Daha əvvəl izah edildiyi kimi, konfiqurasiya zonası 128 bit ölçüsü alır, lakin ilk 16 bit dəyişdirilə bilməz. Bu zona bir neçə hissədən ibarətdir, ancaq bu layihə üçün bu konfiqurasiya zonasının yalnız 3 hissəsini bilməlisiniz:

  1. Bytes 16 -> Bu çipin I2C ünvanıdır
  2. Bayt 20 -dən 51 -ə qədər -> Bu çipin 16 yuvası üçün yuva tipini burada dəyişə bilərsiniz
  3. Bayt 96 -127 -> Burada hər bir yuvada istifadə olunan açar və ya məlumat növünü təyin edə bilərsiniz.

(Bütün bu zonanın daha çox izahına ehtiyacınız varsa, sənədləri oxuyun (səhifə 13, bölmə 2.2))

Burada, bir Çip konfiqurasiyasının 112 baytının hər baytını/hissəsini ətraflı şəkildə yazdım. Bu bir nümunədir, satın alınan hər bir çip fərqli bir konfiqurasiyaya sahib ola bilər:

0xC0, // I2C ünvanı

0x00, 0x00, 0x00, 0x83, 0x20, // Slot Yapılandırma Yuvası 1 0x85, 0x20, // Slot Konfiqurasiya Yuvası 2 0x8F, 0x20, // Yuva Konfiqurasiya Yuvası 3 0xC4, 0x8F, // Yuva Konfiqurasiya Yuvası 4 0x8F, 0x8F, // Slot Konfiqurasiya Yuvası 5 0x8F, 0x8F, // Yuva Konfiqurasiya Yuvası 6 0x9F, 0x8F, // Slot Konfiqurasiya Yuvası 7 0x0F, 0x0F, // Yuva Konfiqurasiya Yuvası 8 0x8F, 0x0F, // Yuva Konfiqurasiya Yuvası 9 0x8F, 0x0F, // Slot Konfiqurasiya Yuvası 10 0x8F, 0x0F, // Slot Konfiqurasiya Yuvası 11 0x8F, 0x0F, // Slot Konfiqurasiya Yuvası 12 0x8F, 0x0F, // Yuva Konfiqurasiya Yuvası 13 0x00, 0x00, // Yuva Konfiqurasiya Yuvası 14 0x00, 0x00, // Slot Yapılandırma Yuvası 15 0xAF, 0x8F, // Yuva Konfiqurasiya Yuvası 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, 0x00, 0x00, 0xFF, 0xFF, 0x00, 0x00, 0x00, 0x00 0x00, 0x00, 0x33, 0x00, // Key Config Slot 1 0x33, 0x00, // Key Config Slot 2 0x33, 0x00, // Key Config Slot 3 0x1C, 0x00, // Key Config Slot 4 0x1C, 0x00, // Açar Konfiqurasiya Yuvası 5 0x 1C, 0x00, // Açar Konfiqurasiya Yuvası 6 0x1C, 0x00, // Açar Konfiqurasiya Yuvası 7 0x3C, 0x00, // Açar Konfiqurasiya Yuvası 8 0x1A, 0x00, // Açar Konfiqurasiya Yuvası 9 0x3A, 0x00, // Açar Konfiqurasiya Yuvası 10 0x1A, 0x00, // Açar Konfiqurasiya Yuvası 11 0x3A, 0x00, // Açar Konfiqurasiya Yuvası 12 0x3A, 0x00, // Açar Konfiqurasiya Yuvası 13 0x3C, 0x00, // Açar Konfiqurasiya Yuvası 14 0x3C, 0x00, // Açar Konfiqurasiya Yuvası 15 0x1C, 0x00 // Açar Konfiqurasiya Yuvası 16

Göründüyü kimi, bu konfiqurasiyanı daha yaxşı başa düşmək üçün bu koda bəzi şərhlər qoydum.

Sizin vəziyyətinizdə yalnız üç şeyi başa düşmək lazımdır:

  1. Bytes 16 -> Bu çipin I2C ünvanıdır
  2. Bayt 20 -dən 51 -ə qədər -> Bu çipin 16 yuvası üçün yuva tipini burada dəyişə bilərsiniz
  3. Byte 96 -127 -> Burada hər bir yuvada istifadə olunan açar və ya məlumat növünü təyin edə bilərsiniz.

Konfiqurasiya növünü və bunu niyə istifadə etdiyimi izah etməyəcəyəm, çünki hər şeyi izah etmək çətindir. Daha çox məlumata ehtiyacınız varsa, sənədlərə daxil olun, "SlotConfig" üçün 16 -cı hissə 2.2.1 və "KeyConfig" üçün 19 -cu bölmənin 2.2.5 -ə keçin.

Bu nümunə üçün AES açarını saxlamaq üçün 9 yuvasından istifadə edəcəksiniz.

Bunun üçün qoymalıyıq (ehtiyacınız varsa, yuxarıdakı nümunəni kopyalaya bilərsiniz, modifikasiya onda edilmişdir):

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

Niyə bu konfiqurasiyanı təyin etdim: Bu çipin hər bir yuvası üçün çipə hansı növ məlumatların saxlanılacağını söyləmək üçün parametrlər təyin edə bilərsiniz. Birdən çox parametriniz var:

  • Yuva yaza və ya oxuya bilər (hərəkəti silin və ya şifrələyin)
  • Saxlanan məlumatların növü (ECC açarı, Açar Açar, SHA Hash, AES Açarı…)
  • Yuva bağlana bilər
  • Açarın yaradılmasına icazə verilir

36 və 37 baytları "0x0F8F" olaraq təyin edildikdə:

  • Məlumatlar Clear -da yazıla bilər
  • Bu yuvanın məzmunu gizlidir və oxuna bilməz
  • Yuva CheckMac Kopyala əmri üçün istifadə edilə bilməz

112 və 113 baytı "0x001A" olaraq təyin edildikdə:

Slot dörd AES 128-ə qədər simmetrik düyməni saxlaya bilər (KeyType = 0x6)

İkinci addım: Bu konfiqurasiyanı yazın

Bu addım çox vacibdir, çünki konfiqurasiya ilə çipi quracağıq və bu konfiqurasiya yaxşı deyilsə, bu çipdən istifadə edəcəksiniz.

Ancaq narahat olmayın, Konfiqurasiya kilidlənmədiyi müddətcə konfiqurasiyanızı dəyişə bilərsiniz.

Burada konfiqurasiyanı çipə yazmaq üçün istifadə olunan kod budur:

/** / qısa Çipə yeni bir konfiqurasiya yazın.

* / cfg məntiqi interfeys konfiqurasiyası. Bəzi əvvəlcədən təyin edilmiş * konfiqurasiyaları atca_cfgs.h * / param [in] config konfiqurasiyasının dizi uint8_t (uzunluq 112) * / param [in] len Konfiqurasiya massivinin ölçüsü * / ATCA_SUCCESS -i uğurla qaytarın, əks halda bir səhv kodu. */ ATCA_STATUS write_configuration (ATCAIfaceCfg *cfg, uint8_t *config, size_t len) {if (len! = 112) return ATCA_BAD_PARAM; ATCA_STATUS vəziyyəti; status = atcab_init (cfg); if (status == ATCA_SUCCESS) {// Array konfiqurasiyasını çipə yazın // 16 baytlıq doldurma (16 ilk bayt yazıla bilməz) status = atcab_write_bytes_zone (ATCA_ZONE_CONFIG, 0, 16, (uint8_t *) config, len); qaytarılma vəziyyəti; } qaytarılma vəziyyəti; }

Bu funksiya konfiqurasiyanızı çipə yazacaq.

Üçüncü addım: Konfiqurasiya Zonasını bağlayın

Xəbərdarlıq: bu addımı atarkən ehtiyatlı olun, əgər bu Zonanı kilidləsəniz və konfiqurasiyanız yaxşı deyilsə, çip yararsızdır və bu zonanı dəyişə bilməzsiniz

Bu hərəkət üçün bu funksiyanı istifadə edəcəyik:

/** / qısa DATA_ZONE və ya CONFIG_ZONE kilidli olub olmadığını yoxlayın

* / cfg məntiqi interfeys konfiqurasiyası. Bəzi əvvəlcədən təyin edilmiş * konfiqurasiyaları atca_cfgs.h * / param [LOCK_ZONE_DATA] zonasında və ya LOCK_ZONE_CONFIG * / ATCA_SUCCESS -ə uğurla qaytara bilərsiniz, əks halda bir səhv kodu. */ ATCA_STATUS check_lock_zone (ATCAIfaceCfg *cfg, uint8_t zonası) {ATCA_STATUS statusu; bool kilidi = yalan; if (zone! = (uint8_t) LOCK_ZONE_CONFIG && zone! = (uint8_t) LOCK_ZONE_DATA) ATCA_BAD_PARAM qaytar; status = atcab_init (cfg); if (status == ATCA_SUCCESS) {if (ATCA_SUCCESS! = (status = atcab_is_locked (zone, & lock)))) {return ATCA_FUNC_FAIL; } if (! lock) {return ATCA_NOT_LOCKED; } ATCA_SUCCESS qaytar; } qaytar ATCA_BAD_PARAM; } check_lock_zone (& cfg, LOCK_ZONE_CONFIG);

Dördüncü addım: Sizə AES Açarını bir yuvaya yazın

Bu hissədə çipin konfiqurasiyasında təyin etdiyiniz yuvaya şəxsi AES açarını qoyacaqsınız.

Bu nümunə üçün çipin 9 nömrəli yuvasından istifadə edəcəyəm.

Bilməlisiniz: Bu çipin xüsusi bir xüsusiyyəti, məlumatları yuvaya yalnız 4 bayt və ya 32 bayt yazmaqdır. AES üçün 128 bit açar, 16 bayt məlumat lazımdır. Bu səbəbdən 32 bayt məlumat əldə etmək üçün bu yuvada hər biri 16 bayt olan bir açar yazmağa qərar verdim.

İndi sizə istifadə olunan kodu göstərəcəyəm:

/** / qısa AES düyməsini müəyyən bir yuvaya yazın. * / cfg məntiqi interfeys konfiqurasiyası. Bəzi əvvəlcədən təyin edilmiş * konfiqurasiyaları atca_cfgs.h saytında tapa bilərsiniz * / param [in] açar açar nömrəsi * / param [in] datakey açar massivi uint8_t * / param [in] len Açar silsiləsinin ölçüsü * / ATCA_SUCCESS -ə uğurla qayıdır, əks halda bir səhv kodu. */ ATCA_STATUS write_key_slot (ATCAIfaceCfg *cfg, uint8_t düyməsi, uint8_t *datakey, size_t len) {əgər (açar 16) ATCA_BAD_PARAM qaytarsa; əgər (len! = 32) ATCA_BAD_PARAM qaytarsan; ATCA_STATUS vəziyyəti = atcab_init (cfg); if (status == ATCA_SUCCESS) {status = atcab_write_zone (ATCA_ZONE_DATA, (uint16_t) düyməsi, 0, 0, datakey, 32); əgər (status! = ATCA_SUCCESS) qayıtma vəziyyəti; } qaytarılma vəziyyəti; }

Bu nümunə üçün hər biri 16 bayt olan iki AES düyməsini istifadə edəcəyəm:

// AES KEY nümunəsi (len 32) uint8_t example_of_key [32] = "AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA"; write_key_slot (& cfg, 9, example_of_key, sizeof (example_of_key));

Bu hərəkət yaxşıdırsa, indi "məlumat zonasını kilidləyin" son addımını keçməlisiniz.

Son addım: Məlumat Zonasını bağlayın

Xəbərdarlıq: bu zonada diqqətli olun, əgər bu Zonanı kilidləsəniz və məlumatlarınız qurulmayıbsa, çip yararsızdır və bu zonanı dəyişə bilməzsiniz

Bu hərəkət üçün bu funksiyanı istifadə edəcəyik:

/** / qısa DATA_ZONE və ya CONFIG_ZONE kilidli olub olmadığını yoxlayın

* / cfg məntiqi interfeys konfiqurasiyası. Bəzi əvvəlcədən təyin edilmiş * konfiqurasiyaları atca_cfgs.h * / param [LOCK_ZONE_DATA] zonasında və ya LOCK_ZONE_CONFIG * / ATCA_SUCCESS -ə uğurla qaytara bilərsiniz, əks halda bir səhv kodu. */ ATCA_STATUS check_lock_zone (ATCAIfaceCfg *cfg, uint8_t zonası) {ATCA_STATUS vəziyyəti; bool kilidi = yalan; if (zone! = (uint8_t) LOCK_ZONE_CONFIG && zone! = (uint8_t) LOCK_ZONE_DATA) ATCA_BAD_PARAM qaytar; status = atcab_init (cfg); if (status == ATCA_SUCCESS) {if (ATCA_SUCCESS! = (status = atcab_is_locked (zone, & lock)))) {return ATCA_FUNC_FAIL; } if (! lock) {return ATCA_NOT_LOCKED; } ATCA_SUCCESS qaytar; } qaytar ATCA_BAD_PARAM; } check_lock_zone (& cfg, LOCK_ZONE_DATA);

Bu hərəkət yaxşıdırsa, çipiniz istifadəyə hazırdır

Addım 5: 3. AES CBC Modulunun istifadəsi

3. AES CBC Modulunun istifadəsi
3. AES CBC Modulunun istifadəsi

AES CBC alqoritmi və Atecc608a çipi ilə məlumatların necə şifrələnəcəyini və deşifr edilməsini izah edəcəyəm.

Unutmayın: Bu funksiyanı istifadə etməzdən əvvəl çipi qurmalısınız. Bunun üçün bu yazının 2 -ci addımını izləyin

Bu çipdə çoxlu AES modulu var (AES 128 bit), yalnız AES 128 bit mümkündür:

  1. AES normaldır
  2. AES CBC
  3. AES GCM (GFM hash ilə) (daha çox izah üçün vikipediyaya baxın)

İstifadəni asanlaşdırmaq üçün iki funksiya yaratdım:

  1. aes_cbc_encrypt
  2. aes_cbc_decrypt

Bu iki funksiya Github -da mövcuddur.

İzahat

AES CBC Alqoritmini əsas AES 128 bitlərindən daha təhlükəsiz olduğu üçün istifadə etməyi seçirəm. Bu alqoritm məlumatlarınızı şifrələmək üçün Başlanğıc Vektorundan istifadə edir.

Məlumat

Aşağıda şifrələmə və deşifrləmə metodunun hər bir addımını ətraflı izah edirəm. Ancaq Arduino üçün hər iki funksiyanı istifadə edən bir kod yazdım. Bu kodu Github -da görə bilərsiniz:

  • Github: Mənim Githubum
  • "Şifrele/Şifrəni Aç" kod nümunəsi: AES_crypto_example.ino

İlk addım: məlumatlarınızı şifrələyin

Bu hissədə məlumatlarınızı necə şifrələyəcəyinizi sizə göstərəcəyəm.

Əvvəlcə bu funksiyaya ehtiyacınız olacaq:

/** / qısa AES CBC alqoritmindən istifadə edərək məlumatları şifrələyin* / param [in] cfg Məntiqi interfeys konfiqurasiyası. Bəzi əvvəlcədən təyin edilmiş * konfiqurasiyaları atca_cfgs.h * / param -da tapa bilərsiniz Şifrələmək üçün sözlər (16 -ya bölünməlidir, maksimum uzunluq 240) * / Param [in] şifrələnmək üçün sözlərin uzunluğu, maksimum uzunluq 240) * / param [out] iv AES CBC -də istifadə olunan Başlanğıc Vektoru (vektoru bu varda qaytarın) * / param [out] şifrəli mətn buraya Cypher mətni * / param [in] açarını daxil edin açar * / müvəffəqiyyətdə ATCA_SUCCESS qaytarın, əks halda bir səhv kodu. */ ATCA_STATUS aes_cbc_encrypt (ATCAIfaceCfg *cfg, uint8_t *data, int len, uint8_t *iv, uint8_t *şifrəli mətn, uint8_t açarı) {atca_aes_cbc_ctx_t ctx; əgər (len> LIMIT_DATA_SIZE_CBC && len % 16! = 0) {Serial.print (F ("ERROR: ATCA_BAD_PARAM")); qaytar ATCA_BAD_PARAM; } uint8_t tmp_iv [IV_LENGTH_CBC]; uint8_t tmp_data [len]; ATCA_STATUS vəziyyəti = atcab_init (cfg); əgər (status == ATCA_SUCCESS) {status = atcab_aes_cbc_init (& ctx, key, 0, tmp_iv); if (status! = ATCA_SUCCESS) {Serial.print (F ("ERROR Encrypt: atcab_aes_cbc_init, Code Error 0x")); Serial.println (status, HEX); qayıtmaq; } memcpy (iv, tmp_iv, IV_LENGTH_CBC); memcpy (tmp_data, data, len); int max = len / 16; for (int j = 0; j <max; j ++) {status = atcab_aes_cbc_encrypt_block (& ctx, & tmp_data [j * 16], və şifrəli mətn [j * 16]); } if (status! = ATCA_SUCCESS) {Serial.print (F ("ERROR Encrypt: atcab_aes_cbc_encrypt_block, 0x Kod Hatası")); Serial.println (status, HEX); } qaytarılma vəziyyəti; } qaytarılma vəziyyəti; }

Bu funksiyadan istifadə etmək çox asandır, iki şeyi təyin etməlisiniz:

  1. 16 baytdan ibarət boş IV (İlkin Vektor)
  2. Şifrələnəcək məlumatlar (maksimum ölçüsü 240 bayt)

Burada "bu funksiyanı necə istifadə etmək olar" nümunəsi.

Açarımı "9" yuvasının nömrəsinə yazaraq "AAAAAAAAAAAAAAA" sözünü şifrələmək istəyirəm:

ATCA_STATUS statusu = atcab_init (& cfg); əgər (status! = ATCA_SUCCESS) {Serial.println (F ("atcab_init () uğursuz oldu: Kod -> 0x")); Serial.println (status, HEX); } uint8_t düz mətn [16] = "AAAAAAAAAAAAAAAA"; // Orijinal mətn uint8_t iv [IV_LENGTH_CBC]; // İlk Vektor uint8_t cypherdata [sizeof (düz mətn)]; // Məlumatların şifrələnmiş statusu = aes_cbc_encrypt (& cfg, düz mətn, sizeof (düz mətn), iv, cypherdata, 9);

Əməliyyat yaxşı olarsa, "cypherdata" dəyişənində şifrələnmiş məlumatlara və "IV" dəyişənində İlkin Vektorunuza sahib olacaqsınız.

Mətninizin şifrəsini açmaq üçün bu iki dəyişəni saxlayın!

İkinci addım: məlumatlarınızı deşifr edin

Məlumatların şifrəsini açmaq üçün iki şeyə ehtiyacınız olacaq:

  1. İlkin Vektor
  2. Cypher məlumatları (şifrəli məlumatlar)

Məlumatların şifrəsini açmaq üçün bu funksiyaya ehtiyacınız olacaq:

/** / qısa AES CBC alqoritmindən istifadə edərək məlumatların şifrəsini açmaq* cfg Məntiqi interfeys konfiqurasiyası. Bəzi əvvəlcədən təyin edilmiş * konfiqurasiyalar atca_cfgs.h * / param [in] şifrəli mətndə açıla bilən sözlər (16 ilə bölünməlidir, maksimum uzunluq 240) * / param [in] açılan sözlərin uzunluğu, maksimum uzunluq 240) * / param [in] iv AES CBC -də istifadə etmək üçün Başlanğıc Vektoru * / param [out] düz mətn buraya şifrələnmiş mətni qaytarır * / param [in] düymənin açarının yuva nömrəsi * / müvəffəqiyyətdə ATCA_SUCCESS qayıdır., əks halda bir səhv kodu. */ ATCA_STATUS aes_cbc_decrypt (ATCAIfaceCfg *cfg, uint8_t *şifrəli mətn, int len, uint8_t *iv, uint8_t *düz mətn, uint8_t açarı) {atca_aes_cbc_ctx_t ctx; əgər (len> LIMIT_DATA_SIZE_CBC || len % 16! = 0) {Serial.print (F ("ERROR Decrypt: ATCA_BAD_PARAM")); qaytar ATCA_BAD_PARAM; } ATCA_STATUS vəziyyəti = atcab_init (cfg); əgər (status == ATCA_SUCCESS) {status = atcab_aes_cbc_init (& ctx, key, 0, iv); if (status! = ATCA_SUCCESS) {Serial.print (F ("ERROR Decrypt: atcab_aes_cbc_init, Kod Xətası 0x")); Serial.println (status, HEX); qayıtmaq; } int max = len / 16; for (int j = 0; j <max; j ++) {status = atcab_aes_cbc_decrypt_block (& ctx, & ciphertext [j * 16], & opentext [j * 16]); } if (status! = ATCA_SUCCESS) {Serial.print (F ("ERROR Decrypt: atcab_aes_cbc_encrypt_block, Kod Xətası 0x")); Serial.println (status, HEX); } qaytarılma vəziyyəti; } qaytarılma vəziyyəti; }

Əvvəlki məlumatlarımın şifrəsini açmaq istəyirəm (aşağıya baxın, İlk addım). Bunun üçün bunu edəcəyəm:

uint8_t düz mətn [16] = "AAAAAAAAAAAAAAAA"; uint8_t iv [IV_LENGTH_CBC]; uint8_t cypherdata [sizeof (düz mətn)]; uint8_t decryptdata [sizeof (düz mətn)]; status = aes_cbc_decrypt (& cfg, cypherdata, sizeof (cypherdata), iv, decryptdata, 9); if (status == ATCA_SUCCESS) {Serial.print ("Şifrəsi açılmış mətn:"); for (size_t i = 0; i <sizeof (decryptdata); i ++) {Serial.print ((char) decryptdata ); } Serial.println (""); } başqa {// Erial Serial.print kodu üçün atca_status.h faylına baxın (F ("Şifrəni açmaq mümkün deyil | Kod Xətası 0x")); Serial.println (status, HEX); qayıtmaq; }

Əməliyyat yaxşı olarsa, "decryptdata" dəyişənində şifrələnmiş məlumatlar olacaq.

İndi Atecc608a çipi ilə şifrələmə və deşifrdən necə istifadə edəcəyinizi bilirsiniz

Addım 6: 5. Bu Çipdən Niyə İstifadə Etməlisiniz

Şifrəli məlumatlar çox faydalıdır, çünki məlumatlarınızı gizlədə və simsiz göndərə və ya sadəcə saxlaya bilərsiniz.

Burada istifadə nümunəsi:

  1. Xarici bir EEPROM -da saxlanılan məlumatlar: Xarici bir EEPROM -un məlumatlarını qoruya bilərsiniz və əgər kimsə hələ də bu EEPROM -un şifrəsini açmaq üçün Açar və IV -ə ehtiyac duyacaq
  2. Simsiz məlumat göndər: Bu şifrəli məlumatları Wireless (nrf24L01, RFM95W…) vasitəsi ilə göndərə bilərsiniz və kimsə məlumatlarınızı ələ keçirərsə bu məlumatlar etibarlı olacaq.
  3. Saxlanılan parol

Bu çiplə birdən çox şey edə bilərsiniz. Birdən çox layihədə istifadə edilə bilər. Vaxtınız varsa, deyin bu çipi hansı layihədə istifadə edəcəksiniz?

Son bir məsləhət, bir az simsiz bir layihə qurarsanız və ya bəzi xam məlumatları saxlasanız, diqqətli olun, təhlükəsizlik çox vacibdir və bir "noob" un məlumatlarınızı ələ keçirməsinin və ya oğurlamasının necə sadə olduğunu bilirsinizsə. İndi İnternetlə, hər kəs kompüterində yalnız "hack" etmək üçün başlatmaq üçün skriptlərə sahib ola bilər!

Addım 7: Nəticə

Ümid edirəm bu məqalə sizin üçün faydalı olacaq. Mətnimdə səhv etsəm, üzr istəyirəm, amma ingilis dili mənim ana dilim deyil və yazdığımdan daha yaxşı danışıram.

Hər şeyi oxuduğunuz üçün təşəkkürlər.

Zövq alın.

Tövsiyə: