[보안] 암호화 알고리즘 종류

김진회·2022년 12월 23일
0

cs

목록 보기
9/14

0. 개요

데이터를 안전하게 전달 혹은 보관하기 위해서 여러 암호화 알고리즘이 사용된다. 암호화 알고리즘에는 대칭키 방식비대칭키 방식 그리고 단방향 암호화가 있다.

보안의 3요소

  • 무결성: 권한을 가진 사람만 인가된 방법으로 정보를 수정
  • 기밀성: 승인 받은 사람만 접근할 수 있음
  • 가용성: 원할 때 접근 가능

1. 대칭키 암호화

  • 암호화에 사용되는 키와 복호화에 사용되는 키가 동일한 암호화 기법
  • 암호화한 정보를 누군가에게 보낼 때, 대칭키도 함께 보내야 한다.
  • 비밀키 암호화와 같은 의미
  • 장점
    • 빠른 암호화 연산 속도
  • 단점
    • 키 전달 및 관리에 어려움이 존재
    • 암호키 자체는 암호화가 되지 않은 평문으로 분실 혹은 노출 시, 보안에 매우 취약
  • 종류
    • 블록 암호화
      • DES: 56비트의 키 길이. 2개의 블록으로 나누어 처리됨. 암호화 AES보다 보안이 취약함. 느림.
      • AES: 256비트의 키 길이. 전체 블록이 처리됨. DES보다 안전함. 빠름.
      • SEED(국내개발), ARIA
    • 스트림 암호화
      • RC4

2. 비대칭키 암호화

  • 대칭키 암호화 방식의 키 전달의 취약점을 해결하기 위해 나온 방식
  • 암호화에 사용하는 키와 복호화에 사용하는 키를 분리
  • 자신이 갖고 있는 고유한 암호키(개인키)로만 복호화할 수 있는 암호키(공개키)를 대중에게 공개한다.
  • 공개키 암호화와 같은 의미
  • 장점
    • 대칭키 암호화 방식의 키 전달 문제를 해결
  • 단점
    • 연산에 의해 대칭키 방식에 비해 속도가 느리고 복잡함
  • 종류
    • RSA (인수분해)
    • ElGamal (이산대수)
    • ECC (타원곡선)

각 암호화의 장점을 채택하여 용량이 큰 정보는 대칭키로 암호화하고, 암호화에 사용된 대칭키는 공개키로 암호화하여 대상에게 전달하는 하이브리드 암호화 방법이 일반적으로 사용되고 있다.

공개키 기반 구조
특정 사람의 개인키와 공개키는 어떻게 생성, 배포, 관리해야 하는가에 대한 이슈가 존재한다. 또한, 어떤 공개키가 특정한 사람의 공개키라는 것을 어떻게 보장할 수 있는지에 대한 이슈도 존재한다.

이를 해결하기 위해 디지털 인증서를 도입했고 이를 활용하는 소프트웨어, 하드웨어, 정책, 제도, 사용자 등을 총칭해서 공개키 기반 구조라고 한다.


3. 단방향 암호화

  • 해싱을 이용해 암호화한다. 복호화 하는 것은 불가능하다.
  • 예를 들어 해싱되어 DB에 저장된 password가 사용자가 입력한 값을 해싱해서 같으면 비밀번호가 일치하는 것이다.
  • 종류
    • SHA-2, SHA-3
    • MD5

4. Crypto를 이용한 AES-256 구현

최근 프로젝트에서 민감한 데이터를 전달할 일이 생겼고, Crypto 라이브러리를 사용하여 AES-256 암복호화 함수를 구현해서 사용했다.
여기서 key는 암호화에 사용할 비밀키이고, iv는 CBC모드에서 첫 번째 블록을 암호화할 때 사용되는 초기 벡터이다.

import java.util.Base64;
import javax.crypto.Cipher;
import javax.crypto.spec.IvParameterSpec;
import javax.crypto.spec.SecretKeySpec;

public class Encrypt {
    public static String alg = "AES/CBC/PKCS5Padding";

    // 암호화
    public static String encryptAES256(String key, String iv, String text) throws Exception {
        Cipher cipher = Cipher.getInstance(alg);
        SecretKeySpec keySpec = new SecretKeySpec(key.getBytes(), "AES");
        IvParameterSpec ivParamSpec = new IvParameterSpec(iv.getBytes());
        cipher.init(Cipher.ENCRYPT_MODE, keySpec, ivParamSpec);

        byte[] encrypted = cipher.doFinal(text.getBytes("UTF-8"));
        return Base64.getEncoder().encodeToString(encrypted);
    }

    // 복호화
    public static String decryptAES256(String key, String iv, String cipherText) throws Exception {
        Cipher cipher = Cipher.getInstance(alg);
        SecretKeySpec keySpec = new SecretKeySpec(key.getBytes(), "AES");
        IvParameterSpec ivParamSpec = new IvParameterSpec(iv.getBytes());
        cipher.init(Cipher.DECRYPT_MODE, keySpec, ivParamSpec);

        byte[] decodedBytes = Base64.getDecoder().decode(cipherText);
        byte[] decrypted = cipher.doFinal(decodedBytes);
        return new String(decrypted, "UTF-8");
    }
}

1) ECB 모드

  • 블록 암호의 운영모드 중 가장 간단한 모드이며, 평문은 N개의 n 비트 블록으로 분할하며, 평문의 크기가 블록 크기의 배수가 아니라면, 마지막 블록에 다른 블록과 동일한 크기를 맞추기 위해 패딩(Padding)을 추가

2) CBC 모드

  • 각각의 평문 블록을 암호화되기 전에 이전 암호문 블록과 XOR 되며, 암호화된 블록은 다음 블록을 암호화할 때 사용
  • 첫 번째 블록을 암호화할 때는 이전 암호문 블록이 존재하지 않으므로, 초기 벡터(IV)라고 불리는 허구의 블록이 사용

PKCS5 패딩

  • 패딩의 한 방법으로 패딩은 입력값이 암호 블럭 사이즈의 배수와 맞지 않으면 배수에 맞춰 빈공간을 채워준다.

Reference

https://github.com/WooVictory/Ready-For-Tech-Interview/blob/master/Network/공개키%20%26%20대칭키.md

profile
SSAFY 7기. HMG. 협업, 소통, 사용자중심

0개의 댓글