ዝርዝር ሁኔታ:

ደህንነት ከአርዱዲኖ ጋር: Atecc608a: 7 ደረጃዎች
ደህንነት ከአርዱዲኖ ጋር: Atecc608a: 7 ደረጃዎች

ቪዲዮ: ደህንነት ከአርዱዲኖ ጋር: Atecc608a: 7 ደረጃዎች

ቪዲዮ: ደህንነት ከአርዱዲኖ ጋር: Atecc608a: 7 ደረጃዎች
ቪዲዮ: ደህንነት እና አክሊል ክፍል 1 --- በወንድም ዳዊት ፋሲል 2024, ሀምሌ
Anonim
ደህንነት ከአርዱዲኖ ጋር: Atecc608a
ደህንነት ከአርዱዲኖ ጋር: Atecc608a
ደህንነት ከአርዱዲኖ ጋር: Atecc608a
ደህንነት ከአርዱዲኖ ጋር: Atecc608a

ርዕስ

ሰላም ለሁላችሁ !

ይህ የመጀመሪያ አስተማሪ ጽሑፌ ነው ፣ ስለሆነም ለሁላችሁም አስደሳች እንደሚሆን ተስፋ አደርጋለሁ።

በዚህ ጽሑፍ ውስጥ ብዙ የደህንነት መሳሪያዎችን የሚያቀርብ “ATECC608A” የተባለ ማይክሮ ቺፕ እንዴት እንደሚጠቀሙ እነግርዎታለሁ።

ይህ ቺፕ በማይክሮ ቺፕ የተቀየሰ ሲሆን የ “CryptoAutrification ቺፕ” የመጨረሻው ስሪት ነው። ከዚህ ስሪት በፊት “ATSHA204A” እና “ATECC508A” ነበሩ።

የቀደመውን ስሪት ሳይሆን የመጨረሻውን ስሪት ለመጠቀም ለምን ወሰንኩ?

ይህ ስሪት በጣም የተራቀቀ ቺፕ እና የድሮው ስሪት የሌላቸውን ተግባራት አግኝቷል (ለምሳሌ - AES ሞዱል ፣ አይኦ ጥበቃ ሞዱል…)።

ይህ ፕሮጀክት ለምን?

እኔ በሳይበር ደህንነት ጎራ ውስጥ እሠራለሁ እና እንደ ሁሉም ሰው እኔ ፕሮግራምን እና ኤሌክትሮኒክስን እንደወደድኩ። በትምህርቴ ወቅት IoT Security ላይ ካለው ልዩ ባለሙያተኛ ጋር ኮንፈረንስ አገኘሁ (ኢንዱስትሪያል) በ IoT እቃቸው ውስጥ ደህንነትን አይጠቀምም። በብሉቱዝ በስማርትፎንዎ ሊከፈት የሚችል የቁልፍ ሰሌዳ አሳየን። በቁልፍ ሰሌዳው ላይ አንድ ዓረፍተ ነገር “ይህ የቁልፍ መቆለፊያ ከቁልፍ መቆለፊያ የበለጠ ደህንነቱ የተጠበቀ ነው!” አለ። ይህ ዓረፍተ ነገር ፈገግ እንዲል ያደርገዋል እና “ይህ የቁልፍ መቆለፊያ እስከ ዛሬ ከተገነባው በጣም የከፋ ቁልፍ ነው!” የሚለውን ዓረፍተ ነገር አሻሻለ።

እሱ በራሱ ፒሲ እና በብሉቱዝ አነፍናፊ በስማርትፎን የተላከው እያንዳንዱ ትዕዛዝ በእያንዳንዱ ጊዜ ተመሳሳይ መሆኑን እና ይህንን ትእዛዝ መቅዳት እና በእርስዎ ዘመናዊ ስልክ መላክ በጣም ቀላል ነው። ለ “ኢንዱስትሪያል” “ደህንነት” ዋናው ችግር እንዳልሆነ አብራርተውልናል። ለእነዚህ ነገሮች የደህንነት ንብርብር ሊጨምሩ የሚችሉ ቺፖችን (ከ 0.60 ዶላር በታች) አሳየን።

ከዚህ ማሳያ በኋላ ፣ በ IoT ነገር ላይ የደህንነት ንብርብር የሚጨምር አንዳንድ ክፍት ምንጭ ፕሮጀክት ለማግኘት ሞከርኩ ግን አላገኘሁትም።

ስለዚህ በሁለት IoT ነገር መካከል ለግንኙነት የደህንነት ንብርብርን በሚጠቀም ፕሮጀክት ላይ ለመሥራት ወሰንኩ።

ሀሳቤ ምንድነው?

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

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

አሁን ይህንን ረቂቅ ስዕል በአርዱዲኖ እና በ Atecc608a ቺፕ እንዴት እንደተገበርኩ እነግርዎታለሁ። በዚህ ጽሑፍ ውስጥ አርዱዲኖ UNO ን ከ ATECC608A ጋር እንዴት እንደሚጠቀሙበት እነግርዎታለሁ።

በሚቀጥለው ጊዜ ስለ ሁለት ነገር ግንኙነት አንድ ጽሑፍ እጽፋለሁ።

አቅርቦቶች

ለዚህ ፕሮጀክት ጥቂት ነገሮች ያስፈልጉዎታል

  1. አርዱዲኖ UNO ወይም ሜጋ (ቺፕ Atmega 328 ወይም ATMEGA 2560 መሆን አለበት)
  2. Atecc608A ቺፕ (እያንዳንዳቸው ከ 0.80 ዶላር ያነሰ ዋጋ ፣ በአቅራቢዎ ድር ጣቢያ ላይ በቀላሉ ማግኘት)
  3. 8-ፒን SOIC አስማሚ
  4. አንዳንድ ሽቦዎች እና ተከላካዮች

የዚህ ቺፕ (Atecc508a) የቀደመው ስሪት የውሂብ ሉህ እዚህ ይገኛል -> የውሂብ ስብስብ Atecc508a

ደረጃ 1 - ደረጃ በደረጃ

ደረጃ በደረጃ
ደረጃ በደረጃ

በዚህ ጽሑፍ ውስጥ የዚህን ቺፕ ውቅር እንዴት ማሻሻል እና እንዴት የ AES CBC ስልተ ቀመርን በመጠቀም መረጃን ኢንክሪፕት ማድረግ እንደሚቻል አሳያችኋለሁ።

እነዚህን ደረጃዎች እንከተላለን-

  1. የወረዳው ንድፍ
  2. የዚህ ቺፕ ውቅር
  3. የ AES CBC ሞዱል አጠቃቀም
  4. ይህንን ቺፕ ለምን መጠቀም ያስፈልግዎታል?

ለእያንዳንዱ እርምጃዎች ሁሉንም ነገር በዝርዝር እገልጻለሁ። እንዲሁም ፣ ለእያንዳንዱ ተግባራት ከአስተያየቶች ጋር በ Github ውስጥ ኮዴን ጨምሬያለሁ። ስለ የእኔ ኮድ ወይም ስለዚህ ፕሮጀክት አንዳንድ ጥያቄዎች ካሉዎት እሱን ለመመለስ ደስተኛ ነኝ።

የእኔ Github: የእኔ Github

ደረጃ 2 - ስለ Atecc608a ማስጠንቀቂያ

ማስጠንቀቂያ ስለ Atecc608a
ማስጠንቀቂያ ስለ Atecc608a

የ Atecc608a ቺፕ “ቀላል” ቺፕ አይደለም።

በመጀመሪያ ፣ የዚህ ቺፕ ሰነዶች በበይነመረብ ላይ ሙሉ በሙሉ እንዳያገኙት በኤንዲኤ ስር ነው። ግን ለዚህ ምንም ችግር የለም ፣ የቀደመው ስሪት የውሂብ ሉህ በበይነመረብ የመረጃ ቋት የተሟላ ATECC508A ላይ ይገኛል።

ሁለተኛ ፣ ይህንን ቺፕ ሲጠቀሙ ውቅረቱን መቆለፍ ያስፈልግዎታል እና ከተቆለፈ የቺፕውን ውቅር መለወጥ አይቻልም። ስለዚህ የ Config Zone ን እና የውሂብ ዞኑን ሲቆልፉ ይጠንቀቁ።

ሦስተኛ ፣ በ C ውስጥ የተፃፈው ቤተ -መጽሐፍት በጣም ትልቅ እና የተሟላ ነው ፣ ስለሆነም ከዚህ በፊት የሚጠቀሙባቸውን ተግባራት ሰነድ ማንበብ አለብዎት።

አራት ፣ ቤተ -መጽሐፍት ለዚህ ቺፕ ለአርዱዲኖ UNO እንዳይሠራ ጽፎ ነበር ፣ ግን እሱ ከአርዱዲኖ UNO ጋር እንዲሠራ የሚያስፈልጉትን ተግባራት አክሏል።

ቺፕ ATECC608A

ከዚህ ቺፕ ጋር በ I2C መገናኘት ይችላሉ። የዚህ ቺፕ አድራሻ በማዋቀሪያው ውስጥ ሊቀየር ይችላል።

ይህ ቺፕ የተለያዩ የውሂብ ዓይነቶችን ሊይዙ የሚችሉ 16 የተለያዩ ቦታዎችን ይ containsል-

  1. የኢሲሲ ቁልፍ (የግል ወይም የህዝብ)
  2. የ AES ቁልፍ
  3. ሌላ ውሂብ (እንደ ሻ ሃሽ ወይም ልክ ቃላት)

በእኛ ሁኔታ ፣ የ AES ቁልፍን በአንድ ማስገቢያ ውስጥ እናስቀምጣለን።

ደረጃ 3 1. የወረዳውን መሻት

1. የወረዳውን መሻት
1. የወረዳውን መሻት
1. የወረዳውን መሻት
1. የወረዳውን መሻት

1. የወረዳው ንድፍ

የዚህ ወረዳ ዕቅድ በጣም ቀላል ነው!

ምክሩ በ 2.0V እና 5.5V መካከል ስለሆነ 3.3V ኃይልን መጠቀም አለብዎት ፣ ግን እኔ 3.3V ን መጠቀም እመርጣለሁ።

ለዚህ ቺፕ ፣ በመደበኛነት በቺፕ ጥግ ላይ ነጥብ አለዎት ፣ ይህ ነጥብ የዚህ ሰሌዳ ፒን 1 ነው። የ Atecc608a ከፍተኛ እይታን በፒን ቁጥር አክዬአለሁ ምክንያቱም 8-Lead SOIC ስለሆነ ቺፕው በጣም ትንሽ ነው።

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

ምክሩ በ 2.0V እና 5.5V መካከል ስለሆነ 3.3V ኃይልን መጠቀም አለብዎት ፣ ግን እኔ 3.3V ን መጠቀም እመርጣለሁ።

እኔ የ Atecc608a ከፍተኛ እይታን ጨመርኩ ምክንያቱም 8-Lead SOIC ስለሆነ ቺፕው በጣም ትንሽ ነው። ከፈለጉ ፣ ስለዚህ አቅራቢዎች አንዳንድ ሰሌዳ በቺፕ መሸጫ ይገነባሉ ፣ ለእርስዎ ቀላል ሊሆን ይችላል።

ማስጠንቀቂያ - በእኔ ሁኔታ ፣ በአርዲኖ እና በቺፕ ኤስዲኤ (እንዲሁም ለ SDL) መካከል ተከላካይ ማከል አለብኝ። ለእያንዳንዱ 4.7Kohm resistor አክዬአለሁ።

ደረጃ 4: 2. የቺፕ ውቅር (Atecc608a)

የምስጠራ ወይም ዲክሪፕት (ዲክሪፕት) ተግባር ከመጠቀምዎ በፊት ቺፕውን ማዋቀር ያስፈልግዎታል። በዚህ ደረጃ ፣ ለዚህ ቺፕ ውቅር ማድረግ ያለብዎትን እያንዳንዱን ደረጃዎች በዝርዝር እገልጻለሁ።

ማስጠንቀቂያ -ይህ እርምጃ በጣም ያስመጣል እና ዞኖችን ከማብቃቱ በፊት ከቆለፉ እነሱን ማሻሻል አይችሉም።

ቀደም ሲል እንደተገለፀው ይህ ቺፕ ሁለት ዞኖችን አግኝቷል-

  1. ዞን አዋቅር
  2. የውሂብ ዞን

ውቅረቱ ዞን የ 128 ባይት መጠን አግኝቷል ነገር ግን የመጀመሪያዎቹ 16 ባይቶች ሊቀየሩ አይችሉም።

ይህንን ቺፕ ለማዋቀር ሁለት እርምጃዎችን መከተል ያስፈልግዎታል። እያንዳንዱን ደረጃዎች በቅደም ተከተል መከተል በጣም አስፈላጊ ነው ፣ አለበለዚያ ውቅርዎ አይሰራም ፣ እና ቺፕዎ ተቆልፎ ጥቅም ላይ የማይውል ይሆናል። እነዚያ እርምጃዎች -

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

መረጃ

ከዚህ በታች የእነሱን የኮንሴፕሬሽን ደረጃ ከኮድዬ ጋር በዝርዝር እገልጻለሁ ፣ ግን ምንም አይጨነቅም ፣ በ Github ውስጥ ሙሉ የማዋቀር ምሳሌን ጨመርኩ። በእያንዳንዱ ተግባራት ላይ አስተያየቶችን አደርጋለሁ ፣ እና ለእርስዎ *.ino ፋይል ከእያንዳንዱ እርምጃ ጋር ለእርስዎ ይገኛል።

  • የእኔ Github: የእኔ Github
  • የምሳሌ ዱካ ውቅር: config_example.ino

የመጀመሪያው ደረጃ - የውቅረት አብነት ይፍጠሩ

ቀደም ሲል እንደተገለፀው ፣ የማዋቀሪያው ዞን የ 128 ቢት መጠን ያገኛል ፣ ግን የመጀመሪያዎቹ 16 ቢቶች ሊለወጡ አይችሉም። ይህ ዞን ከበርካታ ክፍሎች የተዋቀረ ነው ፣ ግን ለዚህ ፕሮጀክት የዚህን ውቅረት ዞን 3 ክፍሎች ብቻ ማወቅ ያስፈልግዎታል

  1. ባይቶች 16 -> ይህ የቺፕው I2C አድራሻ ነው
  2. ባይቶች ከ 20 እስከ 51 -> ለዚህ ቺፕ 16 ቦታዎች የመጫወቻውን ዓይነት እዚህ መለወጥ ይችላሉ
  3. ባይቶች ከ 96 እስከ 127 -> በእያንዳንዱ ማስገቢያ ውስጥ ጥቅም ላይ የዋለውን የቁልፍ ዓይነት ወይም የውሂብ ዓይነት እዚህ ማዘጋጀት ይችላሉ።

(የዚህ ሁሉ ዞን ተጨማሪ ማብራሪያ ከፈለጉ እባክዎን ሰነዱን ያንብቡ (ገጽ 13 ፣ ክፍል 2.2))

እዚህ ፣ እያንዳንዱ ቺፕ (ውቅር) የ 112 ባይት እያንዳንዱ ባይት/ክፍሎች በዝርዝር አስቀምጫለሁ። ይህ ምሳሌ ነው ፣ እያንዳንዱ የተገዛ ቺፕ የተለየ ውቅር ሊኖረው ይችላል-

0xC0 ፣ // I2C አድራሻ

0x00 ፣ 0x00 ፣ 0x00 ፣ 0x83 ፣ 0x20 ፣ // ማስገቢያ ውቅር መክተቻ 1 0x85 ፣ 0x20 ፣ // ማስገቢያ ውቅር ማስገቢያ 2 0x8F ፣ 0x20 ፣ // የቁማር ውቅር ማስገቢያ 3 0xC4 ፣ 0x8F ፣ // የቁማር ውቅር ማስገቢያ 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 ፣ // ማስገቢያ Config ማስገቢያ 15 0xAF ፣ 0x8F ፣ // ማስገቢያ Config ማስገቢያ 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 ፣ 0xFF ፣ 0xFF ፣ 0x00 ፣ 0x00 ፣ 0x00 0x00 ፣ 0x00 ፣ 0x33 ፣ 0x00 ፣ // የቁልፍ ውቅር ማስገቢያ 1 0x33 ፣ 0x00 ፣ // የቁልፍ ውቅር ማስገቢያ 2 0x33 ፣ 0x00 ፣ // የቁልፍ ውቅር ማስገቢያ 3 0x1C ፣ 0x00 ፣ // የቁልፍ ውቅር ማስገቢያ 4 0x1C ፣ 0x00 ፣ // ቁልፍ ውቅር ማስገቢያ 5 0x 1C ፣ 0x00 ፣ // የቁልፍ ውቅር ማስገቢያ 6 0x1C ፣ 0x00 ፣ // የቁልፍ ውቅር ማስገቢያ 7 0x3C ፣ 0x00 ፣ // የቁልፍ ውቅር ማስገቢያ 8 0x1A ፣ 0x00 ፣ // የቁልፍ ውቅር ማስገቢያ 9 0x3A ፣ 0x00 ፣ // የቁልፍ ውቅር ማስገቢያ 10 0x1A ፣ 0x00 ፣ // የቁልፍ ውቅር ማስገቢያ 11 0x3A ፣ 0x00 ፣ // የቁልፍ ውቅር ማስገቢያ 12 0x3A ፣ 0x00 ፣ // የቁልፍ ውቅር ማስገቢያ 13 0x3C ፣ 0x00 ፣ // የቁልፍ ውቅር ማስገቢያ 14 0x3C ፣ 0x00 ፣ // የቁልፍ ውቅር ማስገቢያ 15 0x1C ፣ 0x00 // የቁልፍ ውቅር ማስገቢያ 16

እንደሚታየው ፣ ይህንን ውቅር የበለጠ ለመረዳት በዚህ ኮድ ውስጥ አንዳንድ አስተያየቶችን አስቀምጫለሁ።

በጉዳይዎ ውስጥ ሶስት ነገሮችን ብቻ መረዳት ያስፈልግዎታል

  1. ባይቶች 16 -> ይህ የቺፕው I2C አድራሻ ነው
  2. ባይቶች ከ 20 እስከ 51 -> ለዚህ ቺፕ 16 ቦታዎች የመጫወቻውን ዓይነት እዚህ መለወጥ ይችላሉ
  3. ባይት 96 እስከ 127 -> በእያንዳንዱ ማስገቢያ ውስጥ ጥቅም ላይ የዋለውን የቁልፍ ዓይነት ወይም የውሂብ አይነት እዚህ ማዘጋጀት ይችላሉ።

ሁሉንም ነገር ለማብራራት የተወሳሰበ ስለሆነ እኔ የማዋቀሩን ዓይነት እና ለምን ይህን እንዳልጠቀምኩ እና ሌላ እንዳልጠቀምኩ አላብራራም። ተጨማሪ መረጃ ከፈለጉ ወደ ሰነዱ ይሂዱ ፣ ገጽ 16 ክፍል 2.2.1 ለ “SlotConfig” እና ገጽ 19 ክፍል 2.2.5 ለ “KeyConfig”

ለዚህ ምሳሌ ፣ የ AES ቁልፍን ለማከማቸት ማስገቢያ 9 ን ይጠቀማሉ።

ለእዚህ ፣ እኛ ማስቀመጥ አለብን (ከፈለጉ ፣ ከላይ ያለውን ምሳሌ መገልበጥ ይችላሉ ፣ ማሻሻያው በእሱ ውስጥ ተከናውኗል)

  1. ባይት 36 = 0x8F
  2. ባይት 37 = 0x0F
  3. ባይት 112 = 0x1A
  4. ባይት 113 = 0x00

ይህንን ውቅር ለምን አዘጋጀሁ - ለእያንዳንዱ የዚህ ቺፕ ማስገቢያ ፣ ለቺፕ ምን ዓይነት ውሂብ እንደሚከማች ለመናገር ግቤቶችን ማዘጋጀት ይችላሉ። በርካታ መለኪያዎች አሉዎት

  • ማስገቢያ መጻፍ ወይም ማንበብ (ግልጽ ወይም ኢንክሪፕት እርምጃ)
  • የተከማቸ የውሂብ አይነት (የኢሲሲ ቁልፍ ፣ የህዝብ ቁልፍ ፣ SHA ሃሽ ፣ AES ቁልፍ…)
  • ማስገቢያ ሊቆለፍ ይችላል
  • የቁልፍ ማመንጨት ይፈቀዳል

በባይት 36 እና 37 ወደ "0x0F8F" ተዘጋጅቷል

  • ውሂቡ በፅዳት ውስጥ ሊፃፍ ይችላል
  • የዚህ ማስገቢያ ይዘቶች ምስጢራዊ ናቸው እና ሊነበቡ አይችሉም
  • ማስገቢያ ለ CheckMac ቅጂ ትዕዛዝ ጥቅም ላይ ሊውል አይችልም

በባይት 112 እና 113 ወደ «0x001A» ተዘጋጅቷል

ማስገቢያ እስከ አራት AES 128-ቢት የተመጣጠነ ቁልፎችን (KeyType = 0x6) ማከማቸት ይችላል

ሁለተኛ ደረጃ - ይህንን ውቅር ይፃፉ

ቺፕ በእኛ ውቅረት ስለምናዘጋጅ ይህ እርምጃ በጣም አስፈላጊ ነው እና ይህ ውቅረት ጥሩ ካልሆነ ይህንን ቺፕ ይጠቀማሉ።

ግን አይጨነቁ ፣ ውቅሩ እስካልተቆለፈ ድረስ ፣ የእርስዎን ውቅር መለወጥ ይችላሉ።

እዚህ ፣ ይህ ኮድ ውቅሩን ወደ ቺፕ ለመፃፍ የሚያገለግል ነው-

/** / አጭር ወደ ቺፕ አዲስ ውቅር ይጻፉ።

* / param [ውስጥ] cfg ሎጂካዊ በይነገጽ ውቅር። አንዳንድ አስቀድሞ የተገለጹ * ውቅሮች በ atca_cfgs.h * / param [in] config Array uint8_t ውቅረት (ርዝመት 112) * / param [in] ሌን የውቅረት ድርድር መጠን * / ATCA_SUCCESS ን በስኬት ይመልሱ ፣ አለበለዚያ የስህተት ኮድ። */ ATCA_STATUS write_configuration (ATCAIfaceCfg *cfg ፣ uint8_t *config, size_t len) {ከሆነ (ሌን! = 112) ATCA_BAD_PARAM ን ይመልሱ ፤ ATCA_STATUS ሁኔታ; ሁኔታ = atcab_init (cfg); ከሆነ (ሁኔታ == ATCA_SUCCESS) {// ውቅሩን ድርድር ወደ ቺፕ // መፃፍ በ 16 ባይት (16 የመጀመሪያ ባይት ሊፃፍ አይችልም) ሁኔታ = atcab_write_bytes_zone (ATCA_ZONE_CONFIG ፣ 0 ፣ 16 ፣ (uint8_t *) ማዋቀር ፣ ሌን) ፤ የመመለሻ ሁኔታ; } የመመለስ ሁኔታ; }

ይህ ተግባር በቺፕ ውስጥ ውቅርዎን ይጽፋል።

ሦስተኛ ደረጃ - የማዋቀሪያውን ዞን ይቆልፉ

ማስጠንቀቂያ -በዚህ ደረጃ ይጠንቀቁ ፣ ይህንን ዞን ከቆለፉ እና ውቅረትዎ ጥሩ ካልሆነ ፣ ቺፕው ጥቅም ላይ የማይውል እና ይህንን ዞን ማሻሻል አልቻሉም።

ለዚህ እርምጃ ይህንን ተግባር እንጠቀማለን-

/** አጭር መግለጫ አንድ DATA_ZONE ወይም CONFIG_ZONE ተቆልፎ እንደሆነ ያረጋግጡ

* / param [ውስጥ] cfg ሎጂካዊ በይነገጽ ውቅር። አንዳንድ አስቀድሞ የተገለጹ * ውቅሮች በ atca_cfgs.h * / param [በ] ዞን LOCK_ZONE_DATA ወይም LOCK_ZONE_CONFIG * / ATCA_SUCCESS ን በስኬት ይመልሱ ፣ አለበለዚያ የስህተት ኮድ። */ ATCA_STATUS check_lock_zone (ATCAIfaceCfg *cfg ፣ uint8_t ዞን) {ATCA_STATUS ሁኔታ; bool lock = ሐሰት; ከሆነ (ዞን! = (uint8_t) LOCK_ZONE_CONFIG && zone! = (uint8_t) LOCK_ZONE_DATA) ATCA_BAD_PARAM ከተመለሰ; ሁኔታ = atcab_init (cfg); ከሆነ (ሁኔታ == ATCA_SUCCESS) {if (ATCA_SUCCESS! = (status = atcab_is_locked (ዞን ፣ & lock)))) {ATCA_FUNC_FAIL ን ይመልሱ ፤ } ከሆነ (! መቆለፊያ) {ATCA_NOT_LOCKED ን ይመልሱ ፤ } ATCA_SUCCESS ን ይመልሱ ፤ } ATCA_BAD_PARAM ን ይመልሱ ፤ } check_lock_zone (& cfg ፣ LOCK_ZONE_CONFIG) ፤

አራተኛ ደረጃ - በአንድ ማስገቢያ ውስጥ የ AES ቁልፍ ይፃፉ

በዚህ ክፍል ውስጥ በቺፕ ውቅረት ውስጥ በገለፁት ማስገቢያ ውስጥ የግል የ AES ቁልፍን ያስቀምጣሉ።

ለዚህ ምሳሌ ፣ እኔ የቺፕውን የመጫወቻ ቁጥር 9 ን እጠቀማለሁ።

ማወቅ ያለብዎት -የዚህ ቺፕ ልዩ ባህሪ በ 4 ባይት ወይም በ 32 ባይት ብቻ በመያዣ ውስጥ ውሂብ መፃፍ ይችላሉ። ለ AES እኛ 128 ቢት ቁልፍ ስለዚህ 16 ባይት ውሂብ ያስፈልገናል። ስለዚህ 32 ባይት ውሂብ እንዲኖረን በዚህ ማስገቢያ ውስጥ እያንዳንዳቸው በ 16 ባይት ቁልፍ ለመጻፍ ወሰንኩ።

አሁን ፣ ያገለገለውን ኮድ አሳያችኋለሁ -

/** / አጭር መግለጫ በተሰጠው ማስገቢያ ውስጥ የ AES ቁልፍ ይፃፉ። * / param [ውስጥ] cfg ሎጂካዊ በይነገጽ ውቅር። አንዳንድ ቅድመ -የተገለጹ * ውቅሮች በ atca_cfgs.h * / param [በ] ቁልፍ ቁልፍ ማስገቢያ ቁጥር * / param [ውስጥ] የውሂብ ቁልፍ ቁልፍ ድርድር uint8_t * / param [in] ሌን የቁልፍ ድርድር መጠን * / ATCA_SUCCESS ን በስኬት ይመልሱ ፣ አለበለዚያ የስህተት ኮድ። */ ATCA_STATUS write_key_slot (ATCAIfaceCfg *cfg ፣ uint8_t ቁልፍ ፣ uint8_t *datakey ፣ size_t ሌን) {ከሆነ (ቁልፍ 16) ATCA_BAD_PARAM ቢመለስ ፤ ከሆነ (ሌን! = 32) ATCA_BAD_PARAM ን ይመልሱ ፤ ATCA_STATUS ሁኔታ = atcab_init (cfg); ከሆነ (ሁኔታ == ATCA_SUCCESS) {status = atcab_write_zone (ATCA_ZONE_DATA ፣ (uint16_t) ቁልፍ ፣ 0 ፣ 0 ፣ የውሂብ ቁልፍ ፣ 32); ከሆነ (ሁኔታ! = ATCA_SUCCESS) የመመለሻ ሁኔታ; } የመመለስ ሁኔታ; }

ለዚህ ምሳሌ ፣ እያንዳንዳቸው 16 ባይት ሁለት የ AES ቁልፎችን እጠቀማለሁ-

// የ AES ቁልፍ (ሌን 32) uint8_t example_of_key [32] = "AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA"; _key_slot ጻፍ (& cfg ፣ 9 ፣ ምሳሌ_የቁልፍ ፣ የመጠን (ምሳሌ_ቁልፍ));

ይህ እርምጃ ጥሩ ከሆነ ፣ አሁን “የውሂብ ቀጠናውን ቆልፍ” የመጨረሻውን ደረጃ ማለፍ አለብዎት

የመጨረሻው ደረጃ የውሂብ ቀጠናውን ይቆልፉ

ማስጠንቀቂያ -በዚህ ደረጃ ይጠንቀቁ ፣ ይህንን ዞን ከቆለፉ እና ውሂብዎ ካልተዋቀረ ፣ ቺፕው ጥቅም ላይ የማይውል ሲሆን ይህንን ዞን ማሻሻል አይችሉም።

ለዚህ እርምጃ ይህንን ተግባር እንጠቀማለን-

/** አጭር መግለጫ አንድ DATA_ZONE ወይም CONFIG_ZONE ተቆልፎ እንደሆነ ያረጋግጡ

* / param [ውስጥ] cfg ሎጂካዊ በይነገጽ ውቅር። አንዳንድ አስቀድሞ የተገለጹ * ውቅሮች በ atca_cfgs.h * / param [በ] ዞን LOCK_ZONE_DATA ወይም LOCK_ZONE_CONFIG * / ATCA_SUCCESS ን በስኬት ይመልሱ ፣ አለበለዚያ የስህተት ኮድ። */ ATCA_STATUS check_lock_zone (ATCAIfaceCfg *cfg ፣ uint8_t ዞን) {ATCA_STATUS ሁኔታ; bool lock = ሐሰት; (ዞን! = (uint8_t) LOCK_ZONE_CONFIG && zone! = (uint8_t) LOCK_ZONE_DATA) ATCA_BAD_PARAM ን ይመልሱ ፤ ሁኔታ = atcab_init (cfg); ከሆነ (ሁኔታ == ATCA_SUCCESS) {if (ATCA_SUCCESS! = (status = atcab_is_locked (ዞን ፣ & lock)))) {ATCA_FUNC_FAIL ን ይመልሱ ፤ } ከሆነ (! መቆለፊያ) {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 ቢት) አግኝቷል ፣ AES 128 ቢት ብቻ ይቻላል

  1. AES የተለመደ
  2. AES ሲቢሲ
  3. AES GCM (ከጂኤፍኤም ሃሽ ጋር) (ለበለጠ ማብራሪያ wikipedia ን ይመልከቱ)

ለመጠቀም ቀላል ለማድረግ ሁለት ተግባሮችን ፈጠርኩ-

  1. aes_cbc_encrypt
  2. aes_cbc_decrypt

እነዚያ ሁለት ተግባራት በእኔ Github ላይ ይገኛሉ።

ገለፃ

የ AES CBC አልጎሪዝም ለመጠቀም እመርጣለሁ ምክንያቱም ከመሠረታዊ AES 128 ቢት የበለጠ ደህንነቱ የተጠበቀ ነው። ይህ ስልተ ቀመር የእርስዎን ውሂብ ኢንክሪፕት ለማድረግ የመጀመሪያ ቬክተር ይጠቀማል።

መረጃ

ከዚህ በታች እያንዳንዱን የኢንክሪፕሽን እና ዲክሪፕት ዘዴን በዝርዝር እገልጻለሁ። ግን እነዚያ ሁለቱንም ተግባራት የሚጠቀም ለአርዱዲኖ ኮድ ጻፍኩ። በ Github ውስጥ ይህንን ኮድ ማየት ይችላሉ-

  • Github: የእኔ Github
  • የኮድ ምሳሌ “ኢንክሪፕት/ዲክሪፕት” - AES_crypto_example.ino

የመጀመሪያው ደረጃ - ውሂብዎን ኢንክሪፕት ያድርጉ

በዚህ ክፍል ውስጥ እንዴት ውሂብዎን ኢንክሪፕት እንደሚያደርጉ አሳያችኋለሁ።

በመጀመሪያ ይህንን ተግባር ያስፈልግዎታል

/** / አጭር የ AES CBC ስልተ ቀመር* / param [ውስጥ] cfg ሎጂካዊ በይነገጽ ውቅርን በመጠቀም መረጃን ኢንክሪፕት ያድርጉ። አንዳንድ ቅድመ -የተገለጹ * ውቅሮች በ atca_cfgs.h * / param [ውስጥ] ውሂብ ሊገባቸው የሚገቡ ቃላት (በ 16 መከፋፈል አለባቸው ፣ ከፍተኛው ርዝመት 240) ፣ ከፍተኛው ርዝመት 240) * / param [out] iv በ AES CBC ውስጥ ጥቅም ላይ የዋለ የመጀመሪያ ቬክተር (በዚህ var ውስጥ ያለውን ቬክተር ይመልሱ) * / param [out] ciphertext እዚህ ይመለሱ የሳይፈር ጽሑፍ * / param [in] ቁልፍ ማስገቢያ ቁጥር ቁልፍ * / ATCA_SUCCESS ን በስኬት ይመልሱ ፣ አለበለዚያ የስህተት ኮድ። */ ATCA_STATUS aes_cbc_encrypt (ATCAIfaceCfg *cfg ፣ uint8_t *ውሂብ ፣ int ሌን ፣ uint8_t *iv ፣ uint8_t *ciphertext ፣ uint8_t ቁልፍ) {atca_aes_cbc_ctx_t ctx; ከሆነ (ሌን> LIMIT_DATA_SIZE_CBC && len % 16! = 0) {Serial.print (F ("ስህተት ፦ ATCA_BAD_PARAM")); ተመለስ ATCA_BAD_PARAM; } uint8_t tmp_iv [IV_LENGTH_CBC]; uint8_t tmp_data [ሌን]; ATCA_STATUS ሁኔታ = atcab_init (cfg); ከሆነ (ሁኔታ == ATCA_SUCCESS) {status = atcab_aes_cbc_init (& ctx ፣ key ፣ 0 ፣ tmp_iv); ከሆነ (ሁኔታ! Serial.println (ሁኔታ ፣ HEX); መመለስ; } memcpy (iv ፣ tmp_iv ፣ IV_LENGTH_CBC); memcpy (tmp_data ፣ ውሂብ ፣ ሌን); int max = len / 16; ለ (int j = 0; j <max; j ++) {status = atcab_aes_cbc_encrypt_block (& ctx, & tmp_data [j * 16] ፣ & ciphertext [j * 16]); } ከሆነ (ሁኔታ! = ATCA_SUCCESS) {Serial.print (F ("ERROR Encrypt: atcab_aes_cbc_encrypt_block, Code Erx 0x")); Serial.println (ሁኔታ ፣ HEX); } የመመለስ ሁኔታ; } የመመለስ ሁኔታ; }

ይህ ተግባር ለመጠቀም ቀላል ነው ፣ ሁለት ነገሮችን ማዘጋጀት አለብዎት

  1. የ 16 ባይት ባዶ IV (የመጀመሪያ ቬክተር)
  2. ለማመስጠር ውሂብ (ከፍተኛ መጠን 240 ባይት)

እዚህ ምሳሌ “ይህንን ተግባር እንዴት እንደሚጠቀሙበት”።

በቁልፍ ቁጥሩ "9" ውስጥ በተፃፈበት "AAAAAAAAAAAAAAA" የሚለውን ቃል ማመስጠር እፈልጋለሁ።

ATCA_STATUS ሁኔታ = atcab_init (& cfg); (ሁኔታ! = ATCA_SUCCESS) {Serial.println (F ("atcab_init () አልተሳካም ኮድ -> 0x"))); Serial.println (ሁኔታ ፣ HEX); } uint8_t plaintext [16] = "AAAAAAAAAAAAAAA"; // የመጀመሪያው ጽሑፍ uint8_t iv [IV_LENGTH_CBC]; // የመጀመሪያ ቬክተር uint8_t cypherdata [sizeof (plaintext)]; // የውሂብ ኢንክሪፕት የተደረገ ሁኔታ = aes_cbc_encrypt (& cfg ፣ ግልፅ ጽሑፍ ፣ መጠን (ተራ ጽሑፍ) ፣ iv ፣ cypherdata ፣ 9);

ድርጊቱ ጥሩ ከሆነ ፣ በተለዋዋጭ “ሳይፈርፋታ” እና በተለዋዋጭ “IV” ውስጥ የመጀመሪያ ቬክተር ውስጥ ኢንክሪፕት የተደረገ ውሂብ ይኖርዎታል።

ጽሑፍዎን ዲክሪፕት ለማድረግ እነዚያን ሁለት ተለዋዋጮች ያቆዩዋቸው!

ሁለተኛው ደረጃ - ውሂብዎን ዲክሪፕት ያድርጉ

ውሂብዎን ዲክሪፕት ለማድረግ ሁለት ነገሮች ያስፈልጉዎታል

  1. የመጀመሪያው ቬክተር
  2. የሳይፈር ውሂብ (ኢንክሪፕት የተደረገ ውሂብ)

ውሂብዎን ዲክሪፕት ለማድረግ ፣ ይህንን ተግባር ያስፈልግዎታል

/** / አጭር የ AES CBC ስልተ ቀመር* / param [ውስጥ] cfg ሎጂካዊ በይነገጽ ውቅርን በመጠቀም መረጃን ዲክሪፕት ያድርጉ። አንዳንድ ቅድመ -የተገለጹ * ውቅሮች በ atca_cfgs.h * / param [in] ciphertext ቃላትን ለመተርጎም (በ 16 መከፋፈል አለበት ፣ ከፍተኛው ርዝመት 240), ከፍተኛ ርዝመት 240) * / param [in] iv የመጀመሪያ ቬክተር በ AES CBC * / param [out] ዓረፍተ -ነገር እዚህ ዲክሪፕት የተደረገውን ጽሑፍ * / param [in] ቁልፍ የቁልፍ ቁልፍ ቁጥር * / ATCA_SUCCESS ን በስኬት ይመልሱ ፣ አለበለዚያ የስህተት ኮድ። */ ATCA_STATUS aes_cbc_decrypt (ATCAIfaceCfg *cfg ፣ uint8_t *ciphertext ፣ int len, uint8_t *iv ፣ uint8_t *plaintext ፣ uint8_t ቁልፍ) {atca_aes_cbc_ctx_t ctx; ከሆነ (ሌን> LIMIT_DATA_SIZE_CBC || ሌን % 16! = 0) {Serial.print (ኤፍ ("ስህተት ዲክሪፕት: ATCA_BAD_PARAM")); ተመለስ ATCA_BAD_PARAM; } ATCA_STATUS ሁኔታ = atcab_init (cfg); ከሆነ (ሁኔታ == ATCA_SUCCESS) {status = atcab_aes_cbc_init (& ctx ፣ key ፣ 0 ፣ iv); ከሆነ (ሁኔታ! = ATCA_SUCCESS) {Serial.print (F ("ERROR ዲክሪፕት 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]); } ከሆነ (ሁኔታ! = ATCA_SUCCESS) {Serial.print (F ("ERROR ዲክሪፕት Serial.println (ሁኔታ ፣ HEX); } የመመለስ ሁኔታ; } የመመለስ ሁኔታ; }

የቀድሞውን መረጃዬን ዲክሪፕት ማድረግ እፈልጋለሁ (ከዚህ በታች ይመልከቱ ፣ የመጀመሪያ ደረጃ)። ለዚህ እኔ ይህንን አደርጋለሁ-

uint8_t plaintext [16] = "AAAAAAAAAAAAAAAAA"; uint8_t iv [IV_LENGTH_CBC]; uint8_t cypherdata [መጠን (ተራ ጽሑፍ)]; uint8_t decryptdata [sizeof (plaintext)]; ሁኔታ = aes_cbc_decrypt (& cfg ፣ cypherdata ፣ sizeof (cypherdata) ፣ iv ፣ decryptdata ፣ 9); ከሆነ (ሁኔታ == ATCA_SUCCESS) {Serial.print ("ዲክሪፕት የተደረገ ጽሑፍ ነው"); ለ (size_t i = 0; i <sizeof (decryptdata); i ++) {Serial.print ((char) decryptdata ); } Serial.println (""); } ሌላ {// ለ ኮድ Error Serial.print (ኤፍ ("ዲክሪፕት ማድረግ | ኮድ ስህተት 0x") ፋይል atca_status.h ን ይመልከቱ); Serial.println (ሁኔታ ፣ HEX); መመለስ; }

ድርጊቱ ጥሩ ከሆነ ፣ በተለዋዋጭ “ዲክሪፕታታ” ውስጥ ዲክሪፕት የተደረገ ውሂብ ይኖርዎታል።

አሁን ከቺፕ Atecc608a ጋር ምስጠራ እና ዲክሪፕት እንዴት እንደሚጠቀሙ ያውቃሉ

ደረጃ 6 5. ይህንን ቺፕ ለምን መጠቀም ያስፈልግዎታል?

መረጃዎን መደበቅ እና በገመድ አልባ መላክ ወይም በቀላሉ ማከማቸት ስለሚችሉ የተመሰጠረ ውሂብ በጣም ጠቃሚ ነው።

አንዳንድ የአጠቃቀም ምሳሌ እዚህ አለ

  1. የተከማቸ ውሂብ ወደ ውጫዊ EEPROM - የውጫዊ EEPROM መረጃን ደህንነት መጠበቅ ይችላሉ እና አንድ ሰው አሁንም ይህ EEPROM ከሆነ ፣ ዲክሪፕት ለማድረግ ቁልፉን እና IV ን ይፈልጋል።
  2. የገመድ አልባ ውሂብን ይላኩ - ይህንን ኢንክሪፕት የተደረገ ውሂብ በገመድ አልባ (nrf24L01 ፣ RFM95W…) መላክ ይችላሉ እና የሆነ ሰው ውሂብዎን ከጠለፈ ይህ ውሂብ ደህንነቱ የተጠበቀ ይሆናል
  3. የተከማቸ የይለፍ ቃል

በዚህ ቺፕ ብዙ ነገሮችን ማድረግ ይችላሉ። በበርካታ ፕሮጀክቶች ውስጥ ሊያገለግል ይችላል። ጊዜ ካለዎት ይህንን ቺፕ የሚጠቀሙት በየትኛው ፕሮጀክት ነው በሉኝ?

አንድ የመጨረሻ ምክር ፣ አንዳንድ ገመድ አልባ ፕሮጀክት ከገነቡ ወይም አንዳንድ ጥሬ መረጃዎችን ካከማቹ ፣ ጥንቃቄ ያድርጉ ፣ ደህንነት በጣም አስፈላጊ ነው እና “ኖቢ” ውሂብዎን ለመጥለፍ ወይም ለመስረቅ እንዴት ቀላል እንደሆነ ካወቁ። አሁን በይነመረብ ፣ እርስዎን “ለመጥለፍ” ብቻ በኮምፒውተራቸው ላይ ለማስጀመር ሁሉም ስክሪፕቶች ሊኖራቸው ይችላል!

ደረጃ 7 መደምደሚያ

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

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

ተዝናናበት.

የሚመከር: