Notice
Recent Posts
Recent Comments
Link
«   2024/05   »
1 2 3 4
5 6 7 8 9 10 11
12 13 14 15 16 17 18
19 20 21 22 23 24 25
26 27 28 29 30 31
Archives
Today
Total
관리 메뉴

kaki1013

[암호분석경진대회] 2023 암호분석경진대회 참가 후기 본문

암호

[암호분석경진대회] 2023 암호분석경진대회 참가 후기

kaki1013 2024. 2. 16. 19:21

작년 7월 말에 군 복무를 마친 뒤에 복학하기 전, 8월 한달 동안 암호분석경진대회에 참가를 하였습니다.

학기가 시작하고 바빠서 후기를 남기지 못했지만 늦게라도 후기를 정리하여 올리려고 합니다.

 

1번. 적대적 AI 공격 

AI에 대한 공격 가능성을 묻는 문제이다. 특히, 적대적 AI 공격 (Adversarial AI attack) 중 Perturbation attack 기법과 Active한 공격(Patch 공격 등)의 수행 및 구현을 요구한다.

 

PGD(Projected Gradient Descent) 기반의 Perturbation 공격은 참고자료로 나와있는 다음의 링크를 참고하면 공격을 수행해볼 수 있다. https://github.com/Harry24k/adversarial-attacks-pytorch/tree/master/demo

 

참고로, PGD는 Fast Gradient Sign Method (FGSM) 을 여러 번 반복 수행하는 것과 같다. 이에 대한 논문은 아래와 같다.

Towards Deep Learning Models Resistant to Adversarial Attacks by Aleksander Madry, Aleksandar Makelov, Ludwig Schmidt, Dimitris Tsipras, Adrian Vladu, https://arxiv.org/abs/1706.06083

 

또한, 이번에 글을 작성하며 확인하였는데, 아래의 링크에서 적대적 예제 생성과 관련된 파이토치 튜토리얼을 제공한다.

https://tutorials.pytorch.kr/beginner/fgsm_tutorial.html

 

적대적 예제 생성(Adversarial Example Generation)

저자: Nathan Inkawhich 번역: BONGMO KIM 이 글을 읽고 있다면, 여러분은 이미 머신러닝 모델이 얼마나 효과적인지 그 진가를 알고 있을 것입니다. 머신 러닝 연구는 ML(Machine Learning) 모델을 더욱 빠르고

tutorials.pytorch.kr

 

대회에 참가할 당시 딥러닝에 대한 경험이 거의 없었기 때문에, 이론적인 간단한 이해와 함께 위에 있던 데모 코드를 돌려본 것이 전부였다. Patch attack 공격의 경우, 교통표지판에 대한 분류 모델을 구성하는 것이 선행되었기 때문에, 당시에는 이에 대한 시도조차 할 수 없었다. 그래도 AI 분야에서 이러한 공격이 가능하다는 것을 알게 되고, 이를 직접 경험해볼 수 있었다. 또한, 강건한(robust) AI의 중요성을 알 수 있는 계기가 되었다.

 

2번. 딥러닝을 이용한 차분공격

6-라운드로 축소된 SPECK-32/64로 암호화된 암호문을 구별하도록 학습된 딥러닝 모델이 주어지고, 이를 기반으로 7-라운드 SPECK-32/64에 대한 키 복구 공격을 수행하는 문제이다.

 

차분공격과 딥러닝, 둘 다 제대로 모르는 상태였기 때문에 해당 문제는 풀지 못하였다.

 

3번. RSA 공격

암호문과 공개키이 주어지고, 원래의 평문과 복호화 연산 중 오류가 주입된 암호문을 복호화한 평문 160개가 주어졌다. 또한, 오류는 개인키의 최하위 k개의 비트가 0으로 셋팅되며, 오류가 주입된 위치(k)는 160개가 대응되어 주어졌다. 이때 개인키를 찾는 문제이다.

 

1024비트 중 최하위 1021비트가 0이라면 최상위 3개 비트만 확인하면(8가지 경우), 개인키의 최상위 3개 비트를 알 수 있다. 비슷하게, 그 다음으로 오류가 주입된 위치는 1016이므로 최상위 3개 이후의 상위 비트 5개를 확인하면(32가지 경우), 개인키의 최상위 8개 비트를 알 수 있게 된다. 이런 과정을 160회 반복한 후, 마지막으로 오류가 주입된 위치를 0이라고 생각하여 원래의 평문 정보를 사용하면, 전체 개인키를 획득할 수 있다.

 

RSA는 당시에도 어느 정도 알고 있는 내용이었기 때문에, 전체 문제들 중 가장 빠르게 풀 수 있었다. 아이디어를 떠올리는 것보다도, 이를 제대로 구현하는 것이 조금 더 어려웠던 문제였다.

 

4번. AVX2 명령어 셋을 활용한 암호 고속 병렬 구현

Intel 프로세서 상에서  C언어로 동작하도록 구현된 암호화 알고리즘이 주어지고, 이를 AVX2 명령어 셋을 활용하여 고속 병렬 구현하는 문제이다.

 

우선, 문제 해결을 위해 SIMD 라는 개념에 대해 알아야 한다. SIMD는 Single Instruction Multiple Data를 나타내면, 하나의 명령어로 여러 개의 값을 동시에 계산하는 방식이다. 그리고 이것을 가능하게 하는 것이 AVX2 명령어 셋이다.

당시에 이에 대해 정리해두었던 글이다.

https://kaki1013.tistory.com/entry/SIMD-SIMDSingle-Instruction-Multiple-Data%EB%9E%80

 

[SIMD] SIMD(Single Instruction Multiple Data)란?

SIMD(Single Instruction Multiple Data)는 병렬 컴퓨팅의 한 종류로, 하나의 명령어로 여러 개의 값을 동시에 계산하는 방식이다. 벡터 프로세서에서 많이 사용되는 방식으로, 비디오 게임 콘솔이나 그래

kaki1013.tistory.com

 

문제를 풀면서 집중했던 것은 3가지였다.

1. 고속 암호화의 대상

C언어로 주어진 암호화 알고리즘을 직접 도표로 나타내며, 해당 알고리즘이 어떤 식으로 동작하는지 파악을 하였다. 처음 주어진 구현상으로는 암호화와 키 스케줄링이 따로 구현되어 있었지만, 두 부분을 합쳐서 진행하였다. 이를 통해 세션 키를 배열에 따로 저장하지 않기 때문에, 메모리 사용량과 연산량을 줄일 수 있었다.

 

2. AVX2 명령어 셋에 대한 이해

내가 사용할 수 있는 방법들, 즉 AVX2 명령어 셋은 어떤 연산을 지원하는지, 그리고 어떻게 사용할 수 있는지를 알아보았다. 익숙치 않은 개념이었기 때문에, 이것들을 공부하고 어떻게 적용할지 고민하는 것에 오랜 시간을 투자하였다. 레지스터에 pt1와 pt2, k1과 k2끼리 싣는 것조차 쉽지 않았던 것 같다.

 

3. 병령 처리를 적용할 대상

병렬 처리를 적용하라고 되어 있는데, 어떤 것을 병렬 처리해야 하는지 고민하였다. 바로 위의 2번에서 보았듯, 적당한 영산을 통해 pt1와 pt2, k1과 k2끼리 싣는 것이 가능하다는 것을 알고난 뒤에는 방향을 잡을 수 있었다.

 

이러한 것들 이외에도, Linux 환경에서 수행해야 했기 때문에 가상환경을 설치하고 이를 사용하는 방법도 익힐 수 있었다. 복학하고 들었던 임베디드 과목에서도 꽤 도움이 되었다.

 

5번. 스테가노그래피, 포렌식

4개의 이미지 파일이 주어지고, 총 4개의 데이터가 은닉 또는 삭제되어 있으며 이를 해결하는 문제이다.

 

문제를 해결하기 위해 살펴보면서, 파일 시그니처(매직 넘버)에 대해 알게 되었다. 이에 대한 글은 아래 링크에 정리해두었다.

https://kaki1013.tistory.com/entry/%ED%8F%AC%EB%A0%8C%EC%8B%9D-%ED%8C%8C%EC%9D%BC-%EC%8B%9C%EA%B7%B8%EB%8B%88%EC%B2%98-%EB%A7%A4%EC%A7%81-%EB%84%98%EB%B2%84

 

[포렌식] 파일 시그니처 (매직 넘버)

매직 넘버 : 저장된 데이터를 구분하는 상수, 많은 파일 형식을 구분하는 간단하고 효과적인 방법 "Many files have such constants that identify the contained data. Detecting such constants in files is a simple and effective

kaki1013.tistory.com

 

풀이한 부분까지의 풀이과정은 대략 다음과 같다.

1번 파일의 R영역의 LSB를 추출하여 확인해보니 zip 파일의 헤더 시그니처임을 알 수 있었고,

압축을 해제하여 얻은 파일도 비슷하게 png 파일임을 확인하여 이미지를 얻을 수 있었다.

 

2번 파일은 bmp라고 되어 있었지만, 헥스 에디터로 시그니처를 확인한 결과 jpeg 임을 알 수 있었다.

또한, 파일 중간에 jpeg의 푸터 시그니처가 존재하였고, 이후 부분을 추출한 결과 7z 압축파일을 얻을 수 있었다.

압축을 해제하니 암호화된 파일 3개와 readme가 있었다.

 

다른 파일들에서는 별다른 데이터를 획득하지 못 하였다.

 

 

 

6번 문제. isogeny 문제에 기반하여 설계한 전자서명 알고리즘의 개인키 복원

isogeny 기반 암호는 유한체 위의 두 타원곡선 E, E′ 사이의 isogeny를 연산하는 어려움에 기반한다.

관련된 지식이 부족하여 문제에 대해서도 거의 이해를 하지 못하였고, 당연하게도 풀이 역시 하지 못하였다.

 

결론

1번부터 6번까지 문제들에 대한 간단한 설명을, 그리고 실제 풀이를 진행했던 문제는 풀이를 위해 공부했던 개념들과 풀이를 진행한 부분까지를 간단하게 작성해보았다. 22년에는 군대에서 참여를 했었는데, 22년과 23년 모두 참가상 느낌의 기념품을 받게 되었다.

 

이번 연도에는 수상을 하는 것이 목표이다. 대회가 시작되기 전까지는 23년 문제들을 제대로 풀이해보고 관련된 개념들을 공부해볼 예정이다.