Trilhas
/
Cairo
Cairo
/
Exercícios
/
Criptógrafo
Criptógrafo

Criptógrafo

Exercício de aprendizagem

Introdução

Em Cairo, um dos conceitos centrais que você vai encontrar é o tipo felt252, também conhecido como elemento de corpo. Esse tipo representa inteiros dentro de um intervalo específico definido por um número primo grande $P$. Neste exercício, você vai trabalhar exclusivamente com o tipo felt252, que é uma parte essencial da programação em Cairo.

O tipo felt252 em Cairo é um tipo escalar usado para representar inteiros de 0 até $P - 1$, onde $P$ é um número primo grande, atualmente definido como $( 2^{251} + 17 \cdot 2^{192} + 1 )$. Esse tipo garante que todas as operações aritméticas sejam realizadas módulo $P$, o que o torna diferente dos tipos de inteiro padrão que você pode encontrar em outras linguagens de programação.

Cairo oferece suporte a operações aritméticas básicas com valores felt252:

  • Adição (+): soma dois valores felt252. Se o resultado ultrapassar $P$, ele é reduzido módulo $P$.
  • Subtração (-): subtrai um valor felt252 de outro. Se o resultado for negativo, ele é ajustado para permanecer no intervalo somando um múltiplo de $P$.
  • Multiplicação (*): multiplica dois valores felt252, com o resultado calculado módulo $P$.
  • Divisão (/): divide um valor felt252 por outro, garantindo que o resultado satisfaça a equação $( \frac{x}{y} \cdot y = x \mod P)$.

Instruções

Neste exercício, você vai ajudar um criptógrafo a administrar e verificar um sistema de comunicação seguro. O sistema depende bastante de elementos de corpo, especificamente do tipo felt252 em Cairo, para garantir que todas as operações aritméticas permaneçam dentro de um intervalo definido.

1. Calcule a soma de duas mensagens

Duas mensagens criptografadas, cada uma representada por um felt252, precisam ser somadas para criar uma mensagem combinada. No entanto, por causa da criptografia, qualquer resultado que ultrapasse o valor máximo $P - 1$ precisa dar a volta usando o módulo $P$.

Implemente uma função que recebe dois valores felt252 e retorna a soma deles, garantindo que o resultado permaneça dentro do intervalo válido:

add_messages(3618502788666131213697322783095070105623107215331596699973092056135007822949, 987654321)
// => 123456789

Observação: O valor de retorno deve ser um felt252.

2. Calcule a diferença entre duas mensagens

Às vezes, mensagens precisam ser subtraídas para recuperar os dados originais. Se o resultado da subtração for negativo, o sistema ajusta o resultado automaticamente somando $P$ para trazê-lo de volta ao intervalo de um valor felt252 válido.

Implemente uma função que recebe dois valores felt252 e retorna a diferença deles, garantindo que o resultado permaneça dentro do intervalo válido:

subtract_messages(123456789, 987654321)
// => 3618502788666131213697322783095070105623107215331596699973092056135007822949

Observação: O valor de retorno deve ser um felt252.

3. Calcule um produto válido de duas mensagens

Para assegurar a integridade dos dados criptografados, o sistema criptográfico costuma multiplicar duas mensagens (felt252) para garantir que o produto delas permaneça dentro de um intervalo válido. O resultado precisa ser calculado com o módulo $P$ para garantir que permaneça dentro do intervalo válido.

Implemente uma função que recebe dois valores felt252 e retorna o produto deles, garantindo que o resultado permaneça dentro do intervalo válido:

multiply_messages(382927772233671078546147897004315551461400594453673204174697055647611, 9449570)
// => 123456789

Observação: O valor de retorno deve ser um felt252.

Editar via GitHub O link abre em uma nova janela ou aba
Cairo Exercism

Tudo pronto para começar Criptógrafo?

Crie sua conta no Exercism para aprender e dominar Cairo com 25 conceitos68 exercícios e mentoria humana de verdade, tudo de graça.