差值 inverse(), Python 中的 %

difference inverse(), % in python

提问人:howl 提问时间:11/17/2023 更新时间:11/17/2023 访问量:58

问:

我不知道 python 中 inverse() 和 % 的区别。例如,,结果是一样的,不是吗?(Inverse() 是属于 Crypto.Util.number 的函数。inverse(a, q)a%q

如果你能告诉我其中的区别,我将不胜感激。

Python 密码学 逆向

评论


答:

1赞 mozway 11/17/2023 #1

不,这显然是不一样的。

123%45
# 33

inverse(123, 45)
# 41

你可以检查 inverse源代码(python 2 代码):

def inverse(u, v):
    """inverse(u:long, v:long):long
    Return the inverse of u mod v.
    """
    u3, v3 = long(u), long(v)  # python 3: u3, v3 = u, v
    u1, v1 = 1L, 0L            #           u1, v1 = 1, 0
    while v3 > 0:
        q=divmod(u3, v3)[0]
        u1, v1 = v1, u1 - v1*q
        u3, v3 = v3, u3 - v3*q
    while u1<0:
        u1 = u1 + v
    return u1

如果你在最近的替换库 pycrytodome 的源代码中检查等效函数,就会有一个明确的解释,即这是在计算多项式最大公约数

    def inverse(self):
        """Return the inverse of this element in GF(2^128)."""

        # We use the Extended GCD algorithm
        # http://en.wikipedia.org/wiki/Polynomial_greatest_common_divisor

        if self._value == 0:
            raise ValueError("Inversion of zero")

        r0, r1 = self._value, self.irr_poly
        s0, s1 = 1, 0
        while r1 > 0:
            q = _div_gf2(r0, r1)[0]
            r0, r1 = r1, r0 ^ _mult_gf2(q, r1)
            s0, s1 = s1, s0 ^ _mult_gf2(q, s1)
        return _Element(s0)

评论

0赞 howl 11/17/2023
我试图按照你告诉我的那样实现它来检查它,但有一个错误。错误是 1L、0L 中的“无效十进制文字”。1L和0L是什么意思?
0赞 mozway 11/17/2023
@howl正如我在回答中所评论的那样,这是 Python 2 代码,这是使用代码中导入的兼容性工具实现的。否则,python 3 中的语法无效。 在 Python 2 中表示,这在 Python 3 中不存在,因为整数可以具有任意长度。您应该能够删除并“转换”到 python 3。1LlonglongL
0赞 President James K. Polk 11/17/2023
第二种算法不能替代第一种算法。第一个是专门针对整数的。第二种算法是针对多项式逆的,正如它所说。两者都基于扩展的欧几里得算法。在现代 python(从 3.8 版开始)中,可以使用内置的 pow() 函数来计算逆向。请参阅 github.com/Legrandin/pycryptodome/blob/...