2023년 1월 1일
08:00 AM
Buffering ...

최근 글 👑

암호화

2022. 9. 19. 17:47ㆍSK Rookies 9/Network System Secure

용어정리

  • 평문 : 누구나 읽을 수 있는 글 
  • 암호문 : 아무도 읽을 수 없는 글
  • 암호화 : 평문을 암호문으로 만드는 것
  • 복호화 : 암호문을 평문으로 만드는 것
  • 암호화키 : 평문을 암호문으로 만드는 규칙
  • 복호화키 : 암호문을 평문으로 만드는 규칙

암호화를 하는 이유는 앞서 패킷분석을 해봤듯이 원문이 그대로 노출 될 경우 중요 정보가 유출될 수 있기 때문이다.

ROT13

영어를 13글자 밀어서 암호화 하는 방식

ROT13

영어만 암호화된다는 단점이 있다. -> 이를 보안하기 위해 ROT47 방식(대/소/숫/특수 94개를 반으로 나누어서 섞어서 사용)이 등장

 

소스코드

def rot47(s):

    x = []

    for i in range(len(s)):

        j = ord(s[i])

        if j >= 33 and j <= 126:

            x.append(chr(33 + ((j + 14) % 94)))

        else:

            x.append(s[i])

    return ''.join(x)

대칭키 (Symmetric Key)

암호화키와 복호화키가 서로 대칭을 이루는 키다. 대칭키의 경우 치환, 순열, 매트릭스를 사용한다. 대칭키의 경우 암호화/복호화 속도가 빠르다는 장점이 있지만, 문제점은 이러한 대칭키를 비밀리에 상대방에게 줄 방법이 없다라는 점과 여러 사람이 통신할 때 키의 개수가 많아진다는 점이다.

순열
매트릭스(가로, 세로)

특징

  • 비밀(개인)키(Secret Key) : 키를 비밀리에 보관해야 한다.
  • 단일키(Single Key) : 사실상 하나의 키다.
  • 세션키(Session Key) : 한번의 세션에서만 사용한다.

종류

  • DES, 3DES
    • 최초의 표준 대칭키 
    • 블록 암호화 방식을 사용한다 (64bit이지만 8bit을 패리티 비트로 채우기 때문에 사실상 56bit이다.)
    • 3DES는 DES를 3번 반복한 것
  • AES(Rijndael)
    • 최근에 사용하는 표준 암호화
    • SPN(Substitution Permutation Network) : 치환과 전치의 반복사용
    • 키의 길이 : 128, 192, 256 등
  • SEED, HIGHT, LEA : 국산 알고리즘 -> 남이 만든거는 믿을 수 없기 때문에 사용

공개키(대칭키로 사용하는 방식, 속도 빠름)

누구나 개인(비밀)키(Private Key)와 공개키(Public Key)를 가지고 있고, 이름 그대로 개인키의 경우 누구도 모르는 자기만 알 수 있게 안전하게 보관하고, 공개키의 경우 거래 상대에게 제공한다.

공개키의 장점은 대칭키의 단점을 완벽하게 보완한다는 것이다. ->

상대의 공개키 + 자신의 개인키(대칭키) = 자신의 공개키 + 상대의 개인키(대칭키)

하지만 아래 그림과 같은 문제점이 있다.

MITM(Man in the Middle Attack)

공개키(비대칭키로 사용하는 방식, 속도 느림)

대칭으로 사용했을 때의 문제점(MITM)을 해결하기 위해 개인키와 공개키를 한쌍으로 사용하는 방식을 사용하게 됨

RSA(사실상의 표준 공개키)

양방향 암호화 가능

  • 기밀성 : 송신자가 수신자의 공개키로 암호화 -> 수신자는 자신의 개인키로 복호화

기밀성

  • 인증 : 송신자가 자신의 개인키로 암호화 -> 수신자는 송신자의 공개키로 복호화 (전자서명)
    • 전자서명(인증부분에서 원문을 해쉬값으로 변환하는 과정이 추가됨)(#해쉬참고)
      • 생성 : 원문의 해쉬값에 송신자의 개인키로 서명(암호화)을 하고 원문과 함께 보냄
      • 검증 : 서명된 해시값을 송신자의 공개키로 복호화하고 원문의 해쉬값과 비교
      • 일치 : 무결성 검증, 인증, 부인봉쇄 확인
      • 예 : 은행 이체의 경우 이체를 할 때 비밀번호(개인 키)를 입력하는데 이것이 인증, 부인봉쇄를 한다.

인증

ECC(Elliptic Curve Cryptography : 타원 곡선 암호화)

 

RSA알고리즘의 대안으로 나온 암호화로 이산대수의 어려움에 근거한 방식으로 만들어 졌다.

 

RSA보다 짧은 길이로 동등한 수준의 보안을 제공한다는 장점이 있다. 이러한 장점은 CPU/ Memory/ Power 소모량을 감소시키고, 이에 따라 Mobile환경에 적합하다.

# RSA1024bit와 ECC160bit이 제공하는 보안수준이 비슷함

해쉬 알고리즘

원문이 조금이라도 달라지면 해쉬값이 달라지는 특징을 이용하여 원문 변조를 확인할 수 있다. -> 무결성 검증

특징

  • 고정길이로 출력 : 원문의 길이와 관계없이 항상 일정한 길이로 출력됨
  • 일방향 함수 : 해쉬함수와 해쉬값을 알아도 원문 복구는 불가능하다.
  • 충돌방지 : 원문이 다르면 해쉬값도 다르다 -> 완전히 0퍼는 아니지만 0퍼에 수렴한다.
  • MD5(128bit), SHA-1(160bit), SHA-256(256bit) 등

다양한 알고리즘이 있지만 MD5, SHA-1 등과 같이 오래된 알고리즘은 컴퓨터의 발전에 따라 더이상 안전하지 않게 되었다.(크랙킹이 가능해짐) 아래 사진은 서로 다르지만 같은 해쉬값을 가지고 있는 .pdf파일이다. 또한 안전하지 않는 알고리즘은 ISMP-P, ISO27001에서 인증을 해주지 않는다.

1,2 사진
SHA-1 해시값 충돌

인증서

인증서는 공개키가 진짜 자신이 통신하고자 하는 상대의 공개키가 맞는지에 대해 인증을 해주는 것으로 인증서를 통해 공개키를 검증할 수 있다. 

인증서

  • 형식 : X.509v3
  • 인증서의 주요 내용 : 서명알고리즘, 유효기간, 발급자, 주체, 주체의 공개키, 서명된 해시값 등
  • 공개키가 올바른지 확인 (주체의 것이 맞는지 검증)
  • 방법은 전자서명과 비슷함,
  • 생성 : 원문(공개키)의 해시값을 구해서 송신자(CA)의 개인키로 서명(암호화)
  • 검증 : 송신자(CA : 인증기관)의 공개키로 서명된 해시값을 복호화한 후, 원문(공개키)의 해시값을 구해서 비교해봄
  • 검증시 : 통신하는 상대방 <- 인증해주는 인증기관 <- 인증기관을 인증하는 Root 인증기관(컴퓨터에 Root인증기관의 서명이 있어 그것으로 마지막으로 확인)의 꼬리물기 형식을 가짐

검증 순서
컴퓨터에 저장되어 있는 RootCA
인증서 또한 같는지 검증해야함

공인인증서

  • 공인인증기관이 서명한 인증서
  • 기관 : KOSCOM(증권전산), 한국무역정보통신, 한국전자인증, 한국정보인증, 금융결제원
  • 전자서명법(2020년 5월) : 전자서명에 동등한 법적효력 부여

PKI(Public Key Infrastructure)

PKI기관

  • RA(Registration Authority, 등록기관) : 인증서 신청 업체를 검증하고 등록을 대행하는 역할 (사업자등록증, 인감증명, 인감증명, 인감도장, 등기부등본 등)
  • CA (Certificate Authority, 인증기관) : 인증서를 발행하여 인증해주는 기관
  • RootCA (최상위 인증기관, 美PCA) : 인증기관을 인증(검증)해주는 기관
  • Repository : 인증서(공개키)를 모아놓은 데이터베이스(LDAP)

우리나라의 공인인증 체계

  • NPKI(National Public Key Infrastructure) : PAA(정책기관 : 미래부) -> KISA(RootCA) -> CA 5개기관(무역정보통신, Koscom, 한국전자 인증, 한국정보인증, 금융결제원) -> 은행들
  • GPKI : 행자부
  • MPKI : 국방부
  • EPKI : 교육부 ex) 나이스

CRL(Certificate Revocation Authority) : 인증서 취소 목록

  • 일반일들이 조회하기 전까지는 가짜 인증서를 확인하기 어려움을 가진다
  • OCSP (Online Certificate Status Protocol) : 온라인에서 실시간으로 인증서의 유효성을 검증하는 프로토콜

암호화의 응용

SSL/TLS

암호화를 웹에 적용시킨 웹 암호화 통신 프로토콜이다. 브라우저와 서버가 어떤 암호화 방식을 사용할건지 협의(우선순위 있음)하고 그 방식으로 암호화 통신을 진행한다.

 

원리

  1. 웹서버가 자신의 공개키를 인증서 형식으로 제공
  2. 웹브라우저는 서버_공개키를 기반으로 세션키를 생성
  3. 생성된 세션키를 서버_공개키로 암호화하여 서버로 전달
  4. 서버는 서버_개인키를 이용하여 암호화된 세션키를 복호화
  5. 안전하게 서로 세션키(대칭키)를 가지게 됨
  6. 브라우저와 서버는 세션키로 암호화/복호화하며 데이터를 주고받음
  7. 세션이 만료되거나 일반적으로 브라우저를 닫으면 세션키가 사라짐

사례

카카오톡의 경우 전송자의 말을 수신자에게 전달할 때 수신자에게 수신자의 세션키로 암호화해서 보내야 하므로 서버에서 전송자의 세션키로 전송자의 말을 복호화하는 과정을 거쳐야한다. -> 서버에서 원문이 노출됨

텔레그램의 경우 Diffie-Hellman방식을 사용하기에 이러한 보안 문제에 대해 대응했다.

카카오톡 보안 이슈
텔레그램 보안
채팅어플 보안 강도

전자봉투

  1. 생성 : 원문의 해쉬값에 송신자의 개인키로 서명(암호화)하고 원문 및 송신자의 공개키를 포함하여 세션키로 암호화하고, 세션키는 수신자의 공개키로 암호화해서 같이 수신자에게 보냄
  2. 검증 : 수신자의 개인키로 세션키를 복호화하고, 복호화하여 얻은 세션키로 원문, 암호화된 원문 해쉬값, 송신자의 공개키를 복호화함 이후에 송신자의 공개키로 원문 해쉬값을 복호화하고, 원문의 해쉬값을 계산해서 비교

기타

랜섬웨어 : 대부분 RSA2048bit으로 암호화하고 공격자의 공개키가 들어있어서 파일을 공격자의 공개키로 암호화함 -> 즉 파일은 공격자의 개인키로만 복호화 할 수 있음

 

가상화폐 : 주로 해쉬의 원리(SHA-256bit)를 이용 

  • 앞 블록에 대한 해쉬값을 다음 블록의 헤더에 포함시킴 (Chain)
  • 중간 블록을 바꿀 수 없음 (무결성 검증)
  • 기밀성은 제공하기 어려움 : 블록안에 거래내역이 모두 들어있음

'SK Rookies 9 > Network System Secure' 카테고리의 다른 글

로그 분석  (0) 2022.09.22
Metasploit 실습  (0) 2022.09.21
Exploit  (0) 2022.09.20
WireShark  (0) 2022.09.18
9월 15일  (0) 2022.09.16