如何計算\(R^2\mod N\)?

使用Montgomery模乘

發佈於2020年5月30日 -

爲了使用Montgomery模乘,我們需要知道 \(R^2\mod N\),如果手裏已經有了Montgomery模乘,能避免硬算嗎?

答案是能。

首先簡要回顧一下Montgomery模乘:

我們以256比特爲例,記 \(N\) 爲需要取模的數,取 \(R=2^{256}\),則Montgomery模乘爲 \(M(A, B) = A \times B / R \mod N\)。

那麼如何利用Montgomery模乘來計算 \(R^2\mod N\)呢?來看個例子:

令 \(m = 2^{256} - 1 \mod N, m_1 = m + m + 2 \mod N = 2 \times 2^{256} \mod N\),則有

\(m_2 = M(m_1, m_1) = 2^{2} \times 2^{256} \mod N\)

\(m_4 = M(m_2, m_2) = 2^{4} \times 2^{256} \mod N\)

\(m_8 = M(m_4, m_4) = 2^{8} \times 2^{256} \mod N\)

\(\dots\)

\(m_{256} = M(m_{128}, m_{128}) = 2^{256} \times 2^{256} \mod N = R^2 \mod N\)

所以,爲了計算 \(n\)比特(假設 \(n\)是2的冪)的數 \(N\)對應的 \(R^2 \mod N\),我們可以這樣做:

  1. 計算 \(2^n-1\)與 \(1\)的模加,記結果爲 \(a\)
  2. 計算 \(a+a\)的模加,記結果爲 \(m_1\)
  3. 計算 \(m_i\)與\(m_i\)的Montgomery模乘,記結果爲 \(m_{2i}\),重複 \(\log_2n\)次

總的操作次數是:2次加法和 \(\log_2n\)次乘法。