트랙
/
Cairo
Cairo
/
연습 문제
/
암호학자
암호학자

암호학자

학습 연습 문제

소개

Cairo에서 만나게 될 핵심 개념 중 하나는 felt252 타입이에요. 필드 원소라고도 하죠. 이 타입은 큰 소수 $P$로 정의되는 특정 범위 안의 정수를 나타내요. 이 연습 문제에서는 felt252 타입만 다루게 되는데, 이 타입은 Cairo 프로그래밍에서 꼭 필요한 부분이에요.

Cairo의 felt252 타입은 0부터 $P - 1$까지의 정수를 나타내는 스칼라 타입이에요. 여기서 $P$는 현재 $( 2^{251} + 17 \cdot 2^{192} + 1 )$로 정해져 있는 큰 소수예요. 이 타입은 모든 산술 연산이 $P$에 대한 나머지 연산으로 이뤄지도록 해요. 그래서 다른 프로그래밍 언어에서 볼 수 있는 일반적인 정수 타입과는 달라요.

Cairo는 felt252 값에 대한 기본 산술 연산을 지원해요:

  • 덧셈(+): 두 felt252 값을 더해요. 결과가 $P$를 넘으면 $P$로 나눈 나머지로 줄어요.
  • 뺄셈(-): 한 felt252 값에서 다른 값을 빼요. 결과가 음수면 $P$의 배수를 더해 범위 안에 머물도록 조정해요.
  • 곱셈(*): 두 felt252 값을 곱하고, 결과는 $P$에 대한 나머지로 계산해요.
  • 나눗셈(/): 한 felt252 값을 다른 값으로 나눠서, 결과가 방정식 $( \frac{x}{y} \cdot y = x \mod P)$을 만족하도록 해요.

지침

이 연습 문제에서는 암호학자를 도와 보안 통신 시스템을 관리하고 검증하는 일을 맡아요. 이 시스템은 모든 산술 연산이 정해진 범위 안에 머물도록 하기 위해 필드 원소, 특히 Cairo의 felt252 타입에 크게 의존해요.

1. 두 메시지의 합 계산하기

각각 felt252로 표현되는 두 개의 암호화된 메시지를 더해 하나의 결합된 메시지를 만들어야 해요. 다만 암호화 때문에, 최댓값 $P - 1$을 초과하는 결과는 모듈로 $P$를 이용해 범위 안으로 되돌려야 해요.

felt252 값 두 개를 받아 그 합을 반환하고, 결과가 유효한 범위 안에 머물도록 하는 함수를 구현해요:

add_messages(3618502788666131213697322783095070105623107215331596699973092056135007822949, 987654321)
// => 123456789

참고: 반환 값은 felt252여야 해요.

2. 두 메시지의 차이 계산하기

때로는 원래 데이터를 되찾기 위해 메시지를 빼야 할 때가 있어요. 뺄셈 결과가 음수이면, 시스템이 자동으로 결과에 $P$를 더해 유효한 felt252 값의 범위 안으로 되돌려요.

felt252 값 두 개를 받아 그 차를 반환하고, 결과가 유효한 범위 안에 머물도록 하는 함수를 구현해요:

subtract_messages(123456789, 987654321)
// => 3618502788666131213697322783095070105623107215331596699973092056135007822949

참고: 반환 값은 felt252여야 해요.

3. 두 메시지의 유효한 곱 계산하기

암호화된 데이터의 무결성을 보장하기 위해, 암호 시스템은 두 메시지(felt252)를 곱해 그 곱이 유효한 범위 안에 머물도록 하는 경우가 많아요. 결과는 유효한 범위를 벗어나지 않도록 모듈로 $P$로 계산해야 해요.

felt252 값 두 개를 받아 그 곱을 반환하고, 결과가 유효한 범위 안에 머물도록 하는 함수를 구현해요:

multiply_messages(382927772233671078546147897004315551461400594453673204174697055647611, 9449570)
// => 123456789

참고: 반환 값은 felt252여야 해요.

GitHub에서 편집 링크가 새 창이나 탭에서 열려요
Cairo Exercism

암호학자 문제를 시작해 볼 준비가 됐나요?

Exercism에 가입하고 Cairo 트랙을 개념 25개연습 문제 68개, 그리고 실제 사람의 멘토링과 함께 배우고 익혀 보세요. 모두 무료예요.