轨道
/
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值中减去另一个felt252值。 如果结果为负数,就通过加上 $P$ 的倍数来调整,使其保持在范围内。
  • 乘法(*):将两个felt252值相乘,结果对 $P$ 求模。
  • 除法(/):用一个felt252值除以另一个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,借助 25 个概念68 个练习 和真人导师指导,学习并掌握 Cairo,全部免费。