ዝርዝር ሁኔታ:

ሽቦ አልባ ኢንክሪፕት የተደረገ ግንኙነት አርዱinoኖ 5 ደረጃዎች
ሽቦ አልባ ኢንክሪፕት የተደረገ ግንኙነት አርዱinoኖ 5 ደረጃዎች

ቪዲዮ: ሽቦ አልባ ኢንክሪፕት የተደረገ ግንኙነት አርዱinoኖ 5 ደረጃዎች

ቪዲዮ: ሽቦ አልባ ኢንክሪፕት የተደረገ ግንኙነት አርዱinoኖ 5 ደረጃዎች
ቪዲዮ: ኢንክሪፕሽንስ - እንዴት መጥራት ይቻላል? #ምስጠራ (ENCRYPTION'S - HOW TO PRONOUNCE IT? #encryption's) 2024, ሀምሌ
Anonim
ሽቦ አልባ ኢንክሪፕት የተደረገ ግንኙነት አርዱinoኖ
ሽቦ አልባ ኢንክሪፕት የተደረገ ግንኙነት አርዱinoኖ

ሰላም ለሁላችሁ, በዚህ በሁለተኛው ጽሑፍ ውስጥ የገመድ አልባ ግንኙነትዎን ደህንነት ለመጠበቅ ቺፕ Atecc608a ን እንዴት እንደሚጠቀሙ እነግርዎታለሁ። ለዚህ ፣ NRF24L01+ ን ለገመድ አልባ ክፍል እና ለአርዱዲኖ UNO እጠቀማለሁ።

ማይክሮ ቺፕ ATECC608A በማይክሮ ቺፕ የተቀየሰ እና በርካታ የደህንነት መሳሪያዎችን አግኝቷል። ለምሳሌ ፣ ይህ ቺፕ የ ECC ቁልፎችን ፣ የ AES ቁልፎችን (ለ AES 128) እና SHA2 Hash ማከማቸት ይችላል።

ጽሑፉ NRF24L01 + Arduino UNO + ATECC608A

በሁለት IoT Object መካከል በሚገናኝበት ጊዜ ብዙ ጥቃቶች ሊኖሩ ይችላሉ - Man Of the የዋህ ፣ የመረጃ ቅጂ እና ሌሎችም። ስለዚህ ሀሳቤ በጣም ቀላል ነው -

  1. በሁለት ወይም ከዚያ በላይ በአይዮት ነገር መካከል የተመሰጠረ ውሂብን መጠቀም።
  2. ዝቅተኛ ዋጋ አቅርቦቶች
  3. ከ Arduino UNO ጋር መሥራት ይችላል

በእኔ ሁኔታ እኔ እጠቀማለሁ

  • የእኔ AES ቁልፍን ለማከማቸት እና ውሂቤን ኢንክሪፕት/ዲክሪፕት ለማድረግ Atecc608a።
  • አርዱዲኖ ዩኖ እንደ ማይክሮ መቆጣጠሪያ
  • የእኔን ውሂብ ለመላክ NRF24L01

ለዚህ ፕሮጀክት እነዚህን ደረጃዎች መከተል ያስፈልግዎታል

  1. ቺ theን ATECC608A ያዘጋጁ
  2. ወረዳውን (ዋና መስቀለኛ መንገድ እና የባሪያ መስቀለኛ መንገድ) ያድርጉ
  3. የኮድ ክፍል
  4. ሩቅ መሄድ !

ለመጀመሪያዎቹ ደረጃዎች “ቺፕ ATECC608A ን ያዘጋጁ” ፣ እያንዳንዱን ደረጃ በቅደም ተከተል የሚያብራራ ሌላ ጽሑፍ ፃፍኩ። አገናኙ እዚህ አለ

አሁን ጀምር!

አቅርቦቶች

ለዚህ ፕሮጀክት የሚከተሉትን ያስፈልግዎታል

  • 2 አርዱዲኖ UNO ወይም አርዱዲኖ ናኖ ወይም አርዱዲኖ ሜጋ
  • አንዳንድ ሽቦ
  • 2 Atecc608a (እያንዳንዱ ዋጋ ከ 0.60 ዶላር ያነሰ)
  • 2 NRF24L01+
  • 2 capacitor (10 μF)
  • የዳቦ ሰሌዳዎች

ቺ theን ATECC608A እንዴት ማቀናበር እንደሚቻል -> Atecc608a እንዴት እንደሚዋቀር የሚያብራራ ወደ ጽሑፌ አገናኝ

ደረጃ 1: 1. Atecc608a ን ያዋቅሩ

1. Atecc608a ን ያዋቅሩ
1. Atecc608a ን ያዋቅሩ
1. Atecc608a ን ያዋቅሩ
1. Atecc608a ን ያዋቅሩ

ATECC608A ን ለማዘጋጀት እያንዳንዱን እርምጃ በዝርዝር አልገልጽም ምክንያቱም እያንዳንዱን እርምጃዎች የሚያብራራ ሙሉ ጽሑፍ ስለፃፍኩ። እሱን ለማቀናበር “2. የቺፕ ውቅር (Atecc608a)” የተባለውን የዚህን ጽሑፍ “ደረጃ 4” መከተል ያስፈልግዎታል።

አገናኙ - ATECC608A እንዴት እንደሚዋቀር

እንዲሁም ፣ ለ Atecc608a ፣ ለዋና ወገን እና ለባሪያ ጎን ተመሳሳይ ውቅር ማስቀመጥ አለብዎት ፣ አለበለዚያ የእርስዎን ውሂብ ዲክሪፕት ማድረግ አይችሉም።

ማስጠንቀቂያ ፦

ይህንን ቺፕ ለማቀናጀት ፣ ከላይ ያለውን የጽሑፍ እያንዳንዱን ደረጃዎች በቅደም ተከተል መከተል ያስፈልግዎታል። አንድ እርምጃ ከጎደለ ወይም ቺፕ ካልተቆለፈ ይህንን ፕሮጀክት ማከናወን አይችሉም።

ቀሪ ፦

ይህንን ለመከተል እርምጃ

  • የውቅረት አብነት ይፍጠሩ
  • ይህንን አብነት ወደ ቺፕው ይፃፉ
  • የ Config ዞን ይቆልፉ
  • በአንድ AES ውስጥ የ AES ቁልፍዎን (128 ቢት) ይፃፉ
  • የውሂብ ቀጠናን ቆልፍ

ደረጃ 2: 2. የወረዳ ንድፍ (ጌታ እና ባሪያ)

2. የወረዳ ንድፍ (ጌታ እና ባሪያ)
2. የወረዳ ንድፍ (ጌታ እና ባሪያ)
2. የወረዳ ንድፍ (ጌታ እና ባሪያ)
2. የወረዳ ንድፍ (ጌታ እና ባሪያ)

በዚህ ፕሮጀክት ውስጥ ዋና መስቀለኛ መንገድ እና የባሪያ መስቀለኛ መንገድ ይኖርዎታል።

ዋናው መስቀለኛ መንገድ በባሪያ መስቀለኛ መንገድ የተላከውን መረጃ በግልፅ ያትማል። በየ X ጊዜ ከባሪያ መስቀለኛ መንገድ መረጃን ይጠይቃል።

የባሪያ መስቀለኛ መንገድ “ኔትወርክ” ን ያዳምጣል እና “የውሂብ ጥያቄ” ሲቀበል ያመነጫል ፣ ያመስጥር እና ወደ ዋናው መስቀለኛ ክፍል ይልካል።

ለሁለቱም ወገን ጌታው እና ባሪያው ወረዳው አንድ ናቸው

  • አንድ አርዱዲኖ ናኖ
  • አንድ ATECC608A
  • አንድ NRF24L01

ወረዳውን ከዚህ ደረጃ ጋር አያያዝኩት (ከዚህ በላይ ያለው ስዕል)።

ለ ATECC608A ወደ አርዱዲኖ UNO ፣ ይህ ሶይክ 8 ፒን ነው። ከላይ ያለውን “የላይኛው እይታ” አክዬአለሁ

  • ARDUINO 3.3V -> ፒን 8 (Atecc608a)
  • ARDUINO GND -> ፒን 4 (Atecc608a)
  • ARDUINO A4 (SDL) -> ፒን 5 (Atecc608a)
  • ARDUINO A5 (SCL) -> ፒን 6 (Atecc608a)

ለ NRF24L01 ወደ አርዱinoኖ

  • ARDUINO 3.3V -> VCC (nrf24l01)
  • ARDUINO GND -> GND (nrf24l01)
  • ARDUINO 9 -> CE (nrf24l01)
  • ARDUINO 10 -> CSN (nrf24l01)
  • ARDUINO 11 -> ሞሲ (nrf24L01)
  • ARDUINO 12 -> ሚሶ (nrf24l01)
  • ARDUINO 13 -> SCK (nrf24l01)
  • ARDUINO 3 -> IRQ (nrf24l01) -> ለባሪያ መስቀለኛ መንገድ ብቻ ፣ በማስተር ሞድ ውስጥ ጥቅም ላይ ያልዋለ

የ NRF24L01 የ IRQ ፒን ለምን ይጠቀሙ?

የ IRQ ፒን በጣም ጠቃሚ ነው ፣ አንድ ፓኬት በ NRF24L01 ሲቀበል ይህ ፒን (LOW) ለማለት ይፈቅዳል ፣ ስለዚህ የባሪያውን መስቀለኛ ክፍል ለማንቃት በዚህ ፒን ላይ ማቋረጫ ማያያዝ እንችላለን።

ደረጃ 3: 3. ኮዱ (ባሪያ እና መምህር)

3. ኮዱ (ባሪያ እና መምህር)
3. ኮዱ (ባሪያ እና መምህር)

የባሪያ መስቀለኛ መንገድ

ለባሪያው መስቀለኛ መንገድ የኃይል ቁጠባን እጠቀማለሁ ምክንያቱም ሁል ጊዜ ማዳመጥ አያስፈልገውም።

እንዴት እንደሚሰራ -የባሪያ መስቀለኛ መንገድ ያዳምጡ እና “ንቁ ንቁ ፓኬት” ለመቀበል ይጠብቁ። ይህ እሽግ ከባሪያው መረጃ ለመጠየቅ በዋናው መስቀለኛ መንገድ ይላካል።

በእኔ ሁኔታ ሁለት ድርድርን እጠቀማለሁ-

// ንቃት ፓኬት

const int wake_packet [2] = {20, 02};

መስቀለኛዬ እሽግ ከተቀበለ ፣

  1. ይነቃል ፣ ይህንን ፓኬት ያንብቡ ፣ ጥቅሉ “ተነስ” ከሆነ ፣
  2. እሱ መረጃን ያመነጫል ፣
  3. ውሂቡን ኢንክሪፕት ማድረግ ፣
  4. ውሂቡን ለጌታው ይላኩ ፣ የ ACK ፓኬት ይጠብቁ ፣
  5. እንቅልፍ

ለ AES ምስጠራ በቁልፍ ቁጥር 9 ውስጥ ቁልፍን እጠቀማለሁ።

ይህ ለባሪያ መስቀለኛ መንገድ የእኔ ኮድ ነው

#"Arduino.h" #ያካትቱ "avr/sleep.h" #"avr/wdt.h" ን ያካትቱ

#"SPI.h" ን ያካትቱ

#"nRF24L01.h" ን ያካትቱ "RF24.h"

#"Wire.h" ን ያካትቱ

// ATECC608A ቤተ -መጽሐፍት

#«ATECCX08A_Arduino/cryptoauthlib.h» ን ያካትቱ #AES BASIC/aes_basic.h »ን ያካትቱ

#መታወቂያ_ኤንዲ 255

#AES_KEY (uint8_t) ን ይግለጹ 9

ATCAIfaceCfg cfg;

ATCA_STATUS ሁኔታ;

RF24 ሬዲዮ (9 ፣ 10);

const uint64_t masteraddresse = 0x1111111111;

const uint64_t slaveaddresse = 0x1111111100;

/**

* / አጭር ተግባር መቋረጡ ሲቀናበር (IRQ LOW) * * */ void wakeUpIRQ () {ሳለ (radio.available ()) {int data [32]; radio.read (& ውሂብ ፣ 32); ከሆነ (ውሂብ [0] == 20 && ውሂብ [1] == 02) {float temp = 17.6; ተንሳፋፊ ሁም = 16.4;

uint8_t ውሂብ [16];

uint8_t cypherdata [16];

// ሁሉንም እሴቴን ለማዘጋጀት ሕብረቁምፊ ይገንቡ

// እያንዳንዱ እሴት በ "|" ተለያይቷል እና “$” ማለት የውሂብ መጨረሻ ማለት ነው / ማስጠንቀቂያ -ከ 11 ርዝመት ያነሰ መሆን አለበት ሕብረቁምፊ tmp_str_data = ሕብረቁምፊ (ID_NODE) + "|" + ሕብረቁምፊ (ቴምፕ ፣ 1) + "|" + ሕብረቁምፊ (ሁም ፣ 1) + “$”; // መጠን 11 Serial.println ("tmp_str_data:" + tmp_str_data);

tmp_str_data.getBytes (ውሂብ ፣ መጠን (ውሂብ));

// ውሂቡን ኢንክሪፕት ያድርጉ

ATCA_STATUS ሁኔታ = aes_basic_encrypt (& cfg ፣ data ፣ sizeof (data) ፣ cypherdata ፣ AES_KEY) ፤ ከሆነ (ሁኔታ == ATCA_SUCCESS) {long rand = random ((long) 10000 ፣ (long) 99999);

// በሦስቱ የመጀመሪያ ቁጥር = የመታወቂያ መስቀለኛ መንገድ ላይ በመመስረት UUID ን ያመነጩ

ሕብረቁምፊ uuid = ሕብረቁምፊ (ID_NODE) + ሕብረቁምፊ (ራንድ); // መጠን 8

uint8_t tmp_uuid [8];

uint8_t data_to_ ለመላክ [32];

uuid.getBytes (tmp_uuid, sizeof (tmp_uuid) + 1);

memcpy (data_to_send ፣ tmp_uuid ፣ sizeof (tmp_uuid));

memcpy (data_to_send + sizeof (tmp_uuid) ፣ cypherdata ፣ sizeof (cypherdata)); // ሬዲዮ ማዳመጥ ያቁሙ። ማቆም ();

bool rslt;

// ውሂብ rslt = radio.write (& data_to_send ፣ sizeof (data_to_send)) ይላኩ ፤ // ሬዲዮ ማዳመጥ ይጀምሩ። ጀምር ማዳመጥ (); ከሆነ (rslt) {// ጨርስ እና የእንቅልፍ ሁኔታ Serial.println (F (“ተከናውኗል”)); }}}}}

ባዶነት ማዋቀር ()

{Serial.begin (9600);

// ቤተመፃህፍቱን ገንቢ ያስገቡ

cfg.iface_type = ATCA_I2C_IFACE; // የግንኙነት ዓይነት -> I2C ሁነታ cfg.devtype = ATECC608A; // ዓይነት ቺፕ cfg.atcai2c.slave_address = 0XC0; // I2C addresse (ነባሪ እሴት) cfg.atcai2c.bus = 1; cfg.atcai2c.baud = 100000; cfg.wake_delay = 1500; // የእንቅልፍ መዘግየት (1500 ሚሴ) cfg.rx_retries = 20;

radio.begin ();

radio.setDataRate (RF24_250KBPS); radio.maskIRQ (1, 1, 0); radio.enableAckPayload (); ሬዲዮ። ዳግም ማስጀመር (5 ፣ 5);

radio.openWritingPipe (masteraddresse);

radio.openReadingPipe (1, slaveaddresse); // ማቋረጫውን በፒን 3 ላይ ያያይዙ // መቋረጫውን በፒን 2/1 መውደቅ ሞድ = በ LOW ዓባሪ ላይ ይሰኩ መቋረጥ (1 ፣ wakeUpIRQ ፣ FALLING) ከፈለጉ በ 1 ይቀይሩ። }

ባዶነት loop ()

{ // አያስፈልግም }

ማስተር መስቀለኛ መንገድ

ጌታው መስቀለኛ መንገድ ከባሪያው መስቀለኛ መንገድ መረጃ ለመጠየቅ በየ 8 ሰከንድ ይነሳል

እንዴት እንደሚሰራ -ዋናው መስቀለኛ መንገድ “WakeUP” ፓኬት ለባሪያው ይልካል እና የባሪያውን መልስ ከመረጃ ጋር ከተጠባበቀ በኋላ።

በእኔ ሁኔታ ሁለት ድርድርን እጠቀማለሁ-

// ንቃት ፓኬት

const int wake_packet [2] = {20, 02};

ጌታው የ WakeUp ፓኬት ከላከ በኋላ የባሪያ መስቀለኛ መንገዱ ACK ፓኬት ከላከ

  1. ማስተር በማዳመጥ ሁኔታ ውስጥ ተዋቅሯል እና ግንኙነትን ይጠብቁ
  2. ግንኙነት ከሆነ
  3. 8 መደበኛውን ባይት ያውጡ ፣ የ 8 ባይት ሦስቱን ባይት ይዘርፉ ፣ ይህ የመታወቂያ መስቀለኛ መንገድ ከሆነ
  4. 16 ሳይት የሳይፈርን ያውጡ
  5. ውሂቡን ዲክሪፕት ያድርጉ
  6. በተከታታይ ውስጥ ውሂቡን ያትሙ
  7. የእንቅልፍ ሁኔታ

ለ AES ምስጠራ በቁልፍ ቁጥር 9 ውስጥ ቁልፍን እጠቀማለሁ።

ይህ ለዋናው መስቀለኛ መንገድ የእኔ ኮድ ነው

#"Arduino.h" ን ያካትቱ

#"avr/sleep.h" #ያካትቱ "avr/wdt.h" #"SPI.h" ን #nRF24L01.h " #ያካትቱ" RF24.h " #" Wire.h "// ATECC608A ቤተ -መጽሐፍትን ያካትቱ #"ATECCX08A_Arduino/cryptoauthlib.h" ን ያካትቱ #AES BASIC/aes_basic.h "#define ID_NODE 255 #define AES_KEY (uint8_t) 9 ATCAIfaceCfg cfg; ATCA_STATUS ሁኔታ; RF24 ሬዲዮ (9 ፣ 10); const uint64_t masteraddresse = 0x1111111111; const uint64_t slaveaddresse = 0x1111111100; // Wake UP packet const int wake_packet [2] = {20, 02}; // ጠባቂው ISR (WDT_vect) {wdt_disable (); // ጠባቂን ያሰናክሉ} ባዶ እንቅልፍ እንቅልፍ () {// ADC ADCSRA = 0 ን ያሰናክሉ; // የተለያዩ “ዳግም አስጀምር” ባንዲራዎችን ያፅዱ MCUSR = 0; // ለውጦችን ይፍቀዱ ፣ ዳግም ማስጀመርን ያሰናክሉ WDTCSR = bit (WDCE) | ቢት (WDE); // የማቋረጫ ሁነታን እና የጊዜ ክፍተት WDTCSR = ቢት (WDIE) | ቢት (WDP3) | ቢት (WDP0); // WDIE ን ያዘጋጁ ፣ እና 8 ሰከንዶች መዘግየት wdt_reset (); // የጠባቂውን set_sleep_mode (SLEEP_MODE_PWR_DOWN) ዳግም ያስጀምሩ ፤ ምንም የማያቋርጥ (); // የጊዜ ቅደም ተከተል የእንቅልፍ_ንቃት () ይከተላል ፤ // በሶፍትዌር ውስጥ MCUCR = bit (BODS) | ቢት (BODSE); MCUCR = ቢት (አካላት); ማቋረጦች (); // ዋስትና ያለው ቀጣይ መመሪያ ተገድሏል sleep_cpu (); // እንቅልፍን እንደ ቅድመ ጥንቃቄ እንቅልፍ_ዳይሰርዝ (); } ባዶነት ማዋቀር () {Serial.begin (9600); // ቤተመፃህፍቱን ገንቢውን ያስገቡ cfg.iface_type = ATCA_I2C_IFACE; // የግንኙነት ዓይነት -> I2C ሁነታ cfg.devtype = ATECC608A; // ዓይነት ቺፕ cfg.atcai2c.slave_address = 0XC0; // I2C addresse (ነባሪ እሴት) cfg.atcai2c.bus = 1; cfg.atcai2c.baud = 100000; cfg.wake_delay = 1500; // የእንቅልፍ መዘግየት (1500 ሚሴ) cfg.rx_retries = 20; radio.begin (); radio.setDataRate (RF24_250KBPS); radio.maskIRQ (1, 1, 0); radio.enableAckPayload (); ሬዲዮ። ዳግም ማስጀመር (5 ፣ 5); radio.openWritingPipe (slaveaddresse); radio.openReadingPipe (1 ፣ masteraddresse); } ባዶነት loop () {bool rslt; // ውሂብ rslt = radio.write (& wake_packet ፣ sizeof (wake_packet)) ይላኩ ፤ ከሆነ (rslt) {// ማዳመጥ ይጀምሩ radio.startListening (); ሳለ (radio.available ()) {uint8_t answer [32]; ሬዲዮ። አንብብ (& መልስ ፣ መጠን (መልስ)); uint8_t node_id [3]; uint8_t ሳይፈር [16]; memcpy (node_id ፣ መልስ ፣ 3); memcpy (ሳይፈር ፣ መልስ + 3 ፣ 16); ((int) node_id == ID_NODE) {uint8_t ውፅዓት [16]; ATCA_STATUS ሁኔታ = aes_basic_decrypt (& cfg ፣ cypher ፣ 16 ፣ ውፅዓት ፣ AES_KEY); ከሆነ (ሁኔታ == ATCA_SUCCESS) {Serial.println ("ዲክሪፕት የተደረገ ውሂብ:"); ለ (size_t i = 0; i <16; i ++) {Serial.print ((char) output ); }}}}} ሌላ {Serial.println (“Ack for Wakup Packet” አይቀበልም) ፤ } // የእንቅልፍ ሁኔታ 8 ሰከንድ የእንቅልፍ ሞድ (); }

ጥያቄ ካለዎት እሱን ለመመለስ እዚህ ነኝ

ደረጃ 4: 4. ተጨማሪ ይሂዱ

ይህንን ፕሮጀክት ማሻሻል እንዲችሉ ይህ ምሳሌ ቀላል ነው

ማሻሻያዎች

  • AES 128 መሠረታዊ ነው እና ደህንነቱ የተጠበቀ እንዲሆን እንደ AES CBC ሌላ የ AES ስልተ ቀመር መጠቀም ይችላሉ።
  • የገመድ አልባ ሞዱሉን ይቀይሩ (NRF24L01 በ 23 ባይት ጭነት የተገደበ ነው)

እርስዎ መሻሻል ካዩ በውይይቱ ቦታ ላይ ያብራሩት

ደረጃ 5 መደምደሚያ

ይህ ጽሑፍ ለእርስዎ ጠቃሚ እንደሚሆን ተስፋ አደርጋለሁ። በጽሑፌ ላይ ስህተት ከሠራሁ ግን እንግሊዝኛ ዋናው ቋንቋዬ ካልሆነ እና እኔ ከምጽፈው በተሻለ እናገራለሁ።

ሁሉንም በማንበብዎ እናመሰግናለን።

ተዝናናበት.

የሚመከር: