AI Sparkup

복잡한 AI 세상을 읽는 힘 ⚡

Claude Code가 암호화 버그 3개를 원샷으로 찾다: 암호학 전문가의 실험

암호학 전문가 Filippo Valsorda는 4일간의 라이브 코딩 끝에 새로운 양자 내성 서명 알고리즘 ML-DSA의 Go 구현을 완성했습니다. 그런데 검증(Verify) 함수가 계속 실패했죠. 피곤에 지친 그는 30분 디버깅 후 포기했습니다. 다음 날 다시 시도하려던 참이었어요.

Clippy가 버그를 알려주는 이미지
출처: Filippo Valsorda’s blog

그런데 문득 Claude Code에게 한번 맡겨보기로 했습니다. 크게 기대하지 않았죠. “재미있게 실패하거나, 몇 가지 가능성을 배제해주면 좋겠다” 정도였습니다. 결과는 예상 밖이었습니다. Claude는 몇 분 만에 복잡한 저수준 버그를 정확히 찾아냈어요.

첫 번째 버그: 이중으로 계산된 high bits

Filippo가 Claude Code에게 준 프롬프트는 간단했습니다. “ML-DSA를 구현했는데 검증이 계속 실패한다. 서명은 테스트 벡터와 일치해서 맞는 게 확실하다. 이유를 찾아줘.”

Claude는 코드를 읽더니 바로 문제를 찾아냈습니다. Sign 함수에서 사용하려고 HighBitsw1Encode 함수를 하나로 합쳤는데, Verify 함수에서 이걸 재사용하면서 문제가 생긴 거였죠. Verify에서는 UseHint가 이미 high bits를 만들어주는데, w1Encode가 또 한 번 high bits를 계산해버린 겁니다. High bits를 두 번 계산한 셈이에요.

흥미로운 건 Claude가 탐색 과정 없이 코드를 로드하자마자 바로 답을 찾았다는 점입니다. 그 뒤 자체 테스트를 작성해 가설을 확인하고, 수정안을 만들어 테스트가 통과하는지 확인했죠.

Filippo는 Claude가 제안한 수정안을 버리고 더 깔끔하게 리팩토링했지만, 버그를 찾는 데 1-2시간을 아낀 건 확실했습니다.

검증 실험: 과거 버그를 재현하다

“이건 우연일까?” Filippo는 궁금해졌습니다. 사실 Sign 함수를 구현할 때도 버그가 두 개 있었거든요. 며칠에 걸쳐 고생하며 고쳤던 버그들이죠.

첫 번째는 Montgomery 도메인의 상수(1과 -1)를 잘못 계산한 버그였습니다. 깊은 디버깅과 추측이 필요했고, 1-2시간이 걸렸어요. 두 번째는 비교적 쉬운 버그였죠. 서명에 인코딩되는 값이 32바이트가 아니라 32비트로 너무 짧았던 겁니다.

그는 Git 히스토리를 되돌려 버그가 있던 버전을 체크아웃하고, 새 Claude Code 세션을 시작했습니다. “Sign을 방금 구현했는데 테스트가 무한 루프에 빠지는 것 같다. 왜 그런지 찾아서 테스트를 통과시켜줘.”

Claude는 printf 디버깅을 하며 잘못된 값을 추적했습니다. Filippo가 했던 방식과 비슷하게요. 그리고 잘못된 상수를 찾아내고 고쳤습니다. 확실히 Filippo보다 빨랐어요.

두 번째 버그에는 새 세션을 시작했습니다. (잘못된 상수에 대한 컨텍스트가 독립적인 버그 조사에 방해될 거라 판단해서요) “Sign을 구현했는데 테스트 벡터와 일치하지 않는다. 뭐가 문제인지 찾아줘.”

Claude는 몇 가지 잘못된 경로를 탐색하고, 꽤 오래 생각한 뒤 이 버그도 찾아냈습니다. Filippo는 솔직히 실패할 거라 예상했다고 하더군요.

3전 3승의 의미

추가 도움 없이 3개의 버그를 모두 원샷으로 찾아낸 건 “극도로 인상적”이라고 Filippo는 평가합니다. 여기서 중요한 건, LLM의 출력을 신뢰하거나 검토할 필요가 없다는 점이에요. LLM의 역할은 버그 위치를 알려주는 것뿐이고, 실제로 추론하고 고치는 건 개발자가 하니까요. 1-2시간을 절약하는 도구로는 충분합니다.

흥미롭게도 Claude는 “더 쉬운” 두 번째 버그를 더 어려워했습니다. Filippo의 추측으로는 실패한 테스트의 크고 무작위해 보이는 출력이 attention 메커니즘과 잘 맞지 않았던 것 같다고 하네요.

Filippo는 이런 제안도 덧붙입니다. “테스트가 실패할 때마다 자동으로 LLM 에이전트가 돌아가서 이유를 찾고, 개발자보다 먼저 찾으면 알려주는 도구가 있으면 얼마나 좋을까?” 챗이나 자동완성, PR 생성이 아닌, 더 나은 형태의 LLM 도구가 필요하다는 얘기죠.

AI 코딩 도구에 회의적이던 개발자라면, 이 사례는 한 번쯤 생각해볼 만합니다. 복잡한 저수준 암호화 버그까지 찾는 AI가, 여러분의 일상적인 디버깅에는 얼마나 도움이 될까요?

참고자료: Claude Code Can Debug Low-level Cryptography


AI Sparkup 구독하기

최신 게시물 요약과 더 심층적인 정보를 이메일로 받아 보세요! (무료)

Comments

답글 남기기

이메일 주소는 공개되지 않습니다. 필수 필드는 *로 표시됩니다