جدول المحتويات:

الأمان مع الأردوينو: Atecc608a: 7 خطوات
الأمان مع الأردوينو: Atecc608a: 7 خطوات

فيديو: الأمان مع الأردوينو: Atecc608a: 7 خطوات

فيديو: الأمان مع الأردوينو: Atecc608a: 7 خطوات
فيديو: Webinar: IoT Security | Arduino 2024, يوليو
Anonim
الأمان مع الأردوينو: Atecc608a
الأمان مع الأردوينو: Atecc608a
الأمان مع الأردوينو: Atecc608a
الأمان مع الأردوينو: Atecc608a

عنوان

مرحبا بالجميع !

هذا هو أول مقال Instructables لي ، لذا آمل أن يكون ممتعًا لكم جميعًا.

في هذا المقال ، سأشرح لك كيفية استخدام شريحة صغيرة تسمى "ATECC608A" توفر أدوات أمان متعددة.

تم تصميم هذه الشريحة بواسطة MicroChip وهي الإصدار الأخير من "شريحة CryptoAuthentication". قبل هذا الإصدار ، كان هناك "ATSHA204A" و "ATECC508A".

لماذا قررت استخدام الإصدار الأخير وليس الإصدار السابق؟

هذا الإصدار هو الشريحة الأكثر تقدمًا ولديه وظائف لا يحتوي عليها الإصدار القديم (على سبيل المثال: وحدة AES ، وحدة حماية IO …).

لماذا هذا المشروع؟

أنا أعمل في مجال الأمن السيبراني وكجميع أحببت البرمجة والإلكترونيات. أثناء دراستي ، أحضر مؤتمرًا مع متخصص في أمن إنترنت الأشياء الذي أوضح لنا أن الصناعة لا تستخدم الأمن في كائن إنترنت الأشياء الخاص بهم. لقد أظهرت لنا قفلًا يمكن فتحه بهاتفك الذكي عن طريق البلوتوث. على القفل ، جملة تقول "هذا القفل أكثر أمانًا من قفل المفتاح!". هذه الجملة تجعله يبتسم وقام بتعديل الجملة "هذا القفل هو أسوأ قفل تم بناؤه على الإطلاق!".

لقد أوضح لنا بجهاز الكمبيوتر الخاص به وجهاز استشعار Bluetooth أن كل أمر يرسله الهاتف الذكي هو نفسه في كل مرة وأنه من السهل جدًا نسخ هذا الأمر وإرساله باستخدام هاتفك الذكي. وأوضح لنا أن "الأمن" مقابل "الصناعي" ليس هو المشكلة الرئيسية. لقد أظهر لنا شرائح (أقل من 0.60 دولار) يمكن أن تضيف طبقة من الأمان إلى هذه الكائنات.

بعد هذا العرض التوضيحي ، حاولت العثور على بعض المشاريع مفتوحة المصدر التي تضيف طبقة أمان إلى كائن إنترنت الأشياء ولكني لم أجده مطلقًا.

لذلك قررت العمل في مشروع يستخدم طبقة الأمان للاتصال بين كائنين من كائنات إنترنت الأشياء.

ما هي فكرتي؟

أثناء الاتصال بين جهازي إنترنت الأشياء ، يمكن أن توجد هجمات متعددة: رجل معتدل ، نسخة من المعلومات والمزيد.. لذا فكرتي بسيطة للغاية:

  1. استخدام البيانات المشفرة بين اثنين أو أكثر من عناصر إنترنت الأشياء.
  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 مع تعليقات لكل وظيفة. إذا كانت لديك بعض الأسئلة حول الكود الخاص بي أو هذا المشروع ، فسأكون سعيدًا بالإجابة عليها.

جيثب بلدي: جيثب بلدي

الخطوة 2: تحذير بخصوص Atecc608a

تحذير بخصوص Atecc608a
تحذير بخصوص Atecc608a

شريحة Atecc608a ليست شريحة "سهلة".

أولاً ، يخضع توثيق هذه الشريحة لاتفاقية عدم الإفشاء ، لذا لن تجدها كاملة على الإنترنت. ولكن لا توجد مشكلة في ذلك ، ورقة البيانات الخاصة بالإصدار السابق متوفرة على Internet Datasheet Complete ATECC508A.

ثانيًا ، عند استخدام هذه الشريحة ، فأنت بحاجة إلى قفل تكوينها ومن المستحيل تعديل تكوين الشريحة إذا كانت مقفلة. لذا كن حذرًا عندما تقوم بإغلاق منطقة التكوين ومنطقة البيانات.

ثالثًا ، المكتبة المكتوبة بلغة C كبيرة جدًا وكاملة ، لذا عليك قراءة توثيق الوظائف التي ستستخدمها من قبل.

رابعًا ، كتبت المكتبة لهذه الشريحة لا تعمل مع Arduino UNO ، لكنها أضافت الوظائف التي تحتاجها للعمل مع Arduino UNO.

الرقاقة ATECC608A

يمكنك التواصل مع هذه الشريحة عن طريق I2C. يمكن تعديل عنوان هذه الشريحة في التكوين.

تحتوي هذه الشريحة على 16 فتحة مختلفة يمكن أن تحتوي على أنواع مختلفة من البيانات:

  1. مفتاح ECC (خاص أو عام)
  2. مفتاح AES
  3. بيانات أخرى (مثل Sha hash أو مجرد كلمات)

في حالتنا ، سنخزن مفتاح AES في فتحة واحدة.

الخطوة 3: 1. تصميم الدائرة

1. تصميم الدائرة
1. تصميم الدائرة
1. تصميم الدائرة
1. تصميم الدائرة

1. تصميم الدائرة

مخطط هذه الدائرة بسيط للغاية!

تحتاج إلى استخدام قوة 3.3 فولت لأن التوصية تتراوح بين 2.0 فولت و 5.5 فولت لكني فضلت استخدام 3.3 فولت.

بالنسبة لهذه الشريحة ، عادةً ما يكون لديك نقطة على أحد أركان الشريحة ، وهذه النقطة هي السن 1 في هذه اللوحة. لقد أضفت المنظر العلوي لـ Atecc608a برقم PIN لأنه عبارة عن 8-Lead SOIC لذا فإن الشريحة صغيرة جدًا.

  1. أردوينو 3.3 فولت -> رقم التعريف الشخصي 8 (Atecc608a)
  2. أردوينو أرضي -> PIN 4 (Atecc608a)
  3. ARDUINO A4 (SDL) -> PIN 5 (Atecc608a)
  4. ARDUINO A5 (SCL) -> PIN 6 (Atecc608a)

تحتاج إلى استخدام قوة 3.3 فولت لأن التوصية تتراوح بين 2.0 فولت و 5.5 فولت لكني فضلت استخدام 3.3 فولت.

لقد أضفت المنظر العلوي لـ Atecc608a لأنه عبارة عن 8-Lead SOIC لذا فإن الشريحة صغيرة جدًا. إذا كنت تفضل ذلك ، يقوم الموردون ببناء بعض الألواح باستخدام لحام الرقاقة ، فقد يكون ذلك أسهل بالنسبة لك.

تحذير: في حالتي ، لا بد لي من إضافة مقاوم بين SDA الخاص بـ Arduino والشريحة (أيضًا لـ SDL). أضفت مقاومة 4.7Kohm لكل منهما.

الخطوة 4: 2. تكوين الشريحة (Atecc608a)

قبل استخدام وظيفة التشفير أو فك التشفير ، تحتاج إلى تكوين الشريحة. في هذه الخطوة ، سأفصل كل الخطوات التي تحتاج إلى القيام بها لتهيئة هذه الشريحة.

تحذير: هذه الخطوة استيراد للغاية وإذا قمت بإغلاق المناطق قبل النهاية لا يمكنك تعديلها.

كما أوضحنا من قبل ، حصلت هذه الشريحة على منطقتين:

  1. منطقة التكوين
  2. منطقة البيانات

حصلت منطقة التكوين على حجم 128 بايت ولكن لا يمكن تعديل أول 16 بايت.

لتكوين هذه الشريحة ، تحتاج إلى اثنين اتبع هذه الخطوة. من المهم جدًا اتباع كل الخطوات بالترتيب وإلا فلن يعمل التكوين الخاص بك ، وسيتم قفل الشريحة الخاصة بك وغير قابلة للاستخدام. هذه الخطوات هي:

  1. قم بإنشاء قالب التكوين
  2. اكتب هذا القالب على الشريحة
  3. قفل منطقة التكوين
  4. اكتب مفتاح AES (128 بت) في الفتحة
  5. قفل منطقة البيانات

معلومة

فيما يلي أفصل كل خطوة من خطوات التكوين مع الكود الخاص بي ، ولكن لا داعي للقلق ، أضفت مثالاً كاملاً للتكوين في Github الخاص بي. أضع تعليقات على كل وظيفة ، ويتوفر ملف *.ino مع كل خطوة بالترتيب من أجلك.

  • جيثب بلدي: جيثب بلدي
  • مسار مثال التكوين: 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، // فتحة تكوين الفتحة 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 ، // فتحة تكوين المفتاح 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"

في هذا المثال ، ستستخدم الفتحة 9 لتخزين مفتاح AES.

لهذا ، نحتاج إلى وضع (إذا كنت بحاجة ، يمكنك نسخ المثال أعلاه ، تم إجراء التعديل فيه):

  1. البايت 36 = 0x8F
  2. البايت 37 = 0x0F
  3. البايت 112 = 0x1A
  4. البايت 113 = 0x00

لماذا قمت بتعيين هذا التكوين: لكل فتحة في هذه الشريحة ، يمكنك تعيين معلمات لتخبر الشريحة عن نوع البيانات التي سيتم تخزينها. لديك عدة معاملات:

  • يمكن كتابة الفتحة أو قراءتها (إجراء مسح أو تشفير)
  • نوع البيانات المخزنة (مفتاح ECC ، المفتاح العام ، SHA Hash ، مفتاح AES …)
  • يمكن أن تكون الفتحة قابلة للقفل
  • يُسمح بإنشاء مفتاح

مع تعيين البايتين 36 و 37 على "0x0F8F":

  • يمكن كتابة البيانات في المسح
  • محتويات هذه الفتحة سرية ولا يمكن قراءتها
  • لا يمكن استخدام الفتحة لأمر CheckMac Copy

مع تعيين البايتين 112 و 113 على "0x001A":

يمكن للفتحة تخزين ما يصل إلى أربعة مفاتيح متماثلة AES 128 بت (KeyType = 0x6)

الخطوة الثانية: اكتب هذا التكوين

هذه الخطوة مهمة للغاية لأننا سنضبط الشريحة بتكويننا وإذا لم يكن هذا التكوين جيدًا ، فستستخدم هذه الشريحة.

لكن لا تقلق ، طالما أن التكوين غير مؤمن ، يمكنك تعديل التكوين الخاص بك.

هنا ، هذا الرمز المستخدم لكتابة التكوين على الشريحة:

/ ** / باختصار اكتب تكوينًا جديدًا للرقاقة.

* / param [in] cfg تكوين الواجهة المنطقية. يمكن العثور على بعض التكوينات المحددة مسبقًا * في atca_cfgs.h * / param [in] config Array uint8_t of config (length 112) * / param [in] len Size of the configuration array * / return ATCA_SUCCESS on Success ، وإلا رمز خطأ. * / ATCA_STATUS write_configuration (ATCAIfaceCfg * cfg، uint8_t * config، size_t len) {if (len! = 112) إرجاع ATCA_BAD_PARAM؛ حالة ATCA_STATUS ؛ الحالة = atcab_init (cfg) ؛ if (status == ATCA_SUCCESS) {// اكتب صفيف التكوين للرقاقة // حشوة 16 بايت (لا يمكن كتابة 16 بايتًا أولًا) status = atcab_write_bytes_zone (ATCA_ZONE_CONFIG، 0، 16، (uint8_t *) config، len) ؛ حالة العودة } حالة الإرجاع ؛ }

ستكتب هذه الوظيفة التكوين الخاص بك في الشريحة.

الخطوة الثالثة: قفل منطقة التكوين

تحذير: كن حذرًا في هذه الخطوة ، إذا قمت بإغلاق هذه المنطقة وكان التكوين الخاص بك غير جيد ، فإن الشريحة غير قابلة للاستخدام ولا يمكنك تعديل هذه المنطقة

بالنسبة لهذا الإجراء ، سوف نستخدم هذه الوظيفة:

/ ** / brief تحقق مما إذا كان DATA_ZONE أو CONFIG_ZONE مغلقًا

* / param [in] cfg تكوين الواجهة المنطقية. يمكن العثور على بعض التكوينات المحددة مسبقًا * في atca_cfgs.h * / param [in] zone LOCK_ZONE_DATA أو LOCK_ZONE_CONFIG * / إرجاع ATCA_SUCCESS عند النجاح ، وإلا فسيكون هناك رمز خطأ. * / ATCA_STATUS check_lock_zone (ATCAIfaceCfg * cfg، uint8_t zone) {ATCA_STATUS status؛ قفل منطقي = خطأ ؛ إذا كانت (zone! = (uint8_t) LOCK_ZONE_CONFIG && zone! = (uint8_t) LOCK_ZONE_DATA) ترجع ATCA_BAD_PARAM ؛ الحالة = atcab_init (cfg) ؛ if (status == ATCA_SUCCESS) {if (ATCA_SUCCESS! = (status = atcab_is_locked (zone، & lock))) {return ATCA_FUNC_FAIL؛ } إذا (! قفل) {return ATCA_NOT_LOCKED ؛ } إرجاع ATCA_SUCCESS ؛ } إرجاع ATCA_BAD_PARAM ؛ } check_lock_zone (& cfg، LOCK_ZONE_CONFIG) ؛

الخطوة الرابعة: اكتب لك مفتاح AES في الفتحة

في هذا الجزء سوف تقوم بتعيين مفتاح AES الشخصي في الفتحة التي حددتها في تكوين الشريحة.

في هذا المثال ، سأستخدم رقم الفتحة 9 للرقاقة.

عليك أن تعرف: الميزة الخاصة لهذه الشريحة هي أنه يمكنك كتابة البيانات في فتحة فقط بمقدار 4 بايت أو 32 بايت. بالنسبة لـ AES ، نحتاج إلى مفتاح 128 بت حتى 16 بايت من البيانات. لذلك قررت الكتابة بمفتاح 16 بايت لكل مفتاح في هذه الفتحة للحصول على بيانات 32 بايت.

الآن سأريك الرمز المستخدم:

/ ** / باختصار اكتب مفتاح AES في فتحة معينة. * / param [in] cfg تكوين الواجهة المنطقية. يمكن العثور على بعض التكوينات * المحددة مسبقًا في atca_cfgs.h * / param [in] key key slot number * / param [in] datakey key array uint8_t * / param [in] len Size of the key array * / return ATCA_SUCCESS on 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) ؛ إذا (الحالة == ATCA_SUCCESS) {status = atcab_write_zone (ATCA_ZONE_DATA، (uint16_t) key، 0، 0، datakey، 32) ؛ إذا كانت (الحالة! = ATCA_SUCCESS) إرجاع الحالة ؛ } حالة الإرجاع ؛ }

في هذا المثال ، سأستخدم مفتاحي AES كل منهما 16 بايت:

// مثال على AES KEY (len 32) uint8_t example_of_key [32] = "AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA" ؛ write_key_slot (& cfg، 9، example_of_key، sizeof (example_of_key)) ؛

إذا كان هذا الإجراء جيدًا ، فعليك الآن اجتياز الخطوة الأخيرة "تأمين منطقة البيانات"

الخطوة الأخيرة: قفل منطقة البيانات

تحذير: كن حذرًا في هذه الخطوة ، إذا قمت بإغلاق هذه المنطقة ولم يتم تعيين بياناتك ، فإن الشريحة غير قابلة للاستخدام ولا يمكنك تعديل هذه المنطقة

بالنسبة لهذا الإجراء ، سوف نستخدم هذه الوظيفة:

/ ** / brief تحقق مما إذا كان DATA_ZONE أو CONFIG_ZONE مغلقًا

* / param [in] cfg تكوين الواجهة المنطقية. يمكن العثور على بعض التكوينات المحددة مسبقًا * في atca_cfgs.h * / param [in] zone LOCK_ZONE_DATA أو LOCK_ZONE_CONFIG * / إرجاع ATCA_SUCCESS عند النجاح ، وإلا فسيكون هناك رمز خطأ. * / ATCA_STATUS check_lock_zone (ATCAIfaceCfg * cfg، uint8_t zone) {ATCA_STATUS status؛ قفل منطقي = خطأ ؛ إذا كانت (zone! = (uint8_t) LOCK_ZONE_CONFIG && zone! = (uint8_t) LOCK_ZONE_DATA) ترجع ATCA_BAD_PARAM ؛ الحالة = atcab_init (cfg) ؛ if (status == ATCA_SUCCESS) {if (ATCA_SUCCESS! = (status = atcab_is_locked (zone، & lock))) {return ATCA_FUNC_FAIL؛ } إذا (! قفل) {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 بت) ، فقط AES 128 بت ممكن:

  1. AES طبيعي
  2. AES CBC
  3. AES GCM (مع تجزئة GFM) (انظر ويكيبيديا لمزيد من التوضيح)

لتسهيل الاستخدام ، قمت بإنشاء وظيفتين:

  1. aes_cbc_encrypt
  2. aes_cbc_decrypt

هاتان الوظيفتان متاحتان على جيثب الخاص بي.

شرح

اخترت استخدام خوارزمية AES CBC لأنها أكثر أمانًا من AES 128 بت الأساسية. تستخدم هذه الخوارزمية ناقل أولي لتشفير بياناتك.

معلومة

فيما يلي تفاصيل كل خطوة من خطوات طريقة التشفير وفك التشفير. لكنني كتبت رمزًا لـ Arduino يستخدم هاتين الوظيفتين. يمكنك رؤية هذا الرمز في جيثب الخاص بي:

  • جيثب: جيثب الخاص بي
  • مثال على رمز "تشفير / فك تشفير": AES_crypto_example.ino

الخطوة الأولى: تشفير بياناتك

في هذا الجزء ، سأوضح لك كيفية تشفير بياناتك.

ستحتاج أولاً إلى هذه الوظيفة:

/ ** / brief تشفير البيانات باستخدام خوارزمية AES CBC * / param [in] cfg تكوين الواجهة المنطقية. يمكن العثور على بعض التكوينات * المحددة مسبقًا في atca_cfgs.h * / param [in] data Words to encypt (يجب تقسيمها على 16 ، بحد أقصى 240) * / param [in] len length of Words to encypt (يجب تقسيمها على 16 ، max length 240) * / param [out] iv المتجه الأولي المستخدم في AES CBC (إرجاع المتجه في هذا var) * / param [out] ciphertext يُرجع هنا نص 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) {الحالة = 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 (الحالة ، 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]) ؛ } if (status! = ATCA_SUCCESS) {Serial.print (F ("ERROR Encrypt: atcab_aes_cbc_encrypt_block، Code Error 0x")) ؛ Serial.println (الحالة ، HEX) ؛ } حالة الإرجاع ؛ } حالة الإرجاع ؛ }

هذه الوظيفة سهلة الاستخدام ، عليك ضبط شيئين:

  1. 4 فارغ (متجه أولي) 16 بايت
  2. البيانات المطلوب تشفيرها (الحجم الأقصى 240 بايت)

هنا مثال "كيفية استخدام هذه الوظيفة".

أريد تشفير كلمة "AAAAAAAAAAAAAAA" ، مع كتابة مفتاحي في الفتحة رقم "9":

حالة ATCA_STATUS = atcab_init (& cfg) ؛ إذا (الحالة! = ATCA_SUCCESS) {Serial.println (F ("atcab_init () فشل: Code -> 0x")) ؛ Serial.println (الحالة ، HEX) ؛ } uint8_t plaintext [16] = "AAAAAAAAAAAAAAA" ؛ // النص الأصلي uint8_t iv [IV_LENGTH_CBC] ؛ // المتجه الأولي uint8_t cypherdata [sizeof (نص عادي)] ؛ // حالة تشفير البيانات = aes_cbc_encrypt (& cfg ، نص عادي ، sizeof (نص عادي) ، iv ، cypherdata ، 9) ؛

إذا كان الإجراء جيدًا ، فستحصل على البيانات المشفرة في المتغير "cypherdata" والمتجه الأولي في المتغير "IV".

احتفظ بهذين المتغيرين لفك تشفير النص الخاص بك!

الخطوة الثانية: فك تشفير بياناتك

لفك تشفير بياناتك ، ستحتاج إلى شيئين:

  1. الموجه الأولي
  2. بيانات Cypher (بيانات مشفرة)

لفك تشفير بياناتك ، ستحتاج إلى هذه الوظيفة:

/ ** / موجز فك تشفير البيانات باستخدام خوارزمية AES CBC * / param [in] cfg تكوين الواجهة المنطقية. يمكن العثور على بعض التكوينات * المحددة مسبقًا في atca_cfgs.h * / param [in] ciphertext Words to decypt (يجب تقسيمها على 16 ، بحد أقصى 240) * / param [in] len length of Words to decypt (يجب تقسيمها على 16 ، max length 240) * / param [in] iv المتجه الأولي لاستخدامه في AES CBC * / param [out] نص عادي يُرجع هنا النص الذي تم فك تشفيره * / param [in] key Slot number of the key * / return 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) {الحالة = atcab_aes_cbc_init (& ctx، key، 0، iv) ؛ if (status! = 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 (status! = 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 (نص عادي)] ؛ uint8_t فك تشفير [sizeof (نص عادي)] ؛ الحالة = aes_cbc_decrypt (& cfg ، cypherdata ، sizeof (cypherdata) ، iv ، decryptdata ، 9) ؛ إذا (الحالة == ATCA_SUCCESS) {Serial.print ("النص الذي تم فك تشفيره هو:") ؛ لـ (size_t i = 0 ؛ i <sizeof (فك تشفير البيانات) ؛ 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) ؛ إرجاع؛ }

إذا كان الإجراء جيدًا ، فستحصل على البيانات التي تم فك تشفيرها في المتغير "decryptdata".

الآن أنت تعرف كيفية استخدام التشفير وفك التشفير مع شريحة Atecc608a

الخطوة 6: 5. لماذا تحتاج إلى استخدام هذه الشريحة

تعتبر البيانات المشفرة مفيدة للغاية لأنه يمكنك إخفاء معلوماتك وإرسالها عبر الاتصال اللاسلكي أو تخزينها فقط.

هنا بعض الأمثلة على الاستخدام:

  1. البيانات المخزنة إلى EEPROM خارجي: يمكنك تأمين بيانات EEPROM الخارجية وإذا كان شخص ما لا يزال هذا EEPROM ، فسيحتاج إلى المفتاح والرابع لفك التشفير
  2. إرسال بيانات لاسلكية: يمكنك إرسال هذه البيانات المشفرة عن طريق الشبكة اللاسلكية (nrf24L01 ، RFM95W …) وإذا اعترض شخص ما بياناتك ، فستكون هذه البيانات آمنة
  3. كلمة مرور مخزنة

يمكنك القيام بأشياء متعددة باستخدام هذه الشريحة. يمكن استخدامه في مشاريع متعددة. إذا كان لديك الوقت ، قل لي في أي مشروع ستستخدم هذه الشريحة؟

نصيحة أخيرة ، إذا قمت ببناء مشروع لاسلكي أو تخزين بعض البيانات الأولية ، فكن حذرًا ، فالأمان مهم جدًا وإذا كنت تعرف كيف أنه من السهل على "المستجد" اعتراض أو سرقة بياناتك. الآن مع الإنترنت ، يمكن للجميع الحصول على برامج نصية لبدء تشغيلها على أجهزة الكمبيوتر الخاصة بهم فقط "لاختراقك"!

الخطوة 7: الخاتمة

آمل أن تكون هذه المقالة مفيدة لك. آسف إذا أخطأت في نصي ولكن اللغة الإنجليزية ليست لغتي الرئيسية وأنا أتحدث أفضل مما أكتب.

شكرا لقراءة كل شيء.

استمتع بها.

موصى به: