ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • 블록체인 작업증명 C++로 구현하기
    보안 2019. 2. 19. 17:52

    블록체인 알고리즘은 비트코인으로 인해 사람들에게 많이 알려지게 되었다.


    블록체인 알고리즘에서는 작업증명(POW - Proof Of Work) 이라는 과정을 통해 특정 거래내역이 신뢰할 수

    있는 정보인지 확인한다. 난 간단하게 작업증명 과정을 c++로 구현해 보았다. 그럼 이제 코드를 보자.

    #include <iostream>

    #include "KISA_SHA256/KISA_SHA256.h" typedef struct blockheader { BYTE previousBlockHash[257]; // 전 블록의 거래내역을 해쉬 한 값 }; typedef struct block { int blockSize; // 거래내역 크기 blockheader header; // 위에 있는 블록헤더 int transactionCount = 0; // 몇 번째 거래인지 BYTE transaction[100]; // 거래내역 }; int main() { block Block[10]; int select = 0; int total; printf("첫 거래내용 입력 : "); scanf("%s", Block[0].transaction); Block[0].transactionCount++; Block[0].blockSize = strlen((char*)Block[0].transaction); total = 1; while (total < 10) { printf("%d번째 거래내용 입력 : ", total + 1); scanf("%s", Block[total].transaction); Block[total].transactionCount = Block[total - 1].transactionCount + 1; Block[total].blockSize = strlen((char*)Block[total].transaction); SHA256_Encrypt(Block[total - 1].transaction, Block[total - 1].blockSize , Block[total].header.previousBlockHash); total++; } while (1) { printf("\n1. 거래내역 확인 2. 거래내역 변조 0. 종료\n"); scanf("%d", &select); if (select == 0) { return 0; } else if (select == 1) { int i; printf("\n번호 선택(1~9)"); scanf("%d", &select); BYTE EncryptCheck[257]; SHA256_Encrypt(Block[select - 1].transaction, Block[select - 1].blockSize, EncryptCheck); for (i = 0; i < 256; i++) { if (Block[select].header.previousBlockHash[i] != EncryptCheck[i]) { break; } } if (i != 256) { printf("거래기록이 변조되었습니다\n"); } else { printf("거래기록 : %s\n", Block[select - 1].transaction); } } else if (select == 2) { printf("\n번호 선택(1~9)"); scanf("%d", &select); Block[select - 1].transaction[0] = (BYTE)"\0"; printf("\n거래 내용 입력 : "); scanf("%s", Block[select - 1].transaction); printf("변조 완료\n"); } } return 0; }

    선언된 헤더파일 중 KISA_SHA256.h 는 KISA에서 제공하는 SHA256 암호화 모듈이다. (첨부해 두었다)


    blockheader 와 block 이라는 두 가지 구조체가 보일 것이다.

    원래 더 많은 정보들이 들어 있지만 이 코드에서는 간단하게 증명해 볼 것이기 때문에 나머지는 생략했다.


    총 10개의 거래내역을 입력받는다. 첫 번재 블록에서는 전 블록이 존재하지 않으니 따로 처음에 입력받는다. 그 후로는 차례로 거래내역을 입력받으며 자기 바로 전 블록의 거래내역을 암호화 한 값을 자신의 헤더에 넣는다.

    값이 들어가는 과정은 알았을 것이다. 그럼 이제 거래내역이 변조되었는지 아는 것도 식은죽먹기다.


    만약 2번 블록의 A gave 1000\ to B 라는 거래내역을 A gave 200000\ to Z 로 바꿨다고 생각해보자.

    그럼 당연히 해당 기록을 해쉬연산 한 결과값도 다르게 나올 것이다. 그럼 해쉬한 결과값과 3번 블록 헤더에

    저장되어있는 변조하기 전 해쉬값을 비교했을때 다를 것이고 그 블록은 변조된 것이다. 즉,


    2번 거래 내역 해쉬연산 결과값 != 3번 블록 헤더에 있는 변조하기 전 2번 거래내역 해쉬연산 결과값


    이렇게 되므로 변조되었다는 사실을 알 수 있는 것이다.

    코드에서도 그대로 구현해 두었다. 길지 않으니 천천히 보면서 알아가면 좋을 것 같다.


    KISA_SHA256.c

    KISA_SHA256.h

    '보안' 카테고리의 다른 글

    안티 드론 기법에 대해  (2) 2023.02.27
    MITRE ATT&CK 프레임워크에 대해  (0) 2023.02.13
    EME (Encrypted Media Extension)란?  (6) 2019.04.12
    Little Endian, Big Endian  (0) 2019.02.20

    댓글

Designed by Tistory.