SHA-256과 nRF52 SDK를 활용한 실습
1. SHA-256 개요
SHA-256(Secure Hash Algorithm 256)은 미국 국가안보국(NSA)이 설계하고 NIST(미국 표준 기술 연구소)에서 발표한 암호화 해시 함수입니다. 이는 SHA-2 계열에 속하는 알고리즘으로, 입력된 데이터를 256비트(32바이트) 길이의 고정된 해시 값으로 변환합니다. 이 해시 값은 입력 데이터의 무결성을 검증하는 데 사용되며, 원본 데이터를 추정할 수 없도록 설계되었습니다.
1.1 SHA-256의 특징
- 고정된 출력 길이: 입력 데이터의 크기에 관계없이 256비트(32바이트) 해시 값을 생성합니다.
- 단방향 함수: 해시 값을 통해 원본 데이터를 역추적하는 것은 사실상 불가능합니다.
- 충돌 저항성: 서로 다른 두 개의 입력이 같은 해시 값을 갖는 확률이 매우 낮습니다.
- 무결성 검증: 데이터가 변경되지 않았는지 확인하는 데 사용됩니다.
1.2 SHA-256의 활용 사례
SHA-256은 다양한 분야에서 사용됩니다.
- 디지털 서명: 메시지의 무결성을 검증하고 인증서의 진위성을 확인합니다.
- 블록체인: 각 블록의 데이터와 이전 블록과의 연결을 보장합니다.
- 파일 무결성 검사: 다운로드한 파일이 원본과 일치하는지 확인합니다.
- 비밀번호 저장: 비밀번호를 안전하게 보관하는 과정에서 해시 값을 사용합니다.
2. SHA-256 동작 원리
SHA-256은 다음과 같은 단계로 동작합니다.
2.1 데이터 패딩
입력 데이터를 512비트(64바이트) 블록 단위로 나누고, 마지막 블록은 길이를 64비트로 표시하는 방식으로 패딩합니다.
2.2 초기 해시 값 설정
SHA-256은 8개의 32비트 초기 해시 값을 사용합니다. 이 값들은 SHA-256 알고리즘의 공식 사양에 정의되어 있습니다.
2.3 메시지 처리
각 블록은 다음과 같은 과정을 거칩니다.
- 메시지 스케줄링: 512비트 블록을 64개의 워드로 확장합니다.
- 압축 함수: 각 워드는 라운드 함수와 함께 처리되며, 64라운드 동안 작업이 진행됩니다.
- 해시 값 갱신: 각 블록이 처리될 때마다 해시 값이 갱신됩니다.
2.4 최종 해시 값 출력
모든 블록을 처리한 후, 최종적으로 256비트 해시 값이 생성됩니다.
3. nRF52 SDK를 활용한 SHA-256 실습
nRF52840 플랫폼에서는 nRF SDK의 nrf_crypto 모듈을 이용해 SHA-256 해시를 생성할 수 있습니다. 다음은 nRF52840 개발 보드를 이용한 SHA-256 해시 생성 예제입니다.
3.1 개발 환경 설정
- 필요한 도구:
- nRF5 SDK (버전 17.1.0 권장)
- SEGGER Embedded Studio (SES)
- nRF52840 DK
- SDK 구성:
nRF5_SDK_17.1.0/components/libraries/crypto
경로에nrf_crypto
라이브러리가 존재해야 합니다.
3.2 예제 코드 작성
아래는 nRF52 SDK에서 SHA-256 해시를 생성하는 예제 코드입니다.
#include <stdio.h>
#include "nrf_crypto.h"
#include "nrf_log.h"
#include "nrf_log_ctrl.h"
#include "nrf_log_default_backends.h"
#define INPUT_DATA "Hello, nRF52840!"
void sha256_example(void)
{
uint8_t hash_output[NRF_CRYPTO_HASH_SIZE_SHA256];
nrf_crypto_hash_context_t hash_context;
// SHA-256 해시 컨텍스트 초기화
ret_code_t ret = nrf_crypto_hash_init(&hash_context, &g_nrf_crypto_hash_sha256_info);
if (ret != NRF_SUCCESS)
{
NRF_LOG_ERROR("SHA-256 컨텍스트 초기화 실패! Error: %d", ret);
return;
}
// 해시 계산
ret = nrf_crypto_hash_calculate(&hash_context, &g_nrf_crypto_hash_sha256_info,
(uint8_t *)INPUT_DATA, strlen(INPUT_DATA),
hash_output, sizeof(hash_output));
if (ret != NRF_SUCCESS)
{
NRF_LOG_ERROR("SHA-256 해시 계산 실패! Error: %d", ret);
return;
}
// 결과 출력
NRF_LOG_INFO("SHA-256 해시 값:");
for (size_t i = 0; i < sizeof(hash_output); i++)
{
NRF_LOG_INFO("%02x", hash_output[i]);
}
}
int main(void)
{
// 로그 초기화
APP_ERROR_CHECK(NRF_LOG_INIT(NULL));
NRF_LOG_DEFAULT_BACKENDS_INIT();
NRF_LOG_INFO("nRF52840 SHA-256 예제 시작");
sha256_example();
while (true)
{
NRF_LOG_FLUSH();
}
}
3.3 빌드 및 실행
- 프로젝트 설정: SEGGER Embedded Studio에서
nrf_crypto
모듈을 활성화합니다. - 빌드: 프로젝트를 빌드하고 펌웨어를 nRF52840 보드에 플래시합니다.
- 출력 확인: UART 또는 RTT 로그를 통해 해시 값을 확인합니다.
4. 결과 분석
프로그램을 실행하면 다음과 같이 SHA-256 해시 값이 출력됩니다.
nRF52840 SHA-256 예제 시작
SHA-256 해시 값:
7e 83 57 5c e8 34 9b 59 41 4c 17 3b 1c 68 0b 70 29 b7 f1 63 d8 56 9b 8b a1 35 c1 f8 91 d5 0e ea
이 해시 값은 입력 문자열 "Hello, nRF52840!"
에 대해 생성된 32바이트의 고유한 해시 값입니다.
5. 마무리
SHA-256은 데이터 무결성을 검증하는 강력한 도구로, 임베디드 시스템에서도 안전한 데이터 처리를 가능하게 합니다. nRF52840과 nRF SDK를 활용하면 간단하게 SHA-256 해시를 생성하고 검증할 수 있습니다. 이와 같은 해시 알고리즘을 활용해 펌웨어 무결성 검증, 보안 통신 등의 다양한 응용 분야에 적용할 수 있습니다.
'nRF52' 카테고리의 다른 글
nRF52840 ECC 공개 키 기반 암호화의 원리와 장점 (0) | 2025.02.20 |
---|---|
HMAC와 nRF52 SDK를 활용한 실습 (0) | 2025.02.20 |
nRF52840 AES-128, AES-256의 동작 원리와 모드(ECB, CBC, CTR 등) (0) | 2025.02.20 |
nRF52840에 내장된 CryptoCell-310의 개념과 역할 (0) | 2025.02.20 |
nRF52840 PWM으로 LED 제어하기 (0) | 2024.11.05 |