【发布时间】: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