Mục lục:

Bảo mật với Arduino: Atecc608a: 7 bước
Bảo mật với Arduino: Atecc608a: 7 bước

Video: Bảo mật với Arduino: Atecc608a: 7 bước

Video: Bảo mật với Arduino: Atecc608a: 7 bước
Video: Secure Boot with ATECC608A 2024, Tháng bảy
Anonim
Bảo mật với Arduino: Atecc608a
Bảo mật với Arduino: Atecc608a
Bảo mật với Arduino: Atecc608a
Bảo mật với Arduino: Atecc608a

Đề tài

Chào mọi người !

Đây là Bài viết hướng dẫn đầu tiên của tôi vì vậy tôi hy vọng nó sẽ thú vị cho tất cả các bạn.

Trong bài viết này, tôi sẽ giải thích cho bạn cách sử dụng một chip siêu nhỏ có tên "ATECC608A" cung cấp nhiều công cụ bảo mật.

Con chip này được thiết kế bởi MicroChip và nó là phiên bản cuối cùng của "CryptoAuthentication chip". Trước phiên bản này, đã có "ATSHA204A" và "ATECC508A".

Tại sao tôi quyết định sử dụng phiên bản cuối cùng mà không phải phiên bản trước đó?

Phiên bản này là chip tiên tiến nhất và có các chức năng mà phiên bản cũ không có (Ví dụ: mô-đun AES, mô-đun bảo vệ IO…).

Tại sao lại là dự án này?

Tôi làm việc trong lĩnh vực An ninh mạng cũng như mọi người mà tôi yêu thích lập trình và điện tử. Trong quá trình học của mình, tôi có một cuộc hội thảo với một chuyên gia về Bảo mật IoT, người đã cho chúng tôi thấy rằng Công nghiệp không sử dụng Bảo mật trong đối tượng IoT của họ. Tôi đã cho chúng tôi xem một ổ khóa có thể mở bằng điện thoại thông minh của bạn bằng Bluetooth. Trên ổ khóa có ghi một câu "Ổ khóa này bảo mật nhất so với ổ khóa chìa khóa!". Câu này khiến anh ta mỉm cười và anh ta sửa thành câu "Ổ khóa này là ổ khóa tồi tệ nhất từng được chế tạo!".

Anh ấy đã cho chúng tôi xem bằng PC của riêng anh ấy và một bộ dò tìm Bluetooth rằng mọi lệnh được gửi bởi điện thoại thông minh đều giống nhau và rất đơn giản để sao chép lệnh này và gửi nó bằng điện thoại thông minh của bạn. Anh ấy giải thích với chúng tôi rằng "An ninh" đối với "Công nghiệp" không phải là vấn đề chính. Anh ấy đã cho chúng tôi xem những con chip (ít hơn 0,60 đô la) có thể thêm một lớp bảo mật cho những đối tượng này.

Sau phần trình diễn này, tôi đã cố gắng tìm một số dự án Mã nguồn mở có thêm lớp bảo mật vào đối tượng IoT nhưng tôi không bao giờ tìm thấy nó.

Vì vậy, tôi quyết định làm việc trên một dự án sử dụng lớp bảo mật để giao tiếp giữa hai đối tượng IoT.

Ý tưởng của tôi là gì?

Trong quá trình giao tiếp giữa hai Đối tượng IoT, có thể tồn tại nhiều cuộc tấn công: Người đàn ông nhẹ nhàng, Bản sao thông tin và hơn thế nữa.. Vì vậy, ý tưởng của tôi rất đơn giản:

  1. Sử dụng dữ liệu được mã hóa giữa hai hoặc nhiều đối tượng IoT.
  2. Nguồn cung cấp chi phí thấp
  3. Có thể hoạt động với Arduino UNO

Bây giờ tôi sẽ giải thích cho bạn cách tôi thực hiện bức tranh trừu tượng này với Arduino và chip Atecc608a. Trong bài viết này, tôi sẽ giải thích cho bạn cách sử dụng Arduino UNO với ATECC608A.

Tôi sẽ viết một bài báo về giao tiếp của hai đối tượng trong thời gian tới.

Quân nhu

Bạn cần một số thứ cho dự án này:

  1. Arduino UNO hoặc MEGA (Chip phải là Atmega 328 hoặc ATMEGA 2560)
  2. Chip Atecc608A (giá dưới 0,80 đô la mỗi chip, dễ dàng tìm thấy trên trang web nhà cung cấp của bạn)
  3. Bộ chuyển đổi SOIC 8 chân
  4. Một số dây và điện trở

Biểu dữ liệu của phiên bản trước của chip này (Atecc508a) có sẵn tại đây -> Biểu dữ liệu Atecc508a

Bước 1: Từng bước

Từng bước một
Từng bước một

Trong bài viết này, tôi sẽ chỉ cho bạn cách sửa đổi cấu hình của chip này và sau khi làm thế nào để mã hóa dữ liệu bằng Thuật toán AES CBC.

Chúng tôi sẽ làm theo các bước sau:

  1. Thiết kế của mạch
  2. Cấu hình của chip này
  3. Sử dụng mô-đun AES CBC
  4. Tại sao bạn cần sử dụng chip này

Đối với mỗi bước, tôi sẽ chi tiết mọi thứ cho bạn. Ngoài ra, tôi đã thêm mã của mình vào Github của mình với các nhận xét cho từng chức năng. Nếu bạn có một số câu hỏi về mã của tôi hoặc dự án này, tôi sẽ sẵn lòng trả lời.

My Github: Github của tôi

Bước 2: Cảnh báo về Atecc608a

Cảnh báo về Atecc608a
Cảnh báo về Atecc608a

Chip Atecc608a không phải là một con chip “dễ tính”.

Đầu tiên, tài liệu về chip này theo NDA nên bạn sẽ không tìm thấy nó đầy đủ trên Internet. Nhưng không có vấn đề gì cho điều này, biểu dữ liệu của phiên bản trước có sẵn trên Internet Datasheet Complete ATECC508A.

Thứ hai, khi bạn sử dụng chip này, bạn cần phải khóa cấu hình của nó và không thể sửa đổi cấu hình của chip nếu nó bị khóa. Vì vậy, hãy cẩn thận khi bạn sẽ khóa Vùng cấu hình và Vùng dữ liệu.

Thứ ba, thư viện viết bằng C rất lớn và đầy đủ, vì vậy bạn phải đọc tài liệu về các hàm mà bạn sẽ sử dụng trước đó.

Thứ tư, thư viện đã viết cho chip này không hoạt động với Arduino UNO, nhưng nó đã bổ sung các chức năng cần nó để hoạt động với Arduino UNO.

Chip ATECC608A

Bạn có thể giao tiếp với chip này bằng I2C. Địa chỉ của chip này có thể được sửa đổi trong cấu hình.

Con chip này chứa 16 khe cắm khác nhau có thể chứa các loại dữ liệu khác nhau:

  1. Khóa ECC (riêng tư hoặc công khai)
  2. Khóa AES
  3. Dữ liệu khác (như băm Sha hoặc chỉ các từ)

Trong trường hợp của chúng tôi, chúng tôi sẽ lưu trữ Khóa AES trong một khe.

Bước 3: 1. Mô tả mạch

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

1. Thiết kế của mạch

Giản đồ của mạch này rất đơn giản!

Bạn cần sử dụng nguồn 3.3V vì khuyến nghị là từ 2.0V đến 5.5V nhưng tôi thích sử dụng 3.3V hơn.

Đối với con chip này, thông thường bạn có một dấu chấm ở một góc của con chip, dấu chấm này chính là Chân số 1 của bo mạch này. Tôi đã thêm Chế độ xem trên cùng của Atecc608a với Số PIN vì nó là SOIC 8 chì nên chip rất nhỏ.

  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)

Bạn cần sử dụng nguồn 3.3V vì khuyến nghị là từ 2.0V đến 5.5V nhưng tôi thích sử dụng 3.3V hơn.

Tôi đã thêm chế độ xem Top của Atecc608a vì nó là SOIC 8-Lead nên chip rất nhỏ. Nếu bạn thích, vì vậy các nhà cung cấp xây dựng một số bo mạch bằng chất hàn chip, điều đó có thể dễ dàng hơn cho bạn.

Cảnh báo: Trong trường hợp của tôi, tôi phải thêm một điện trở giữa SDA của Arduino và Chip (cũng cho SDL). Tôi đã thêm một điện trở 4,7Kohm cho mỗi cái.

Bước 4: 2. Cấu hình chip (Atecc608a)

Trước khi sử dụng chức năng mã hóa hoặc giải mã, bạn cần phải cấu hình chip. Trong bước này, tôi sẽ trình bày chi tiết từng bước bạn cần làm đối với cấu hình của con chip này.

Cảnh báo: bước này rất cần nhập và nếu bạn khóa các vùng trước khi kết thúc, bạn không thể sửa đổi chúng.

Như đã giải thích trước đây, con chip này có hai vùng:

  1. Vùng cấu hình
  2. Vùng dữ liệu

Vùng cấu hình có kích thước 128 byte nhưng không thể sửa đổi 16 byte đầu tiên.

Để cấu hình chip này, bạn cần thực hiện theo hai bước sau. Điều rất quan trọng là phải làm theo từng bước theo thứ tự nếu không cấu hình của bạn sẽ không hoạt động và chip của bạn sẽ bị khóa và không thể sử dụng được. Các bước đó là:

  1. Tạo mẫu cấu hình
  2. Ghi mẫu này vào chip
  3. Khóa vùng cấu hình
  4. Viết Khóa AES của bạn (128 Bit) vào một chỗ trống
  5. Khóa vùng dữ liệu

Thông tin

Dưới đây, tôi trình bày chi tiết từng bước đối chiếu với mã của mình, nhưng đừng lo, tôi đã thêm một ví dụ đầy đủ về cấu hình trong Github của mình. Tôi đưa ra nhận xét về từng chức năng và tệp *.ino có sẵn với mỗi bước để bạn có thể thực hiện.

  • My Github: Github của tôi
  • Đường dẫn cấu hình mẫu: config_example.ino

Bước đầu tiên: Tạo mẫu cấu hình

Như đã giải thích trước đây, vùng cấu hình có kích thước 128 bit, nhưng 16 bit đầu tiên không thể thay đổi. Vùng này bao gồm nhiều phần, nhưng bạn chỉ cần biết 3 phần của vùng cấu hình này cho dự án này:

  1. Các byte 16 -> Đây là địa chỉ I2C của chip
  2. Các byte 20 đến 51 -> Bạn có thể sửa đổi ở đây loại Khe cắm cho 16 khe cắm của chip này
  3. Bytes 96 đến 127 -> Bạn có thể đặt ở đây Loại khóa hoặc dữ liệu được sử dụng trong mỗi vị trí.

(Nếu bạn cần giải thích thêm về tất cả vùng này, vui lòng đọc tài liệu (trang 13, phần 2.2))

Ở đây, tôi đưa ra chi tiết từng Byte / Phần của 112 byte cấu hình của một con chip. Đây là một ví dụ, mỗi con chip được mua có thể có một cấu hình khác nhau:

0xC0, // địa chỉ I2C

0x00, 0x00, 0x00, 0x83, 0x20, // Khe cấu hình khe 1 0x85, 0x20, // Khe cấu hình khe 2 0x8F, 0x20, // Khe cấu hình khe 3 0xC4, 0x8F, // Khe cấu hình khe 4 0x8F, 0x8F, // Cấu hình khe 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, // Cấu hình khe 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, // Cấu hình khe Vị trí 15 0xAF, 0x8F, // Cấu hình khe Vị trí 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, 0x00, 0x33, 0x00, // Vị trí cấu hình khóa 1 0x33, 0x00, // Vị trí cấu hình khóa 2 0x33, 0x00, // Vị trí cấu hình khóa 3 0x1C, 0x00, // Vị trí cấu hình khóa 4 0x1C, 0x00, // Khe cắm cấu hình chính 5 0x 1C, 0x00, // Vị trí cấu hình khóa 6 0x1C, 0x00, // Vị trí cấu hình khóa 7 0x3C, 0x00, // Vị trí cấu hình khóa 8 0x1A, 0x00, // Vị trí cấu hình khóa 9 0x3A, 0x00, // Vị trí cấu hình khóa 10 0x1A, 0x00, // Vị trí cấu hình khóa 11 0x3A, 0x00, // Vị trí cấu hình khóa 12 0x3A, 0x00, // Vị trí cấu hình khóa 13 0x3C, 0x00, // Vị trí cấu hình khóa 14 0x3C, 0x00, // Vị trí cấu hình khóa 15 0x1C, 0x00 // Khe cắm cấu hình khóa 16

Như đã thấy, tôi đặt một số nhận xét trong đoạn mã này để hiểu thêm về cấu hình này.

Trong trường hợp của bạn, chỉ cần hiểu ba điều:

  1. Các byte 16 -> Đây là địa chỉ I2C của chip
  2. Các byte 20 đến 51 -> Bạn có thể sửa đổi ở đây loại Khe cắm cho 16 khe cắm của chip này
  3. Byte 96 đến 127 -> Bạn có thể đặt ở đây Loại khóa hoặc dữ liệu được sử dụng trong mỗi vị trí.

Tôi sẽ không giải thích loại cấu hình và lý do tại sao tôi sử dụng cái này mà không phải cái khác vì rất phức tạp để giải thích mọi thứ. Nếu bạn cần thêm thông tin, hãy truy cập tài liệu, trang 16 phần 2.2.1 cho "SlotConfig" và trang 19 phần 2.2.5 cho "KeyConfig"

Đối với ví dụ này, bạn sẽ sử dụng khe cắm 9 để lưu trữ khóa AES.

Đối với điều này, chúng tôi cần đặt (nếu bạn cần, bạn có thể sao chép ví dụ ở trên, sửa đổi đã được thực hiện trong đó):

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

Tại sao tôi đặt cấu hình này: Đối với mỗi khe của chip này, bạn có thể đặt các thông số để cho chip biết loại dữ liệu sẽ được lưu trữ. Bạn có nhiều tham số:

  • Khe cắm có thể được ghi hoặc đọc (xóa hoặc mã hóa hành động)
  • Loại dữ liệu được lưu trữ (ECC key, Public Key, SHA Hash, AES Key…)
  • Khe cắm có thể được khóa
  • Cho phép tạo khóa

Với byte 36 và 37 được đặt thành "0x0F8F":

  • Dữ liệu có thể được ghi trong Clear
  • Nội dung của vị trí này là bí mật và không thể đọc được
  • Không thể sử dụng vị trí cho lệnh CheckMac Copy

Với byte 112 và 113 được đặt thành "0x001A":

Khe cắm có thể lưu trữ tối đa bốn khóa đối xứng 128-bit AES (KeyType = 0x6)

Bước thứ hai: Viết cấu hình này

Bước này rất quan trọng vì chúng ta sẽ đặt chip với cấu hình của mình và nếu cấu hình này không tốt thì bạn sẽ sử dụng chip này.

Nhưng đừng lo lắng, miễn là Cấu hình không bị khóa, bạn có thể sửa đổi cấu hình của mình.

Đây, đây là mã được sử dụng để ghi cấu hình vào chip:

/ ** / vắn tắt Viết một cấu hình mới cho chip.

* / param [in] cfg Cấu hình giao diện logic. Một số cấu hình * được xác định trước có thể được tìm thấy trong atca_cfgs.h * / param [in] config Mảng uint8_t của cấu hình (chiều dài 112) * / param [in] len Kích thước của mảng cấu hình * / return ATCA_SUCCESS khi thành công, nếu không sẽ là mã lỗi. * / ATCA_STATUS write_configuration (ATCAIfaceCfg * cfg, uint8_t * config, size_t len) {if (len! = 112) return ATCA_BAD_PARAM; Trạng thái ATCA_STATUS; status = atcab_init (cfg); if (status == ATCA_SUCCESS) {// Ghi cấu hình Mảng vào chip // Khoảng đệm 16 byte (không thể ghi 16 byte đầu tiên) status = atcab_write_bytes_zone (ATCA_ZONE_CONFIG, 0, 16, (uint8_t *) config, len); tình trạng trở lại; } trả về trạng thái; }

Chức năng này sẽ ghi cấu hình của bạn vào chip.

Bước thứ ba: khóa Vùng cấu hình

Cảnh báo: hãy cẩn thận với bước này, nếu bạn khóa Vùng này và cấu hình của bạn không tốt, chip không sử dụng được và bạn không thể sửa đổi vùng này

Đối với hành động này, chúng tôi sẽ sử dụng chức năng này:

/ ** / vắn tắt Kiểm tra xem DATA_ZONE hoặc CONFIG_ZONE có bị khóa không

* / param [in] cfg Cấu hình giao diện logic. Bạn có thể tìm thấy một số cấu hình * được xác định trước trong atca_cfgs.h * / param [in] zone LOCK_ZONE_DATA hoặc LOCK_ZONE_CONFIG * / return ATCA_SUCCESS nếu thành công, nếu không sẽ là mã lỗi. * / ATCA_STATUS check_lock_zone (ATCAIfaceCfg * cfg, uint8_t zone) {trạng thái ATCA_STATUS; khóa bool = false; if (zone! = (uint8_t) LOCK_ZONE_CONFIG && zone! = (uint8_t) LOCK_ZONE_DATA) trả về ATCA_BAD_PARAM; 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; } trả về ATCA_SUCCESS; } trả về ATCA_BAD_PARAM; } check_lock_zone (& cfg, LOCK_ZONE_CONFIG);

Bước thứ tư: Viết cho bạn Khóa AES vào một chỗ trống

Trong phần này, bạn sẽ đặt khóa AES cá nhân cho mình trong khe cắm mà bạn đã xác định trong cấu hình của chip.

Đối với ví dụ này, tôi sẽ sử dụng vị trí số 9 của chip.

Bạn cần biết: Điểm đặc biệt của con chip này là bạn có thể ghi dữ liệu vào khe chỉ 4 byte hoặc 32 byte. Đối với AES, chúng ta cần Khóa 128 bit để 16 byte dữ liệu. Vì vậy, tôi quyết định ghi vào khóa 16 byte mỗi khóa trong vị trí này để có dữ liệu 32 byte.

Bây giờ, tôi sẽ cho bạn thấy mã được sử dụng:

/ ** / vắn tắt Viết khóa AES vào một vị trí nhất định. * / param [in] cfg Cấu hình giao diện logic. Một số cấu hình * được xác định trước có thể được tìm thấy trong atca_cfgs.h * / param [in] key key slot number * / param [in] datakey key array uint8_t * / param [in] len Kích thước của mảng key * / return ATCA_SUCCESS khi thành công, nếu không sẽ là một mã lỗi. * / ATCA_STATUS write_key_slot (ATCAIfaceCfg * cfg, uint8_t key, uint8_t * datakey, size_t len) {if (key 16) return ATCA_BAD_PARAM; if (len! = 32) trả về ATCA_BAD_PARAM; Trạng thái ATCA_STATUS = atcab_init (cfg); if (status == ATCA_SUCCESS) {status = atcab_write_zone (ATCA_ZONE_DATA, (uint16_t) key, 0, 0, datakey, 32); if (status! = ATCA_SUCCESS) trả về trạng thái; } trả về trạng thái; }

Đối với ví dụ này, tôi sẽ sử dụng hai Khóa AES 16 byte mỗi khóa:

// Ví dụ về AES KEY (len 32) uint8_t example_of_key [32] = "AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA"; write_key_slot (& cfg, 9, example_of_key, sizeof (example_of_key));

Nếu hành động này là tốt, bây giờ, bạn phải vượt qua bước cuối cùng "khóa vùng dữ liệu"

Bước cuối cùng: khóa Vùng dữ liệu

Cảnh báo: hãy cẩn thận với bước này, nếu bạn khóa Vùng này và dữ liệu của bạn chưa được đặt, chip sẽ không sử dụng được và bạn không thể sửa đổi vùng này

Đối với hành động này, chúng tôi sẽ sử dụng chức năng này:

/ ** / vắn tắt Kiểm tra xem DATA_ZONE hoặc CONFIG_ZONE có bị khóa không

* / param [in] cfg Cấu hình giao diện logic. Bạn có thể tìm thấy một số cấu hình * được xác định trước trong atca_cfgs.h * / param [in] zone LOCK_ZONE_DATA hoặc LOCK_ZONE_CONFIG * / return ATCA_SUCCESS nếu thành công, nếu không sẽ là mã lỗi. * / ATCA_STATUS check_lock_zone (ATCAIfaceCfg * cfg, uint8_t zone) {trạng thái ATCA_STATUS; khóa bool = false; if (zone! = (uint8_t) LOCK_ZONE_CONFIG && zone! = (uint8_t) LOCK_ZONE_DATA) trả về ATCA_BAD_PARAM; 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; } trả về ATCA_SUCCESS; } trả về ATCA_BAD_PARAM; } check_lock_zone (& cfg, LOCK_ZONE_DATA);

Nếu hành động này tốt, chip của bạn đã sẵn sàng để sử dụng

Bước 5: 3. Sử dụng Mô-đun AES CBC

3. Sử dụng Mô-đun AES CBC
3. Sử dụng Mô-đun AES CBC

Tôi sẽ giải thích cách mã hóa và giải mã dữ liệu bằng thuật toán AES CBC và chip Atecc608a.

Ghi nhớ: Trước khi sử dụng chức năng này, bạn cần thiết lập chip. Đối với điều này, hãy làm theo bước 2 của bài viết này

Chip này có nhiều loại mô-đun AES (AES 128 bit), chỉ có thể sử dụng AES 128 bit:

  1. AES bình thường
  2. AES CBC
  3. AES GCM (với hàm băm GFM) (xem wikipedia để biết thêm chi tiết)

Để dễ sử dụng hơn, tôi đã tạo hai hàm:

  1. aes_cbc_encrypt
  2. aes_cbc_decrypt

Hai chức năng đó có sẵn trên Github của tôi.

Sự khai triển

Tôi chọn sử dụng Thuật toán AES CBC vì nó an toàn hơn AES 128 bit cơ bản. Thuật toán này sử dụng một Vectơ ban đầu để mã hóa dữ liệu của bạn.

Thông tin

Dưới đây tôi trình bày chi tiết từng bước của phương pháp mã hóa và giải mã. Nhưng tôi đã viết mã cho Arduino sử dụng cả hai chức năng đó. Bạn có thể thấy mã này trong Github của tôi:

  • Github: Github của tôi
  • Ví dụ về mã "Encrypt / Decrypt": AES_crypto_example.ino

Bước đầu tiên: Mã hóa dữ liệu của bạn

Trong phần này, tôi sẽ chỉ cho bạn cách mã hóa dữ liệu của bạn.

Trước tiên, bạn sẽ cần chức năng này:

/ ** / vắn tắt Mã hóa dữ liệu bằng thuật toán AES CBC * / param [in] cfg Cấu hình giao diện logic. Bạn có thể tìm thấy một số cấu hình * được xác định trước trong dữ liệu atca_cfgs.h * / param [in] Các từ cần chia (phải chia cho 16, độ dài tối đa 240) * / param [in] len length of Words to encypt (phải chia cho 16, độ dài tối đa 240) * / param [out] iv Vectơ ban đầu được sử dụng trong AES CBC (trả về vectơ trong var này) * / param [out] ciphertext trả về đây văn bản Cypher * / param [in] key Số vị trí của phím * / return ATCA_SUCCESS thành công, nếu không sẽ là mã lỗi. * / 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; if (len> LIMIT_DATA_SIZE_CBC && len% 16! = 0) {Serial.print (F ("ERROR: ATCA_BAD_PARAM")); trả về ATCA_BAD_PARAM; } uint8_t tmp_iv [IV_LENGTH_CBC]; uint8_t tmp_data [len]; Trạng thái ATCA_STATUS = atcab_init (cfg); if (status == ATCA_SUCCESS) {status = atcab_aes_cbc_init (& ctx, key, 0, tmp_iv); if (status! = ATCA_SUCCESS) {Serial.print (F ("LỖI Mã hóa: atcab_aes_cbc_init, Lỗi Mã 0x")); Serial.println (trạng thái, HEX); trở lại; } 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], & ciphertext [j * 16]); } if (status! = ATCA_SUCCESS) {Serial.print (F ("ERROR Encrypt: atcab_aes_cbc_encrypt_block, Code Error 0x")); Serial.println (trạng thái, HEX); } trả về trạng thái; } trả về trạng thái; }

Chức năng này rất đơn giản để sử dụng, bạn phải thiết lập hai điều:

  1. IV trống (Vectơ ban đầu) 16 byte
  2. Dữ liệu cần mã hóa (kích thước tối đa 240 Byte)

Đây là một ví dụ "làm thế nào để sử dụng chức năng này".

Tôi muốn mã hóa từ "AAAAAAAAAAAAAAA", với khóa của tôi được viết trong số vị trí "9":

ATCA_STATUS status = atcab_init (& cfg); if (status! = ATCA_SUCCESS) {Serial.println (F ("atcab_init () failed: Code -> 0x")); Serial.println (trạng thái, HEX); } uint8_t plaintext [16] = "AAAAAAAAAAAAAAA"; // Văn bản gốc uint8_t iv [IV_LENGTH_CBC]; // Vector ban đầu uint8_t cypherdata [sizeof (plaintext)]; // Trạng thái mã hóa dữ liệu = aes_cbc_encrypt (& cfg, plaintext, sizeof (plaintext), iv, cypherdata, 9);

Nếu hành động tốt, bạn sẽ có dữ liệu được mã hóa trong biến "cypherdata" và Vectơ ban đầu trong biến "IV".

Giữ hai biến đó để giải mã văn bản của bạn!

Bước thứ hai: giải mã dữ liệu của bạn

Để giải mã dữ liệu của bạn, bạn sẽ cần hai thứ:

  1. Vectơ ban đầu
  2. Dữ liệu Cypher (dữ liệu được mã hóa)

Để giải mã dữ liệu của bạn, bạn sẽ cần chức năng này:

/ ** / vắn tắt Giải mã dữ liệu bằng thuật toán AES CBC * / param [in] cfg Cấu hình giao diện logic. Bạn có thể tìm thấy một số cấu hình * được xác định trước trong atca_cfgs.h * / param [in] ciphertext Các từ cần giải mã (phải chia cho 16, độ dài tối đa 240) * / param [in] len length of Words to decypt (phải chia cho 16, độ dài tối đa 240) * / param [in] iv Vectơ ban đầu để sử dụng trong AES CBC * / param [out] plaintext trả về đây văn bản được giải mã * / param [in] key Số vị trí của khóa * / return ATCA_SUCCESS khi thành công, nếu không là một mã lỗi. * / 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; if (len> LIMIT_DATA_SIZE_CBC || len% 16! = 0) {Serial.print (F ("ERROR Giải mã: ATCA_BAD_PARAM")); trả về ATCA_BAD_PARAM; } Trạng thái ATCA_STATUS = atcab_init (cfg); if (status == ATCA_SUCCESS) {status = atcab_aes_cbc_init (& ctx, key, 0, iv); if (status! = ATCA_SUCCESS) {Serial.print (F ("LỖI Giải mã: atcab_aes_cbc_init, Lỗi mã 0x")); Serial.println (trạng thái, HEX); trở lại; } int max = len / 16; for (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 ("LỖI Giải mã: atcab_aes_cbc_encrypt_block, Lỗi mã 0x")); Serial.println (trạng thái, HEX); } trả về trạng thái; } trả về trạng thái; }

Tôi muốn giải mã dữ liệu trước đó của mình (xem bên dưới, Bước đầu tiên). Đối với điều này, tôi sẽ làm điều này:

uint8_t plaintext [16] = "AAAAAAAAAAAAAAA"; uint8_t iv [IV_LENGTH_CBC]; uint8_t cypherdata [sizeof (plaintext)]; uint8_t decryptdata [sizeof (plaintext)]; status = aes_cbc_decrypt (& cfg, cypherdata, sizeof (cypherdata), iv, decryptdata, 9); if (status == ATCA_SUCCESS) {Serial.print ("Văn bản được giải mã là:"); for (size_t i = 0; i <sizeof (decryptdata); i ++) {Serial.print ((char) decryptdata ); } Serial.println (""); } else {// Xem tệp atca_status.h để biết mã Error Serial.print (F ("Không thể giải mã | Lỗi Mã 0x")); Serial.println (trạng thái, HEX); trở lại; }

Nếu hành động tốt, bạn sẽ có dữ liệu được giải mã trong biến "decryptdata".

Bây giờ bạn đã biết cách sử dụng mã hóa và giải mã với chip Atecc608a

Bước 6: 5. Tại sao bạn cần sử dụng chip này

Dữ liệu được mã hóa rất hữu ích vì bạn có thể ẩn thông tin của mình và gửi thông tin bằng Không dây hoặc chỉ lưu trữ.

Dưới đây là một số ví dụ về việc sử dụng:

  1. Dữ liệu được lưu trữ vào EEPROM bên ngoài: Bạn có thể bảo mật dữ liệu của EEPROM bên ngoài và nếu ai đó vẫn còn EEPROM này, anh ta sẽ cần Khóa và IV để giải mã
  2. Gửi dữ liệu không dây: Bạn có thể gửi dữ liệu được mã hóa này bằng Không dây (nrf24L01, RFM95W…) và nếu ai đó chặn dữ liệu của bạn, dữ liệu này sẽ được bảo mật
  3. Mật khẩu được lưu trữ

Bạn có thể làm nhiều việc với con chip này. Nó có thể được sử dụng trong nhiều dự án. Nếu bạn có thời gian, hãy cho tôi biết bạn sẽ sử dụng con chip này trong dự án nào?

Một lời khuyên cuối cùng, nếu bạn xây dựng một số dự án không dây hoặc lưu trữ một số dữ liệu thô, hãy cẩn thận, bảo mật là rất quan trọng và nếu bạn biết cách "noob" có thể đánh chặn hoặc đánh cắp dữ liệu của bạn rất đơn giản. Giờ đây với Internet, mọi người đều có thể có script để khởi chạy trên máy tính của họ chỉ để "hack" bạn!

Bước 7: Kết luận

Tôi hy vọng bài viết này sẽ hữu ích cho bạn. Xin lỗi nếu tôi đã nhầm lẫn trong văn bản của mình nhưng tiếng Anh không phải là ngôn ngữ chính của tôi và tôi nói tốt hơn tôi viết.

Cảm ơn vì đã đọc tất cả mọi thứ.

Hãy tận hưởng nó.

Đề xuất: