기기 내 기밀 정보 암호화 테스트

2710 단어 aesATECC608AESP32

소개



디바이스내에서 Wifi의 SSID나 패스워드, 클라우드 접속 토큰등을 보존하고 싶지만, 평문으로의 보존이 적당하지 않은 경우가 생각된다. 그 때 어떻게 해독되기 어렵게 하는가 하는 실험.

AES로 암호화



이번에는 AES-GCM을 선택. 여러가지 공부해 보았는데 이하와 같은 구성을 생각했다.



TLS1.2에서 사용할 때는 핸드셰이크 후에 상대와 공유되는 IV(초기화 벡터), Key(공통 키)는 모두 생성하고 IV는 플래시상(보호 없음), Key는 ATECC608A의 읽기 금지 슬롯에 보관.

암호화된 암호문, 그 때에 나오는 Tag도 아울러 플래시상(보호 없음)에 둔다.
이것을 읽고 해독이 가능한지를 시도한다.

전제 조건



보안 IoT 장치 통신을 시도했습니다 (MbedTLS 이식편 - Configure) 에서 실시한 ATECC608A 의 초기화가 완료되고 있는 것.
소스 코드는 아래.
htps : // 기주 b. 코 m / km ぇ b 네 t / 엣 c608

구현



코드를 실제로 쓰고 구현을 시도합니다.

kmwebnet/ECC608-AES-GCM-test 에서 코드를 공개 중.

슬롯 5번을 AES Key로 써서만 읽기 불가의 설정으로 한다.

이것을 실현하기 위해, Microchip사의 테스트 코드의 컨피그를 확인.
cryptoauthlib/python/tests/test_device.py
이번 ATECC608A에서의 구성은 아래와 같다.

Config Zone
바이트 13: 'AES_Enable': 1로 설정
'SlotConfig No5': 0x36C4→0x00C4
비트 15-12 : Writeconfig
비트 8-11 : WriteKey
상기를 0으로 하여 쓰기 가능으로 한다.

'KeyConfig No5' : 0x001C → 0x0018
비트 2-4 : Keytype을 0b111(7)에서 0b110(6)으로 변경하여 AES 키를 취급하는 슬롯으로 설정한다.

위의 설정을 crypto.c 시작 부분에서도 확인하십시오.

crypto.c 구현 설명



crypto.h에서 슬롯 8의 416바이트 내역을 정의했다.
76바이트 위치에서 12바이트: IV
88바이트 위치에서 16바이트: 태그
104바이트 위치에서 240바이트: 암호화된 데이터

두 개의 함수를 만듭니다.
ATCA_STATUS encryptwrite(uint8_t *data, size_t length)
장치에 데이터 쓰기
1. atcab_random에서 32바이트의 난수를 얻는다.
2. 슬롯 5에 난수를 쓰고 AES Key로 설정합니다.
3. atcab_aes_gcm_init_rand로 IV를 초기화하고 슬롯 8에 씁니다.
4. 암호화할 240바이트를 16바이트 단위로 암호화하고 15회 루프를 돌린다.
5. atcab_aes_gcm_encrypt_finish로 루프 종료, Tag를 취득
6. Tag, 데이터를 슬롯 8에 쓰기 종료

ATCA_STATUS decryptread(uint8_t *data, size_t length)
기기 내에서 데이터 로드
1. 디바이스 내에서 IV, Tag를 불러오기
2. atcab_aes_gcm_init로 IV를 설정합니다.
3. 복호하는 240바이트를 16바이트 단위로 복호하고 15회 루프를 돌린다.
4. atcab_aes_gcm_decrypt_finish에서 Tag를 확인하고 정상이면 종료.

상기의 2개로, AES 키를 디바이스에 은닉한 상태, 즉 이 디바이스가 없으면 복호할 수 없는 데이터를 작성할 수 있었다.

좋은 웹페이지 즐겨찾기