【问题标题】:Inverse within a finite field有限域内的逆
【发布时间】:2014-08-14 10:31:55
【问题描述】:

我正在阅读一本关于密码学的书(我尝试将这些术语从西班牙语翻译成英语),但我不明白如何计算 该字段内的倒数(最初问题使用术语“body”而不是“field”,因为这是西班牙语或德语等语言的直译)。

通过纯抽取使用单字母替代加密:

  • 等价物:
  • 词:加密的字母
  • a:抽取常数
  • Mi:消息未加密
  • mod:模块操作(我们得到余数)
  • n:加密字母表中的字母数
  • 西班牙语字母表:ABCDEFGHIJKLMNÑOPQRSTUVWZXY

· 加密: Ci = a* Mi mod n 例如 --> 我们将用 a=20 和西班牙字母 (n=27) 加密字母 C(C 是位置 2,从 0 开始) --> Ci = 20*C mod 27 = 20*2 mod 27 = 13 => N

· 解密:a^(-1) * Ci mod n

问题来了

a^(-1) 是主体 n 中抽取因子的倒数;换句话说:逆(a,n)。我用谷歌搜索并尝试进行一些计算,但我没有得到正确的结果---> inverse(a, n) = inverse(20, 27) = 16 (并且 gcd 是有效的)。

例如:

22^(-1) * 13 mod 27 != 16

【问题讨论】:

  • 当时是 22,27,但可以:D。完美的。但我不明白为什么当我在 Python、C#... "(22^(-1)) % 27" 中执行时,结果不是 16,但在 Wolfram Alpha 中是:wolframalpha.com/input/?i=22^%28-1 %29+mod+27 有什么想法?
  • 使用 ^ 会导致问题。在那些编程语言中,它意味着别的东西,Wolfram Alpha 可能会以第三种方式解释 ^-1。
  • 在素数域中求逆的最简单方法(如果您没有专门的函数)是计算x^(p-2) mod p。在 C# 中,您将使用 BigInteger.ModPow(x, p - 2, p)
  • 虽然有些字段的顺序为 3^3=27,但它们不是使用模运算实现的。所以你工作的只是一个环而不是一个领域。另请注意,只有 GCD(x,modals)=1 的元素才会有逆。例如没有 3 mod 27 的倒数。

标签: math cryptography


【解决方案1】:

要在您的示例中找到模(乘法)逆,您必须找到 x 使得 (22 * x) % 27 == 1

有一个variety of different ways 你可以用数学方法做到这一点。请注意,一般情况下,仅当 gcd(a, n) == 1 时才存在逆。

如果您想为您的示例编写一个简单的算法,请尝试以下 Python 代码:

def inverse(a, n):
    for x in range(n):
        if (a * x) % n == 1:
            return x

这给出了:

>>> inverse(22, 27)
16

>>> inverse(20, 27)
23

正如您问题下方的 cmets 中所提到的,在现有库中为您最喜欢的编程语言计算模逆可能有更好的函数。

【讨论】:

  • 完美!但是一个问题:为什么在密码学中乘法的逆是“(a * x)mod n == 1”而不是除法?
  • 没问题!为了尝试回答您的问题,乘法和除法本质上是相同的运算:当您找到数字 a 的乘法逆元时,您所做的就是找到另一个数字 x,例如 a*x == 1。例如,如果a = 2 我们通常建议x = 1/2 作为反例。但是,我们不能在模算术中选择非整数。在您的示例中,我们仅限于从整数 0、1、2、...、25、26 中查找 x 的逆。相反,我们可以选择 x = 14,因为 2*14 = 28 = 1 mod 27,所以 14 是乘法在这种情况下是 2 的倒数。
  • *抱歉,应该这样写:我们只能从整数 0、1、2、...、25、26 中寻找 a 的倒数。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2013-04-21
  • 2023-03-30
  • 1970-01-01
  • 1970-01-01
  • 2022-07-07
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多