펜타시큐리티 개발자 인턴 후기

전지적 인턴 시점_by민정

이민정
PentaSecurity Labs
9 min readFeb 8, 2024

--

안녕하세요.

<국민대학교 X 펜타시큐리티 인턴십 > 1기 이민정입니다.
저는 현재 아이사인개발부에 소속되어 있습니다.

인턴쉽 프로세스

일반적인 인턴십과는 다소 차이가 있는데요.

국민대 재학생(학부 또는 대학원생)을 대상으로 인턴을 선발합니다. 저는 대학원 재학생으로서 석사 3학기 후반부터 4학기까지 대학원 연구실과 인턴을 병행하였습니다.

  • 본사 멘토와 학교 멘토

인턴별로 본사에서의 멘토와 학교에서의 멘토가 정해집니다.

인턴에게는 본사 팀장님과 관련 분야 교수님께서 멘토로 정해졌습니다. 인턴 기간에 이렇게 각 분야의 전문가로부터 배울 수 있는 것 자체가 감사하고 귀한 경험이었죠.

  • 학업과 회사 업무 사이

무엇보다도 산학협력 인턴의 가장 큰 장점은 학업을 보장받으며 일할 수 있다는 ­점이었습니다.

물론 동시에 병행하는 것이 쉬운 일도 아니고 그만큼 시간 분배와 더 큰 노력을 해야 합니다. 개인의 노력도 중요하지만, 결국엔 회사 및 학교에서 양측 일을 병행하는 것에 대해 배려해 주신 덕분에 잘 마무리할 수 있었다고 생각합니다.

  • 프로젝트와 보고 체계

인턴은 와플개발부와 아이사인개발부로 나누어졌습니다. 각 인턴이 소속된 팀에 따라 목표하고자 하는 프로젝트를 설정하고, 이에 대해 주간 보고와 월간 보고를 통해 진행 상황을 보고하는 방식으로 운영되었습니다.

인턴으로 살아남기

인턴으로 저에게 주어진 키워드는

“암호 프리미티브 구현”,

“KCMVP”,

“PQC(Post-Quantum Cryptography)”

세 가지였습니다.

저는 기존에 포렌식을 전공했던지라, 사용된 암호화 기법을 밝혀내는 연구를 주로 수행했습니다. 그러다 보니 표준 문서를 기반으로 암호 알고리즘 자체를 분석하고 직접 구현해 내는 일에 익숙하지 않았죠.

‘그러면 어떻게 이 세 가지 키워드를 인턴 기간 안에 만족할 수 있을까?’

고민하다가 빅넘버 구현부터 시작해서 프로젝트별로 연결고리를 지어 확장해 나가자는 결론에 도달했습니다.

그래서 아래와 같은 로드맵을 계획하게 되었죠.

인턴으로 살아남기 위한 로드맵

먼저 네 가지의 프로젝트 모두 <분석>과 <구현>을 기반으로 하기 때문에 다음과 같은 프로세스로 진행하였습니다.

  • 처음에는 최대한 다른 사람들의 분석 및 구현 결과물을 참고하지 말고 혼자 해내자.
  • 진행하면서 궁금한 점과 이해가 가지 않는 부분은 모두 체크하여 짚고 넘어가자.
  • 구현이 완료된 이후, 다양한 사람들의 구현물을 참고하여 내 코드와 다른 점을 비교·분석하고 발전시켜 나가자.
  1. 빅넘버 연산 구현

먼저 암호 연구에 있어서 가장 기본이 되는 빅넘버 연산 구현을 진행하였습니다. 빅넘버를 먼저 구현하여 공개키 암호인 타원곡선암호(ECC)로 확장해 나가기 위함이었죠.

2. ECC 구현

구현한 빅넘버를 기반으로 p-256 curve에서의 타원곡선 암호를 구현하였습니다. 이를 위해 소수체상에서의 연산과 타원곡선상에서의 연산(ECADD, ECDBL, Scalar Multiplication) 구현이 요구되었습니다.

이 프로젝트를 기점으로 수백 가지의 오류를 직면할 수 있었습니다. 멀쩡하던 빅넘버 연산에서 갑자기 이상한 값이 출력되질 않나.. ‘분명 10,000개 이상의 테스트 벡터로 확인했는데 왜 이런 결과가 생길까’ 싶어서 팀장님께 여쭤봤던 기억이 납니다. 결론은.. 테스트 부족(!) 이었습니다.

단지 랜덤 한 값들에 대해서 연산을 확인하면 되겠지 싶었지만, 극단값, 부호, 자릿수 등 여러 조건을 고려하여 보다 다양한 케이스의 테스트를 거쳐야 했던 것이었습니다. 이후에는 발생 가능한 케이스를 정리하고 해당 케이스들에 맞추어 결괏값을 체크하면서 오류를 점차 줄여나갈 수 있었습니다.

3. 암호 모듈 설계 및 구현

핵심 업무인 KCMVP를 다루기 위해 암호 모듈 설계 및 구현을 진행하였습니다. ECC를 확장하여 ECDSA 알고리즘(SHA-256)을 기반으로 전자서명 가능한 암호 모듈을 설계하는 것을 목표로 하였습니다.

  • 보안요구사항을 만족하도록 암호 모듈 설계
  • 사용되는 보호 함수를 구현하고 암호 알고리즘부와 모듈부를 나누어서 구현
  • 설계 내용을 기반으로 기본 및 상세설계서 작성

암호 모듈 설계 및 구현 프로젝트는 가장 어려웠던 프로젝트였지만, 학교에서 펜타 인턴들을 대상으로 관련 교육을 진행해 주었고 팀장님께서 많은 가이드를 주시면서 열심히 배워나갈 수 있었습니다.

4. PQC 알고리즘 분석

NIST PQC Round 3 기준으로 공개키 암호(PKE)를 기반으로 하는 키 교환(KEM) 알고리즘인 CRYSTALS-Kyber 알고리즘을 분석하고 보고서를 작성하였습니다. 이를 위해 아래와 같이 세분화하여 분석을 진행하였습니다.

  • 격자란 무엇인지
  • 격자 기반 암호
  • CRYSTALS-Kyber PKE/KEM 알고리즘 분석

이렇게 말씀드리니 양자내성 암호를 어느 정도 이해하고 시작하였겠구나 싶으시겠지만.. 전 <PQC = 양자내성암호> 밖에 모르는 상태로 처음 PQC 알고리즘을 분석하게 되었습니다. 암호모듈 구현과 함께 고되었던 프로젝트였죠.

처음에는 그래서 양자내성 암호를 왜 연구해야 하는지, 격자가 무엇인지 등 격자의 세계관(?)에 대해 알아가는 데만 약 2주를 소요했습니다(정작 메인 알고리즘은 구경도 못 한 채로..)

그래도 주어진 시간 대비 격자에 많은 시간을 소요했지만, 알고리즘 자체를 이해하는 데 많은 도움이 되었습니다. 무엇보다 앞에서 공개키 암호를 공부했던 내용들이 CRYSTALS-Kyber의 KEM 전체 구조 이해하는 데에도 도움이 되었습니다. 예상보다 오랜 시간이 소요되었지만, 단계별로 해결해 나가면서 힘들더라도 더 큰 성취감을 느낄 수 있었던 순간이었습니다.

아프니까 인턴이ㄷr

네. 제 인턴 한 줄 소감을 정리하자면 그렇습니다.

처음에 인턴을 시작하면서 지금까지 돌아보면서 정리하면 좋았던 점도 많았지고 개선하면 좋았을 아쉬운 점들도 남네요.

처음에는

‘내 역량이 100이라면 목표치를 200으로 설정하자, 그러면 억지로라도 200 언저리까지는 끌어올릴 수 있을 거야!’

라는 기조로 과한 목표를 가지고 시작했던..

폭주하는 인턴을 바라보는 주변 사람들
  • 할 수 없는 것과 하지 않는 것의 구별

스스로 노력해서 나아갈 수 있는 해결해 나갈 수 있는 것들과 통제할 수 없는(한정적인 시간 등) 요소로부터 할 수 없는 것에 대한 구별이 어려웠습니다.

그렇게 과한 목표는 빠르게 지치도록­하는 요인으로 작용했죠.

결국, 목표했던 모든 프로젝트를 완벽하게 수행해 내지 못했습니다.

물론 큰 목표를 설정하는 것은 앞으로 발전하는 데에 있어 중요한 요소이겠지 요. 그러나, 무조건적으로 과하게 높은 목표를 설정하는 것보다 현재 주어진 상황과 나 자신에 대한 객관화가 함께 뒷받침 되어야 함을 깨달았습니다. 그래야만 업무에 있어서 더 탄력을 받을 수 있음을 절감했습니다.

  • 나무가 아닌 숲을 보며

단순히 공개키 암호를 구현하고, 암호 모듈을 설계하고 알고리즘을 분석하는 것이 아닌.. 이 프로젝트를 하는 본질적인 이유와 나아가 인턴십이 끝나고 어떻게 작용할 수 있을지까지 깊은 고민을 하지 않았습니다.

그저 당장 앞에 놓인 미션을 수행하는 데 급급했죠. 그래서, 프로젝트 중간에 이러한 문제점을 깨닫고 잠시 모든 업무를 중단한 적이 있습니다.

이후, 손으로 써 내려가면서 내가 이 일을 왜 하는지를 다시 정리해 보았습니다. ‘암호 모듈’과 ‘양자내성암호’가 등장하게 된 배경도 정리하고 관련 동향도 분석하며 중요성을 이해하는 과정을 거쳤습니다. CR팀의 정식 직원으로 전환이 된다면 이 프로젝트를 어떻게 적용할 수 있을지도 함께 고민하였습니다. 이렇게 지금 하는 일의 방향성과 목적을 정립하니 열심히 배워나가야겠다는 동기부여가 되었습니다.

비단 이번 프로젝트뿐 아니라, 앞으로 맡은 일에 있어 기계적으로 수행하는 것이 아닌 장기적으로 어떻게 사용될 수 있는지를 이해하는 것이 중요한 원동력임을 알 수 있었습니다.

  • 기록하는 습관

새로운 프로젝트와 공부량이 쌓여가면서 기록의 중요성을 다시 한번 깨달았습니다. 분석한 내용이 정리되지 않으니 다음 파트를 진행하는 데에도 어려움이 생겼고, 나중에는 처음부터 다시 분석하는 결과도 초래하였습니다. 물론 해당 프로젝트가 익숙하지 않아서도 있었겠지만요.

제가 분석한 내용을 잘 문서화하게 되면, 이 문서로 정리하는 과정을 통해 다시 한번 이해할 수 있었습니다. 나중에 이 프로젝트 자료가 또 다음 업무를 진행할 때 나만의 참고 자료가 될 수 있도록요.

수많은 시행착오를 거치고 힘든 부분도 많았습니다.

그럼에도 불구하고 이처럼 다양한 오류를 직면하면서 문제를 해결해 나가는 과정을 통해 발생 가능한 오류 케이스를 파악하고 해결 방법을 찾아나가는 능력을 기를 수 있었습니다. 그렇게 하나씩 배워나가는 것이 인턴이니까요.

전지적 인턴 시점

본교 펜타관에서 근무를 하다가 본사로 자리를 배정받았을 때는 또 다른 느낌이었습니다. 회사 인턴이지만 정직원은 아닌, 그러니까 소속은 되어있지만 완전한(?) 소속이 아닌 그 어딘가의 상태였죠.

그러다 보니 회사를 더 객관적인 시각으로 바라볼 수 있었습니다.

프로젝트를 진행하면서 어려운 점들도 많았지만, 혼자 힘으로 해결해 내기 어려운 문제를 직면할 때 시간을 할애해 주면서 항상 열정적으로 알려주시는 팀원분들을 보면서 이 인턴십에 참여하길 잘 했다는 생각이 들었습니다.

개인 프로젝트 외에도 사내에서 진행하는 개발자 컨퍼런스와 아이사인개발부 부서 회의(아이유, 아이사인개발부의 유익한 시간)에 참여하면서 다른 부서 및 팀들이 진행하는 실무에 대해 소개받고 지난 1년에 대해 회고하는 시간을 가졌습니다. 이 시간을 통해 저도 제 분야에 대해 전문성을 가지고 열정적으로 살고 싶다고 생각하는 계기가 되었던 것 같습니다.

맺음글

인턴십 프로젝트는 분명 쉽지 않은 여정이었습니다.

그렇지만 그 여정을 함께해 주신 팀원분들과 교수님, 선배님들 덕분에 헤쳐 나갈 수 있던 값진 시간이었던 것 같습니다.

어느덧 인턴의 마지막 달이 다가왔네요.

펜타시큐리티 인턴을 시작하는 2기 국민대 학생들 또는 다른 시작을 준비하시는 분들에게 작게나마 도움이 되었으면 하는 바람입니다.

읽어주셔서 감사합니다.

--

--