AES

MySprtlty·2023년 2월 8일
0

Applied Cryptography

목록 보기
1/11

AEAD(AES-GCM, ChaCha20-Poly1305)는 따로 다룰 예정

🏷️AES

  • symmetric encryption는 대표 주자로, 암호화의 주요 표준이다.
  • 2001년 NIST에서 발표한 AES (Advanced Encryption Standard)는 DES 알고리즘을 대체했다.
  • AES는 오늘날에도 정말 많이 사용되는 주요 암호다.
  • AES는 고정된 크기의 plain text를 암호화하는 block cipher다.
  • AES는 3가지 버전이 있으며, 키의 길이에 따라 보안 수준이 결정된다.
    • AES-128
    • AES-192
    • AES-256
  • AES-128로도 대부분 애플리케이션이 목표로하는 보안 수준에 도달할 수 있다.

📌AES Interface

  • AES는 앞서 언급한 것처럼 버전에 따라 다른 길이의 key를 사용한다.
  • 128 bits의 plain text를 암호화한다.
  • 128 bits의 cipher text를 출력한다.
  • decryption때도 동일한 key와 128 bits cipher text을 사용하여 128 bits plain text를 반환한다.

📌AES Internals

  • AES는 plain text의 state를 4 X 4 행렬로 본다.
  • AES는 state를 암호화하기 위해 state에 대해 round function을 반복한다.
  • round function은 4가지 다른 하위 함수를 사용한다.
    • SubBytes
    • ShiftRows
    • MixColumns
    • AddRoundKey
  • round function은 symmetric key에서 파생된 round key를 사용한다.
  • 이를 key schdule한다고 하는데, 참고로 이 때 gcc built-in 함수로 _mm_aeskeygenassist_si128()를 사용한다.

📌AES mode of operation

  • 128 bits가 아닌 Plaintext를 암호화하려면 padding과 mode of operation을 사용해야 한다.

PKCS#7 Padding

  • RSA에서 발표한 표준으로 많이 사용된다.
  • padding byte의 값이 필요한 padding의 길이로 설정되어야 한다.
  • 예를들어 현재 4 Bytes의 Plaintext가 있다면, AES의 입력 Bytes인 16 Bytes를 맞추기 위해 필요한 padding 길이인 12(0x0c)가 padding byte의 값으로 설정된다.

ECB mode

  • Electronic Codebook 작동 모드로, 단순히 긴 Plaintext를 암호화하기 위해 16 Bytes 블록 씩 나누어 암호화하는 방식이다.
  • 동일한 Plaintext를 암호화하면 동일한 CipherText가 생성되기에 반복적인 패턴이 나타난다.
  • 즉, 다음과 같이 ECB는 반복되는 패턴을 숨기지 않기에, 한눈에 봐도 Linux Tux인 것을 알아볼 수 있다.

CBC mode

  • Cipher Block Chaining 모드로 IV(Initialization Vector)를 추가 값으로 줘야 한다.
  • IV의 size는 16 bytes로 AES의 Block size와 같다.
  • IV는 예측할 수 없는 무작위 값이어야 하지만 공개되어도 상관 없다.
  • 이전 Ciphertext가 다음 Plaintext와 XOR연산을 하는 구조이다.
  • 다음은 CBC 암호화 과정이다.
  • 다음은 CBC 복호화 과정인데, IV가 필요하다.
  • CBC mode에서 IV는 고유해야 하고, 예측할 수 없어야 한다.

📌AES-CBC-HMAC

  • Ciphertext와 IV의 무결성을 위해 HMAC을 함께 사용할 수 있다.
  • 암호화 후 MAC을 적용하는데, 이 구조를 Encrypt-then-MAC이라고 한다.
    • 먼저 AES CBC 모드를 사용하여 Plaintext를 암호화한다.
    • Ciphertext에 대해서 HMAC을 적용한다.
    • 이때 HMAC의 입력으로는 IV가 포함된다.
    • 최종적으로, Ciphertext와 IV 그리고 MAC tag(= authentication tag)를 결합하여 전송한다.
  • AES-CBC와 HMAC에는 서로 다른 키를 사용하는 것이 권장된다.
  • 하지만 프로그래머가 실수하기 좋은 구조라 요즘은 AEAD를 사용한다.

📌AES-NI

  • AES-NI is an extension to the x86 instruction set architecture for microprocessors from Intel and AMD proposed by Intel in March 2008.
InstructionsInstruction Description
AESENCPerform one round of an AES encryption flow
AESENCLASTPerform the last round of an AES encryption flow
AESDECPerform one round of an AES decryption flow
AESDECLASTPerform the last round of an AES decryption flow
AESKEYGENASSISTAssist in AES round key generation
AESIMCAssist in AES decryption round key generation.

📌gcc built-in

  • gcc는 AES관련 Built-in function을 제공한다.
  • wmmintrin.h를 포함하고, 컴파일 시 -maes 플래그를 줘야 한다.
Function PrototypeDescription
__m128i _mm_aesdec_si128 (__m128i a, __m128i RoundKey)AES 라운드의 한 단계를 역순으로 수행
__m128i _mm_aesdeclast_si128 (__m128i a, __m128i RoundKey)마지막 AES 라운드를 역순으로 수행
__m128i _mm_aesenc_si128 (__m128i a, __m128i RoundKey)AES 라운드의 한 단계를 수행
__m128i _mm_aesenclast_si128 (__m128i a, __m128i RoundKey)마지막 AES 라운드를 수행
__m128i _mm_aesimc_si128 (__m128i a)AES Inverse Mix Columns 연산을 수행
__m128i _mm_aeskeygenassist_si128 (__m128i a, const int imm8)AES 키 생성을 보조하는 데 사용

📌References

profile
2Co 4:7

0개의 댓글

관련 채용 정보