本文介绍了密码学中的二次剩余和三次剩余问题。二次剩余问题是寻找满足 x² ≡ a (mod p) 的 x 值,如果存在这样的 x,则 a 是模 p 的二次剩余。三次剩余问题类似,寻找满足 x³ ≡ a (mod p) 的 x 值。文章给出了判断是否存在解的方法,并提供了在线工具和代码示例。
在密码学中,我们寻找难以解决的问题。为此,我们可以创建后门来解决它。对于离散对数,我们使用以下难题:
$Y=g^x \pmod p$
即使我们知道 $g$、$Y$ 和 $p$,也很难确定 $x$,只要素数足够大。RSA 公钥方法中使用了另一个难题,它涉及模数 ($N$) 分解的难度,模数由两个素数组成。
另一个难题是模 $n$ 的二次剩余,它使用以下形式:
$x^2 \equiv a \pmod p$
我们必须找到一个 $x$ 值,该值产生 $a \pmod p$ 的值。如果存在解,则值 $a$ 是 二次剩余 (mod n)。同样,我们可以有三次剩余:
$x^3 \equiv a \pmod p$
我们需要找到是否存在可能的解决方案。
在模运算中,此运算等效于一个数的平方根(其中 $x$ 是 $a$ 模 $p$ 的模平方根)。在下文中,我们将尝试找到 $x$ 的值,并生成勒让德符号值。
例如,如果 $a = 968$ 且 $p = 1223$,则得到:
求解 $x^2 \equiv 968 \pmod {1223}$ [答案: 453] 尝试!
另一个例子:
求解 $x^2 \equiv 1203 \pmod {1223}$ [答案: 375] 尝试!
因此,968 和 1203 是模 1223 的二次剩余。
$x^2 \equiv a \pmod p$ 的形式并非总是可解的。例如,如果 $a = 209$ 且 $p = 1223$,则得到:
$x^2 \equiv 209 \pmod {1223}$
没有解决方案。此外,如果 $a$ 与 $p$ 共享一个因子,则也是不可解的。例如:
$x^2 \equiv 39 \pmod {13}$
将为 $x$ 返回零值。
如果我们取 $p = 53$ 的值,我们将得到以下值 [这里]:
0, 1, 4, 6, 7, 9, 10, 11, 13, 15, 16, 17, 24, 25, 28, 29, 36, 37, 38, 40, 42, 43, 44, 46, 47, 49, 52
代码的示例运行如下:
Quadradic residue (mod n) solver
a: 47
p: 53We need to solve for:
val^2 = 47 (mod 53 )
-----------------------
Result: 10
( 10 )^2 = 47 (mod 53 )-----------------------
For a prime number of 53 here are the residues up to p (or 100)
1 4 6 7 9 10 11 13 15 16 17 24 25 28 29 36 37 38 40 42 43 44 46 47 49 52
在这种情况下,我们看到 10 是 $p$ 为 53 的可能的二次剩余。因此,解决方案是:
$10^2 \equiv 47 \pmod {53}$
你可以在这里 看到演示,以下是一些示例:
如果我们有 $x^3 \equiv a \pmod p$ 的形式,我们必须找到一个 $x$ 值,该值产生 $a \pmod p$ 的值。实际上,这是一个难以解决的问题。如果存在解,则值 $a$ 是 立方剩余 (mod p)。在模运算中,此运算等效于一个数的平方根(其中 $x$ 是 $a$ 模 $p$ 的模立方根)。在这种情况下,我们将确定是否存在立方根,然后,如果可能,找到一个解。对于解,我们测试 $a^{ ( p −1)/ gcd(3, p −1)} \equiv 1 \pmod p$。
对于三次剩余,我们有 $x$ 的解:

为此,如果满足以下条件,我们有一个解决方案:

对于 $x^k = a \pmod p$

如果素数 ($p$) 是:

那么解决方案是:

例如,是否有以下解决方案:

为此,我们得到:

我们看到我们有一个解决方案:

以下是一些示例:
代码如下:
import sys
import random
import libnum
import math
p=11
a=25
if (len(sys.argv)>1):
a=int(sys.argv[1])
if (len(sys.argv)>2):
p=int(sys.argv[2])
print ("p=",p)
print ("a=",a)
print ("\n\nFind solution to x^3 = a (mod p)")
## 查找 x^3 = a (mod p) 的解
if (pow(a,(p-1)//math.gcd(3,p-1),p)):
print(f"对于 x^3={a} (mod {p}),存在立方根的解")
if (p%3==2):
sol = pow(a,(2*p-1)//3,p)
print(f" The solution is {sol}^3 (mod {p}) = {a}")
else:
print(f"对于 x^3={a} (mod {p}),不存在立方根的解")
一个示例运行是:
p= 11
a= 25
Find solution to x^3 = a (mod p)
对于 x^3=25 (mod 11),存在立方根的解
The solution is 9^3 (mod 11) = 25
- 原文链接: medium.com/asecuritysite...
- 登链社区 AI 助手,为大家转译优秀英文文章,如有翻译不通的地方,还请包涵~
如果觉得我的文章对您有用,请随意打赏。你的支持将鼓励我继续创作!