OpenSSL密码库算法笔记——第 3.2.3章 利用Montgomery约化实现

现在我们来看看Montgomery乘法。简单来说,Montgomey乘法就是将经典乘法(见§1.2.1)和Montgomery约化(见§2.3)结合起来(可以参见[10,算法14.36])。

下面来简要介绍一下其算法思想。

和Montgomery约化一样,首先取一个正整数R > m,满足gcd(R,m)=1,通常取R=B^{k}以简化计算。给定要做乘法的两个数x和y,0\leqslant x,y<m,记

{\tilde{x}}=xRmodm{\tilde{y}}=yRmodm。                 …………(3.1)

{\tilde{x}}{\tilde{y}}的Montgomery约化是{\tilde{x}}{\tilde{y}}R^{-1}modm,等价于xyRmodm

为了便于理解,举个例子简单解释一下。假设要计算x^{5}modm1\leqslant =x<m。首先,需要计算{\tilde{x}}=xRmodm。然后,计算{\tilde{x}}{\tilde{x}}的Montgomery约化,即A={\tilde{x}}^{2}R^{-1}modm。接着,A^{2}的Montgomery约化是A^{2}R^{-1}modm=\tilde{x}^{4}R^{-3}modm。最后,(A^{2}R^{-1}modm)\tilde{x}的Montgomery约化是(A^{2}R^{-1})\tilde{x}R^{-1}modm=\tilde{x}^{5}R^{-4}mod m=x^{5}Rmodm。乘以R^{-1}modm再模去m即得到x^{5}modm

整数x要转化成Montgomery数需要计算{\tilde{x}}=xRmodm。在做Montgomery乘法前,所有输入和常数都应该转化成Montgomery数。事后,即做完所有的乘法后,再转化到整数,即乘以R^{-1}modm再模去m。因此,先来说明下Montgomery数与普通大整数之间的转换。将整数x映射成Montgomery整数需要计算{\tilde{x}}=xRmodm,即计算(x modm)(R^{2}modm)的Montgomery约化\tilde{x}=xR^{2}R^{-1} mod m=xRmodm

───────────────────────────────────────

#define BN_to_montgomery(BIGNUM *r, const BIGNUM *a, BN_MONT_CTX *mont)

功能:    将大数映射成Montgomery整数

输入:    a【大数】,mont【Montgomery模数】

输出:    r ← a×R mod mont

返回:    1【正常】 or 0【出错】

出处:    bn.h

备注:    宏定义。#define BN_to_montgomery(r,a,mont,ctx)\

               BN_mod_mul_montgomery((r),(a),&((mont)->RR),(mont))

───────────────────────────────────────

特殊地,当大整数退化为一个字时,将字映射成Montgomery整数的函数如下:

───────────────────────────────────────

#define BN_TO_MONTGOMERY_WORD(BIGNUM *r, BIGNUM *w, BN_MONT_CTX * mont)

功能:    将字映射成Montgomery整数

输入:    w【字】,mont【Montgomery模数】

输出:    r ← w×R mod mont

返回:    1【正常】 or 0【出错】

出处:    bn_exp.c

备注:    宏定义。

───────────────────────────────────────

将Montgomery整数{\tilde{x}}返回成普通整数,需要计算{\tilde{x}}R^{-1}modm,即做的Montgomery约化。

───────────────────────────────────────

int BN_from_montgomery(BIGNUM *ret, const BIGNUM *a, BN_MONT_CTX *mont, BN_CTX *ctx)

功能:    将Montgomery整数返回成普通整数

输入:    a【被模数】,mont【Montgomery模数】,ctx【临时变量】

输出:    ret ← a/R mod mont

返回:    1【正常】 or 0【出错】

出处:    bn_mont.c

───────────────────────────────────────

有了普通大整数与Montgomery数之间的转换,接下来该看看大家关心的Montgomery乘法了。

───────────────────────────────────────

int BN_mod_mul_montgomery(BIGNUM *r, const BIGNUM *a, const BIGNUM *b, BN_MONT_CTX *mont)

功能:    利用Montgomery约化做模乘

输入:    a【被乘数】,b【乘数】,mont【Montgomery模数】

输出:    r ← a×b mod mont

返回:    1【正常】 or 0【出错】

出处:    bn_mont.c

───────────────────────────────────────

        注意:这个Montgomery乘法其实是包含了模平方在内的。在函数体内部会判断a与b是否相等,如果a=b则先做平方再做Montgomery约化,否则,先做乘法再做Montgomery约化。

你可能感兴趣的:(openssl,密码技术与应用)